Skip to content

Commit 2c19ffc

Browse files
authored
Deserialize timeZoneName while considering known aliases. (#1200)
1 parent 976fad3 commit 2c19ffc

File tree

14 files changed

+429
-18
lines changed

14 files changed

+429
-18
lines changed

cwms-data-api/src/main/java/cwms/cda/api/LocationController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,15 @@
5959
import cwms.cda.api.errors.CdaError;
6060
import cwms.cda.api.errors.DeleteConflictException;
6161
import cwms.cda.api.errors.NotFoundException;
62+
import cwms.cda.data.dao.JooqDao;
6263
import cwms.cda.data.dao.LocationsDao;
6364
import cwms.cda.data.dao.LocationsDaoImpl;
6465
import cwms.cda.data.dto.Location;
6566
import cwms.cda.data.dto.StatusResponse;
6667
import cwms.cda.formatters.ContentType;
6768
import cwms.cda.formatters.Formats;
6869
import cwms.cda.formatters.UnsupportedFormatException;
70+
import cwms.cda.helpers.ZoneIdHelper;
6971
import io.javalin.apibuilder.CrudHandler;
7072
import io.javalin.core.util.Header;
7173
import io.javalin.http.Context;
@@ -77,7 +79,6 @@
7779
import io.javalin.plugin.openapi.annotations.OpenApiResponse;
7880
import java.io.IOException;
7981
import java.sql.SQLException;
80-
import java.time.ZoneId;
8182
import java.util.List;
8283
import java.util.logging.Level;
8384
import java.util.logging.Logger;
@@ -508,7 +509,7 @@ private Location getUpdatedLocation(Location existingLocation, Location updatedL
508509
String updatedOfficeId = updatedLocation.getOfficeId() == null
509510
? existingLocation.getOfficeId() : updatedLocation.getOfficeId();
510511
return new Location.Builder(updatedName, updatedLocationKind,
511-
ZoneId.of(updatedTimeZoneId), updatedLatitude, updatedLongitude,
512+
ZoneIdHelper.parseZoneIdWithAliases(updatedTimeZoneId), updatedLatitude, updatedLongitude,
512513
updatedHorizontalDatum, updatedOfficeId)
513514
.withActive(updatedIsActive)
514515
.withPublicName(updatedPublicName)

cwms-data-api/src/main/java/cwms/cda/data/dao/JooqDao.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424

2525
package cwms.cda.data.dao;
2626

27+
import java.io.IOException;
28+
import java.io.InputStream;
29+
import java.sql.Timestamp;
30+
import java.time.Instant;
31+
2732
import static org.jooq.SQLDialect.ORACLE;
2833

2934
import com.google.common.flogger.FluentLogger;
@@ -48,8 +53,11 @@
4853
import java.time.ZoneId;
4954
import java.util.Arrays;
5055
import java.util.Collections;
56+
import java.util.HashMap;
5157
import java.util.List;
58+
import java.util.Map;
5259
import java.util.Optional;
60+
import java.util.Properties;
5361
import java.util.regex.Matcher;
5462
import java.util.regex.Pattern;
5563
import javax.servlet.http.HttpServletResponse;
@@ -112,6 +120,7 @@ public DeleteRule getRule() {
112120
}
113121
}
114122

123+
115124
protected JooqDao(DSLContext dsl) {
116125
super(dsl);
117126
}
@@ -182,7 +191,7 @@ private static Connection setClientInfo(Context ctx, Connection connection) {
182191
try {
183192
final String apiVersion = ApiServlet.getApiVersion();
184193
connection.setClientInfo("OCSID.ECID",
185-
ApiServlet.APPLICATION_TITLE + " " +
194+
ApiServlet.APPLICATION_TITLE + " " +
186195
apiVersion.substring(0,Math.min(ORACLE_ECID_MAX_LENGTH,apiVersion.length())));
187196
if (ctx.handlerType() == HandlerType.BEFORE) {
188197
connection.setClientInfo("OCSID.MODULE", "BEFORE-HANDLER");
@@ -787,4 +796,5 @@ public static BigDecimal toBigDecimal(Number number) {
787796
public static double buildDouble(BigDecimal bigDecimal) {
788797
return (bigDecimal == null) ? 0.0 : bigDecimal.doubleValue();
789798
}
799+
790800
}

cwms-data-api/src/main/java/cwms/cda/data/dao/LocationsDaoImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import java.util.Set;
6565
import java.util.logging.Level;
6666
import java.util.logging.Logger;
67+
import cwms.cda.helpers.ZoneIdHelper;
6768
import org.geojson.Feature;
6869
import org.geojson.FeatureCollection;
6970
import org.geojson.Point;
@@ -92,6 +93,8 @@ public class LocationsDaoImpl extends JooqDao<Location> implements LocationsDao
9293
private static final Logger logger = Logger.getLogger(LocationsDaoImpl.class.getName());
9394
private static final long DELETED_TS_MARKER = 0L;
9495

96+
97+
9598
public LocationsDaoImpl(DSLContext dsl) {
9699
super(dsl);
97100
}
@@ -148,7 +151,7 @@ private Location buildLocation(Record loc) {
148151
String timeZoneName = loc.get(AV_LOC.TIME_ZONE_NAME); // may be null...
149152
ZoneId zone = null;
150153
if (timeZoneName != null) {
151-
zone = ZoneId.of(timeZoneName);
154+
zone = ZoneIdHelper.parseZoneIdWithAliases(timeZoneName);
152155
}
153156

154157
Double latDouble = null;

cwms-data-api/src/main/java/cwms/cda/data/dao/location/kind/LocationUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@
2525
package cwms.cda.data.dao.location.kind;
2626

2727
import cwms.cda.api.enums.Nation;
28+
import cwms.cda.data.dao.JooqDao;
2829
import cwms.cda.data.dto.Location;
2930
import cwms.cda.data.dto.CwmsId;
3031
import cwms.cda.data.dto.LookupType;
31-
import java.time.ZoneId;
3232
import java.util.Optional;
33+
import cwms.cda.helpers.ZoneIdHelper;
3334
import usace.cwms.db.jooq.codegen.udt.records.LOCATION_OBJ_T;
3435
import usace.cwms.db.jooq.codegen.udt.records.LOCATION_REF_T;
3536
import usace.cwms.db.jooq.codegen.udt.records.LOOKUP_TYPE_OBJ_T;
@@ -128,7 +129,7 @@ public static Location getLocation(LOCATION_OBJ_T location) {
128129
if (location != null) {
129130
retval = new Location.Builder(getLocationId(location.getLOCATION_REF()),
130131
location.getLOCATION_KIND_ID(),
131-
ZoneId.of(location.getTIME_ZONE_NAME()),
132+
ZoneIdHelper.parseZoneIdWithAliases(location.getTIME_ZONE_NAME()),
132133
buildDouble(location.getLATITUDE()),
133134
buildDouble(location.getLONGITUDE()),
134135
location.getHORIZONTAL_DATUM(),

cwms-data-api/src/main/java/cwms/cda/formatters/json/JsonV1.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.databind.ObjectMapper;
77
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
88
import com.fasterxml.jackson.databind.SerializationFeature;
9+
import com.fasterxml.jackson.databind.module.SimpleModule;
910
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
1011
import cwms.cda.data.dto.CwmsDTOBase;
1112
import cwms.cda.data.dto.Office;
@@ -14,9 +15,11 @@
1415
import cwms.cda.formatters.OfficeFormatV1;
1516
import cwms.cda.formatters.OutputFormatter;
1617
import cwms.cda.formatters.annotations.FormattableWith;
18+
import cwms.cda.formatters.json.adapters.ZoneIdDeserializer;
1719
import io.javalin.http.BadRequestResponse;
1820
import java.io.IOException;
1921
import java.io.InputStream;
22+
import java.time.ZoneId;
2023
import java.util.Arrays;
2124
import java.util.List;
2225
import java.util.stream.Collectors;
@@ -30,12 +33,8 @@ public class JsonV1 implements OutputFormatter {
3033
private final ObjectMapper om;
3134

3235
public JsonV1() {
33-
this.om = new ObjectMapper();
34-
this.om.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
35-
this.om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
36-
this.om.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
37-
this.om.disable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS);
38-
this.om.registerModule(new JavaTimeModule());
36+
this.om = buildObjectMapper();
37+
3938
}
4039

4140
@NotNull
@@ -47,6 +46,11 @@ public static ObjectMapper buildObjectMapper() {
4746
retVal.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
4847
retVal.disable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS);
4948
retVal.registerModule(new JavaTimeModule());
49+
50+
SimpleModule module = new SimpleModule();
51+
module.addDeserializer(ZoneId.class, new ZoneIdDeserializer());
52+
retVal.registerModule(module);
53+
5054
return retVal;
5155
}
5256

@@ -130,7 +134,7 @@ private Object buildFormatting(CwmsDTOBase dto) {
130134
private boolean isFormattableWith(Class<?> klass) {
131135
FormattableWith[] formats = klass.getAnnotationsByType(FormattableWith.class);
132136
for (FormattableWith format : formats) {
133-
/**
137+
/*
134138
* Compare against the actual formatter not the name
135139
*/
136140
if (format.formatter().equals(JsonV1.class)) {

cwms-data-api/src/main/java/cwms/cda/formatters/json/JsonV2.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,18 @@
3030
import com.fasterxml.jackson.databind.ObjectMapper;
3131
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
3232
import com.fasterxml.jackson.databind.SerializationFeature;
33+
import com.fasterxml.jackson.databind.module.SimpleModule;
3334
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
3435
import cwms.cda.data.dto.CwmsDTOBase;
3536
import cwms.cda.formatters.Formats;
3637
import cwms.cda.formatters.FormattingException;
3738
import cwms.cda.formatters.OutputFormatter;
39+
import cwms.cda.formatters.json.adapters.ZoneIdDeserializer;
3840
import org.jetbrains.annotations.NotNull;
3941

4042
import java.io.IOException;
4143
import java.io.InputStream;
44+
import java.time.ZoneId;
4245
import java.util.List;
4346

4447
/**
@@ -64,6 +67,11 @@ public static ObjectMapper buildObjectMapper() {
6467
retVal.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
6568
retVal.setSerializationInclusion(JsonInclude.Include.NON_NULL);
6669
retVal.registerModule(new JavaTimeModule());
70+
71+
SimpleModule module = new SimpleModule();
72+
module.addDeserializer(ZoneId.class, new ZoneIdDeserializer());
73+
retVal.registerModule(module);
74+
6775
return retVal;
6876
}
6977

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package cwms.cda.formatters.json.adapters;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.databind.DeserializationContext;
5+
import com.fasterxml.jackson.databind.JsonDeserializer;
6+
import cwms.cda.helpers.ZoneIdHelper;
7+
import java.io.IOException;
8+
import java.time.ZoneId;
9+
10+
public class ZoneIdDeserializer extends JsonDeserializer<ZoneId> {
11+
12+
@Override
13+
public ZoneId deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException {
14+
return ZoneIdHelper.parseZoneIdWithAliases(p.getValueAsString());
15+
}
16+
}

cwms-data-api/src/main/java/cwms/cda/formatters/xml/XMLv1.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.databind.DeserializationFeature;
55
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
66
import com.fasterxml.jackson.databind.SerializationFeature;
7+
import com.fasterxml.jackson.databind.module.SimpleModule;
78
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
89
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
910
import cwms.cda.data.dto.CwmsDTOBase;
@@ -12,11 +13,13 @@
1213
import cwms.cda.formatters.Formats;
1314
import cwms.cda.formatters.FormattingException;
1415
import cwms.cda.formatters.OutputFormatter;
16+
import cwms.cda.formatters.json.adapters.ZoneIdDeserializer;
1517
import io.javalin.http.InternalServerErrorResponse;
1618
import org.jetbrains.annotations.NotNull;
1719

1820
import java.io.IOException;
1921
import java.io.InputStream;
22+
import java.time.ZoneId;
2023
import java.util.Collections;
2124
import java.util.List;
2225
import java.util.logging.Level;
@@ -100,6 +103,10 @@ public <T extends CwmsDTOBase> T parseContent(InputStream content, Class<T> type
100103
retval.registerModule(new JavaTimeModule());
101104
retval.addMixIn(VerticalDatumInfo.class, VerticalDatumInfoMixin.class);
102105
retval.addMixIn(VerticalDatumInfo.Builder.class, VerticalDatumInfoMixin.Builder.class);
106+
107+
SimpleModule module = new SimpleModule();
108+
module.addDeserializer(ZoneId.class, new ZoneIdDeserializer());
109+
retval.registerModule(module);
103110
return retval;
104111
}
105112

cwms-data-api/src/main/java/cwms/cda/formatters/xml/XMLv2.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@
55
import com.fasterxml.jackson.databind.DeserializationFeature;
66
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
77
import com.fasterxml.jackson.databind.SerializationFeature;
8+
import com.fasterxml.jackson.databind.module.SimpleModule;
89
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
910
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
1011
import cwms.cda.data.dto.CwmsDTOBase;
1112
import cwms.cda.data.dto.TimeSeries;
1213
import cwms.cda.formatters.Formats;
1314
import cwms.cda.formatters.FormattingException;
1415
import cwms.cda.formatters.OutputFormatter;
16+
import cwms.cda.formatters.json.adapters.ZoneIdDeserializer;
1517
import io.javalin.http.InternalServerErrorResponse;
1618
import org.jetbrains.annotations.NotNull;
1719

1820
import java.io.IOException;
1921
import java.io.InputStream;
22+
import java.time.ZoneId;
2023
import java.util.List;
2124
import java.util.logging.Level;
2225
import java.util.logging.Logger;
@@ -90,6 +93,10 @@ public <T extends CwmsDTOBase> T parseContent(InputStream content, Class<T> type
9093
retval.setSerializationInclusion(JsonInclude.Include.NON_NULL);
9194
retval.registerModule(new JavaTimeModule());
9295
retval.addMixIn(TimeSeries.class, TimeSeriesXmlMixin.class);
96+
97+
SimpleModule module = new SimpleModule();
98+
module.addDeserializer(ZoneId.class, new ZoneIdDeserializer());
99+
retval.registerModule(module);
93100
return retval;
94101
}
95102
}

0 commit comments

Comments
 (0)