Skip to content
This repository was archived by the owner on Sep 21, 2020. It is now read-only.

Commit 3a270f7

Browse files
committed
#14 applied
#14 manually
1 parent d1a416c commit 3a270f7

9 files changed

Lines changed: 279 additions & 273 deletions

File tree

pom.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
<maven.compile.targetLevel>1.6</maven.compile.targetLevel>
2727
<maven.compile.sourceLevel>${jdkVersion}</maven.compile.sourceLevel>
2828
<api.version>1.0</api.version>
29-
<impl.version>1.0.7</impl.version>
29+
<impl.version>1.0.8</impl.version>
3030
<lib.version>1.0.2</lib.version> <!-- currently unused -->
31-
<ucum.version>0.7.1</ucum.version>
31+
<ucum.version>0.8</ucum.version>
3232
<jackson.version>2.2.2</jackson.version>
3333
<junit.version>4.12</junit.version>
3434
</properties>
@@ -91,6 +91,7 @@
9191
<target>${jdkVersion}</target>
9292
</configuration>
9393
</plugin>
94+
<!--
9495
<plugin>
9596
<groupId>org.apache.maven.plugins</groupId>
9697
<artifactId>maven-checkstyle-plugin</artifactId>
@@ -111,6 +112,7 @@
111112
<includeTestSourceDirectory>true</includeTestSourceDirectory>
112113
</configuration>
113114
</plugin>
115+
-->
114116
</plugins>
115117
<pluginManagement>
116118
<plugins>

src/main/java/com/opower/unitsofmeasure/DimensionJsonDeserializer.java

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,49 +17,48 @@
1717
*/
1818
public class DimensionJsonDeserializer extends StdScalarDeserializer<Dimension> {
1919

20-
public DimensionJsonDeserializer() {
21-
super(Dimension.class);
22-
}
20+
/**
21+
*
22+
*/
23+
private static final long serialVersionUID = 1L;
2324

24-
@Override
25-
public Dimension deserialize(JsonParser p,
26-
DeserializationContext ctxt) throws IOException,
27-
JsonProcessingException {
28-
Map<String, Integer> baseDimensionsStrings = p.readValueAs(Map.class);
29-
Map<Dimension, Integer> baseDimensions = new HashMap<>(baseDimensionsStrings
30-
.entrySet()
31-
.stream()
32-
.collect(Collectors.toMap(entry -> parseBaseDimension(entry.getKey()),
33-
entry -> entry.getValue())));
34-
Dimension retValue = QuantityDimension.NONE;
35-
for(Dimension baseDimension : baseDimensions.keySet()) {
36-
int exp = baseDimensions.get(baseDimension);
37-
retValue = retValue.multiply(baseDimension.pow(exp));
38-
}
39-
return retValue;
40-
}
25+
public DimensionJsonDeserializer() {
26+
super(Dimension.class);
27+
}
4128

42-
private static Dimension parseBaseDimension(String symbol) {
43-
switch(symbol) {
44-
case "[N]":
45-
return QuantityDimension.AMOUNT_OF_SUBSTANCE;
46-
case "[I]":
47-
return QuantityDimension.ELECTRIC_CURRENT;
48-
case "[L]":
49-
return QuantityDimension.LENGTH;
50-
case "[J]":
51-
return QuantityDimension.LUMINOUS_INTENSITY;
52-
case "[M]":
53-
return QuantityDimension.MASS;
54-
case "[\u0398]":
55-
return QuantityDimension.TEMPERATURE;
56-
case "[T]":
57-
return QuantityDimension.TIME;
58-
default:
59-
throw new IllegalArgumentException(String.format("dimension "
60-
+ "symbol '%s' not supported, maybe dimensionless or "
61-
+ "wrong universe?",
62-
symbol));
63-
}
64-
}
29+
@Override
30+
public Dimension deserialize(JsonParser p, DeserializationContext ctxt)
31+
throws IOException, JsonProcessingException {
32+
Map<String, Integer> baseDimensionsStrings = p.readValueAs(Map.class);
33+
Map<Dimension, Integer> baseDimensions = new HashMap<>(baseDimensionsStrings.entrySet().stream()
34+
.collect(Collectors.toMap(entry -> parseBaseDimension(entry.getKey()), entry -> entry.getValue())));
35+
Dimension retValue = QuantityDimension.NONE;
36+
for (Dimension baseDimension : baseDimensions.keySet()) {
37+
int exp = baseDimensions.get(baseDimension);
38+
retValue = retValue.multiply(baseDimension.pow(exp));
39+
}
40+
return retValue;
41+
}
42+
43+
private static Dimension parseBaseDimension(String symbol) {
44+
switch (symbol) {
45+
case "[N]":
46+
return QuantityDimension.AMOUNT_OF_SUBSTANCE;
47+
case "[I]":
48+
return QuantityDimension.ELECTRIC_CURRENT;
49+
case "[L]":
50+
return QuantityDimension.LENGTH;
51+
case "[J]":
52+
return QuantityDimension.LUMINOUS_INTENSITY;
53+
case "[M]":
54+
return QuantityDimension.MASS;
55+
case "[\u0398]":
56+
return QuantityDimension.TEMPERATURE;
57+
case "[T]":
58+
return QuantityDimension.TIME;
59+
default:
60+
throw new IllegalArgumentException(String.format(
61+
"dimension " + "symbol '%s' not supported, maybe dimensionless or " + "wrong universe?", symbol));
62+
}
63+
}
6564
}

src/main/java/com/opower/unitsofmeasure/DimensionJsonSerializer.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,24 @@
1313
*/
1414
public class DimensionJsonSerializer extends StdScalarSerializer<Dimension> {
1515

16-
public DimensionJsonSerializer() {
17-
super(Dimension.class);
18-
}
16+
public DimensionJsonSerializer() {
17+
super(Dimension.class);
18+
}
1919

20-
/**
21-
* Serializes a dimension by serializing it's base dimension map.
22-
*
23-
* Based on my question and answer at
24-
* https://stackoverflow.com/questions/48509189/jsr-275-dimension-string-serialization-and-deserialization
25-
* which might contain better alternatives meanwhile.
26-
*
27-
* @param value the dimension to serialize
28-
* @param gen the generator as provided by {@link JsonSerializer}
29-
* @param serializers the serializers as provided by {@link JsonSerializer}
30-
* @throws IOException if an I/O exception occurs
31-
*/
32-
@Override
33-
public void serialize(Dimension value,
34-
JsonGenerator gen,
35-
SerializerProvider serializers) throws IOException {
36-
gen.writeObject(value.getBaseDimensions());
37-
}
20+
/**
21+
* Serializes a dimension by serializing it's base dimension map.
22+
*
23+
* Based on my question and answer at
24+
* https://stackoverflow.com/questions/48509189/jsr-275-dimension-string-serialization-and-deserialization
25+
* which might contain better alternatives meanwhile.
26+
*
27+
* @param value the dimension to serialize
28+
* @param gen the generator as provided by {@link JsonSerializer}
29+
* @param serializers the serializers as provided by {@link JsonSerializer}
30+
* @throws IOException if an I/O exception occurs
31+
*/
32+
@Override
33+
public void serialize(Dimension value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
34+
gen.writeObject(value.getBaseDimensions());
35+
}
3836
}
Lines changed: 11 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,28 @@
11
package com.opower.unitsofmeasure;
22

3-
import java.io.IOException;
4-
import java.text.ParsePosition;
5-
6-
import com.fasterxml.jackson.core.JsonGenerator;
7-
import com.fasterxml.jackson.core.JsonParser;
8-
import com.fasterxml.jackson.core.JsonToken;
93
import com.fasterxml.jackson.core.Version;
10-
import com.fasterxml.jackson.databind.DeserializationContext;
11-
import com.fasterxml.jackson.databind.SerializerProvider;
12-
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
134
import com.fasterxml.jackson.databind.module.SimpleModule;
14-
import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer;
155
import javax.measure.Dimension;
166

17-
import systems.uom.ucum.format.UCUMFormat;
18-
import systems.uom.ucum.format.UCUMFormat.Variant;
19-
207
import javax.measure.Unit;
218

229
/**
23-
* Configures Jackson to (de)serialize JSR 363 Unit objects using their UCUM representation, since the actual objects don't
24-
* translate well into JSON.
10+
* Configures Jackson to (de)serialize JSR 363 Unit objects using their UCUM
11+
* representation, since the actual objects don't translate well into JSON.
2512
*/
2613
public class UnitJacksonModule extends SimpleModule {
27-
/**
14+
/**
2815
*
2916
*/
3017
private static final long serialVersionUID = 7601584599518016604L;
3118

3219
public UnitJacksonModule() {
33-
super("UnitJsonSerializationModule", new Version(1, 3, 3, null,
34-
UnitJacksonModule.class.getPackage().getName(), "jackson-module-unitsofmeasure"));
35-
36-
addSerializer(Unit.class, new UnitJsonSerializer());
37-
addSerializer(Dimension.class, new DimensionJsonSerializer());
38-
addDeserializer(Unit.class, new UnitJsonDeserializer());
39-
addDeserializer(Dimension.class, new DimensionJsonDeserializer());
40-
}
41-
42-
private class UnitJsonSerializer extends StdScalarSerializer<Unit> {
43-
protected UnitJsonSerializer() {
44-
super(Unit.class);
45-
}
46-
47-
@Override
48-
public void serialize(Unit unit, JsonGenerator jgen, SerializerProvider provider) throws IOException {
49-
if (unit == null) {
50-
jgen.writeNull();
51-
}
52-
else {
53-
// Format the unit using the UCUM representation.
54-
// The string produced for a given unit is always the same; it is not affected by the locale.
55-
// It can be used as a canonical string representation for exchanging units.
56-
String ucumFormattedUnit = UCUMFormat.getInstance(Variant.CASE_SENSITIVE).format(unit, new StringBuilder()).toString();
57-
58-
jgen.writeString(ucumFormattedUnit);
59-
}
60-
}
61-
}
62-
63-
private class UnitJsonDeserializer extends StdScalarDeserializer<Unit> {
64-
/**
65-
*
66-
*/
67-
private static final long serialVersionUID = -6327531740958676293L;
68-
69-
protected UnitJsonDeserializer() {
70-
super(Unit.class);
71-
}
72-
73-
@Override
74-
public Unit deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
75-
JsonToken currentToken = jsonParser.getCurrentToken();
76-
77-
if (currentToken == JsonToken.VALUE_STRING) {
78-
return UCUMFormat.getInstance(Variant.CASE_INSENSITIVE).parse(jsonParser.getText(), new ParsePosition(0));
79-
}
80-
throw deserializationContext.wrongTokenException(jsonParser,
81-
JsonToken.VALUE_STRING,
82-
"Expected unit value in String format");
83-
}
84-
}
20+
super("UnitJsonSerializationModule", new Version(1, 3, 5, null, UnitJacksonModule.class.getPackage().getName(),
21+
"jackson-module-unitsofmeasure"));
22+
23+
addSerializer(Unit.class, new UnitJsonSerializer());
24+
addSerializer(Dimension.class, new DimensionJsonSerializer());
25+
addDeserializer(Unit.class, new UnitJsonDeserializer());
26+
addDeserializer(Dimension.class, new DimensionJsonDeserializer());
27+
}
8528
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.opower.unitsofmeasure;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonToken;
5+
import com.fasterxml.jackson.databind.DeserializationContext;
6+
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
7+
import java.io.IOException;
8+
import java.text.ParsePosition;
9+
import javax.measure.Unit;
10+
import systems.uom.ucum.format.UCUMFormat;
11+
12+
/**
13+
*
14+
* @author richter
15+
*/
16+
public class UnitJsonDeserializer extends StdScalarDeserializer<Unit> {
17+
18+
private static final long serialVersionUID = -6327531740958676293L;
19+
20+
public UnitJsonDeserializer() {
21+
super(Unit.class);
22+
}
23+
24+
@Override
25+
public Unit deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
26+
JsonToken currentToken = jsonParser.getCurrentToken();
27+
if (currentToken == JsonToken.VALUE_STRING) {
28+
return UCUMFormat.getInstance(UCUMFormat.Variant.CASE_INSENSITIVE).parse(jsonParser.getText(), new ParsePosition(0));
29+
}
30+
throw deserializationContext.wrongTokenException(jsonParser, JsonToken.VALUE_STRING, "Expected unit value in String format");
31+
}
32+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.opower.unitsofmeasure;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.SerializerProvider;
5+
import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer;
6+
import java.io.IOException;
7+
import javax.measure.Unit;
8+
import systems.uom.ucum.format.UCUMFormat;
9+
10+
/**
11+
* @author richter
12+
* @author keilw
13+
*/
14+
@SuppressWarnings("rawtypes")
15+
public class UnitJsonSerializer extends StdScalarSerializer<Unit> {
16+
17+
public UnitJsonSerializer() {
18+
super(Unit.class);
19+
}
20+
21+
@Override
22+
public void serialize(Unit unit, JsonGenerator jgen, SerializerProvider provider) throws IOException {
23+
if (unit == null) {
24+
jgen.writeNull();
25+
} else {
26+
// Format the unit using the UCUM representation.
27+
// The string produced for a given unit is always the same; it is not affected by the locale.
28+
// It can be used as a canonical string representation for exchanging units.
29+
String ucumFormattedUnit = UCUMFormat.getInstance(UCUMFormat.Variant.CASE_SENSITIVE).format(unit, new StringBuilder()).toString();
30+
jgen.writeString(ucumFormattedUnit);
31+
}
32+
}
33+
}

src/test/java/com/opower/unitsofmeasure/DimensionJsonDeserializerTest.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,21 @@
1818
*/
1919
public class DimensionJsonDeserializerTest {
2020

21-
/**
22-
* Test of deserialize method, of class DimensionJsonDeserializer.Inspired by
23-
https://stackoverflow.com/questions/21787128/how-to-unit-test-jackson-jsonserializer-and-jsondeserializer
24-
* @throws IOException if an I/O error occurs
25-
*/
26-
@Test
27-
public void testDeserialize() throws IOException {
28-
ObjectMapper objectMapper = new ObjectMapper();
29-
InputStream stream = new ByteArrayInputStream("{\"[L]\":2,\"[T]\":1}".getBytes(StandardCharsets.UTF_8));
30-
JsonParser parser = objectMapper.getFactory().createParser(stream);
31-
DeserializationContext ctxt = objectMapper.getDeserializationContext();
32-
DimensionJsonDeserializer instance = new DimensionJsonDeserializer();
33-
Dimension expResult = QuantityDimension.LENGTH.pow(2).multiply(QuantityDimension.TIME);
34-
Dimension result = instance.deserialize(parser,
35-
ctxt);
36-
assertEquals(expResult,
37-
result);
38-
}
21+
/**
22+
* Test of deserialize method, of class DimensionJsonDeserializer.Inspired by
23+
* https://stackoverflow.com/questions/21787128/how-to-unit-test-jackson-jsonserializer-and-jsondeserializer
24+
*
25+
* @throws IOException if an I/O error occurs
26+
*/
27+
@Test
28+
public void testDeserialize() throws IOException {
29+
ObjectMapper objectMapper = new ObjectMapper();
30+
InputStream stream = new ByteArrayInputStream("{\"[L]\":2,\"[T]\":1}".getBytes(StandardCharsets.UTF_8));
31+
JsonParser parser = objectMapper.getFactory().createParser(stream);
32+
DeserializationContext ctxt = objectMapper.getDeserializationContext();
33+
DimensionJsonDeserializer instance = new DimensionJsonDeserializer();
34+
Dimension expResult = QuantityDimension.LENGTH.pow(2).multiply(QuantityDimension.TIME);
35+
Dimension result = instance.deserialize(parser, ctxt);
36+
assertEquals(expResult, result);
37+
}
3938
}

0 commit comments

Comments
 (0)