diff --git a/src/main/java/org/caosdb/datetime/DateTimeFactory2.java b/src/main/java/org/caosdb/datetime/DateTimeFactory2.java index 103359c7b4ff6f995996866e2283bab47562699c..14088ea5d1033771d8835352b61e5bf430c4ff5f 100644 --- a/src/main/java/org/caosdb/datetime/DateTimeFactory2.java +++ b/src/main/java/org/caosdb/datetime/DateTimeFactory2.java @@ -30,6 +30,11 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.caosdb.server.query.CQLParsingErrorListener; import org.caosdb.server.query.CQLParsingErrorListener.ParsingError; +/** + * Factory which parses string into CaosDB's DATETIME values. + * + * @author tf + */ public class DateTimeFactory2 implements DateTimeFactoryInterface { private Long millis = null; @@ -51,6 +56,14 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface { private Integer nanosecond = null; private TimeZone timeZone = TimeZone.getDefault(); + public DateTimeFactory2(TimeZone timeZone) { + this.timeZone = timeZone; + } + + public DateTimeFactory2() { + this(TimeZone.getDefault()); + } + @Override public void setDate(final String string) { this.date = Integer.valueOf(string); @@ -220,6 +233,16 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface { } public static DateTimeInterface valueOf(final String str) { + return valueOf(str, TimeZone.getDefault()); + } + + public static DateTimeInterface valueOf(final String str, TimeZone timeZone) { + final DateTimeFactory2 dtf = new DateTimeFactory2(timeZone); + + return dtf.parse(str); + } + + public DateTimeInterface parse(String str) { final DateTimeLexer lexer = new DateTimeLexer(CharStreams.fromString(str)); final CommonTokenStream tokens = new CommonTokenStream(lexer); @@ -230,9 +253,7 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface { final CQLParsingErrorListener el = new CQLParsingErrorListener(DateTimeLexer.UNKNOWN_CHAR); parser.addErrorListener(el); - final DateTimeFactory2 dtf = new DateTimeFactory2(); - - parser.datetime(dtf); + parser.datetime(this); if (el.hasErrors()) { final StringBuilder sb = new StringBuilder(); @@ -243,7 +264,7 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface { "Parsing DateTime finished with errors. \n" + sb.toString()); } - return dtf.getDateTime(); + return getDateTime(); } @Override diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java index 913f677f20124a602fed834ba7738941c928e89e..168b90d81e2643e7742360a79b25eb5767cf618f 100644 --- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java +++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java @@ -24,6 +24,7 @@ package org.caosdb.server.grpc; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.TimeZone; import org.caosdb.api.entity.v1.AtomicDataType; import org.caosdb.api.entity.v1.CollectionValues; import org.caosdb.api.entity.v1.DataType; @@ -72,6 +73,12 @@ import org.caosdb.server.permissions.EntityPermission; public class CaosDBToGrpcConverters { + private TimeZone timeZone; + + public CaosDBToGrpcConverters(TimeZone timeZone) { + this.timeZone = timeZone; + } + /** Get the unit as string. */ public String getStringUnit(final EntityInterface entity) { final Iterator<Property> iterator = entity.getProperties().iterator(); @@ -236,7 +243,7 @@ public class CaosDBToGrpcConverters { return builder; } - private ScalarValue.Builder convertScalarValue(final Value value) { + protected ScalarValue.Builder convertScalarValue(final Value value) { if (value instanceof BooleanValue) { return convertBooleanValue((BooleanValue) value); @@ -260,20 +267,20 @@ public class CaosDBToGrpcConverters { } else if (wrappedValue instanceof Integer) { return ScalarValue.newBuilder().setIntegerValue((Integer) wrappedValue); } else { - return convertStringValue(value); + return convertStringValue(value.toString()); } } - private org.caosdb.api.entity.v1.ScalarValue.Builder convertStringValue(final Value value) { - if (value.toString().isEmpty()) { + private org.caosdb.api.entity.v1.ScalarValue.Builder convertStringValue(final String value) { + if (value.isEmpty()) { return ScalarValue.newBuilder().setSpecialValue(SpecialValue.SPECIAL_VALUE_EMPTY_STRING); } - return ScalarValue.newBuilder().setStringValue(value.toString()); + return ScalarValue.newBuilder().setStringValue(value); } private org.caosdb.api.entity.v1.ScalarValue.Builder convertDateTimeInterface( final DateTimeInterface value) { - return convertStringValue(value); + return convertStringValue(value.toDateTimeString(timeZone)); } private org.caosdb.api.entity.v1.ScalarValue.Builder convertBooleanValue( @@ -282,7 +289,7 @@ public class CaosDBToGrpcConverters { } private ScalarValue.Builder convertReferenceValue(final ReferenceValue value) { - return convertStringValue(value); + return convertStringValue(value.toString()); } private org.caosdb.api.entity.v1.Value.Builder convertCollectionValue( diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index 8abb284782dad53a8a0c5701f653ad466dee0ece..c234e61048ba7af730dd7928d0b64ff587c005cc 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -23,6 +23,7 @@ package org.caosdb.server.grpc; import io.grpc.stub.StreamObserver; import java.util.HashMap; +import java.util.TimeZone; import java.util.UUID; import org.apache.shiro.SecurityUtils; import org.caosdb.api.entity.v1.DeleteRequest; @@ -63,7 +64,9 @@ import org.caosdb.server.utils.ServerMessages; public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBase { - private final CaosDBToGrpcConverters caosdbToGrpc = new CaosDBToGrpcConverters(); + // TODO(tf) let the clients define the time zone of the date time values which are being returned. + private final CaosDBToGrpcConverters caosdbToGrpc = + new CaosDBToGrpcConverters(TimeZone.getDefault()); private final GrpcToCaosDBConverters grpcToCaosdb = new GrpcToCaosDBConverters(); private final FileTransmissionServiceImpl fileTransmissionService; diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java new file mode 100644 index 0000000000000000000000000000000000000000..445ec01880b3468b7800ed332a45824f561b7a9c --- /dev/null +++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java @@ -0,0 +1,43 @@ +package org.caosdb.server.grpc; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.util.TimeZone; +import org.caosdb.datetime.DateTimeFactory2; +import org.caosdb.server.datatype.Value; +import org.junit.Test; + +public class CaosDBToGrpcConvertersTest { + + @Test + public void testConvertScalarValue_Datetime() { + TimeZone timeZone = TimeZone.getTimeZone("UTC"); + DateTimeFactory2 factory = new DateTimeFactory2(timeZone); + CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(timeZone); + Value value = null; + assertNull(converters.convertScalarValue(value)); + value = factory.parse("2022"); + assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022\"\n"); + value = factory.parse("2022-12"); + assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022-12\"\n"); + value = factory.parse("2022-12-24"); + assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022-12-24\"\n"); + value = factory.parse("2022-12-24T18:15:00"); + assertEquals( + converters.convertScalarValue(value).toString(), + "string_value: \"2022-12-24T18:15:00+0000\"\n"); + value = factory.parse("2022-12-24T18:15:00.999999"); + assertEquals( + converters.convertScalarValue(value).toString(), + "string_value: \"2022-12-24T18:15:00.999999+0000\"\n"); + value = factory.parse("2022-12-24T18:15:00.999999UTC"); + assertEquals( + converters.convertScalarValue(value).toString(), + "string_value: \"2022-12-24T18:15:00.999999+0000\"\n"); + value = factory.parse("2022-12-24T18:15:00.999999+0200"); + assertEquals( + converters.convertScalarValue(value).toString(), + "string_value: \"2022-12-24T16:15:00.999999+0000\"\n"); + } +}