Skip to content

Commit fc9962f

Browse files
authored
Merge pull request #162 from iredpath/RLPNC-5319-support-unfielded-addresses
RLPNC-5319: support unfielded addresses
2 parents a99ff5a + 8f98e59 commit fc9962f

File tree

20 files changed

+382
-28
lines changed

20 files changed

+382
-28
lines changed

annotations/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<parent>
2020
<groupId>com.basistech.rosette</groupId>
2121
<artifactId>rosette-api-java-binding</artifactId>
22-
<version>1.15.102-SNAPSHOT</version>
22+
<version>1.15.103-SNAPSHOT</version>
2323
</parent>
2424
<artifactId>rosette-api-annotations</artifactId>
2525
<name>rosette-api-annotations</name>

api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<parent>
2020
<groupId>com.basistech.rosette</groupId>
2121
<artifactId>rosette-api-java-binding</artifactId>
22-
<version>1.15.102-SNAPSHOT</version>
22+
<version>1.15.103-SNAPSHOT</version>
2323
</parent>
2424
<artifactId>rosette-api</artifactId>
2525
<name>rosette-api</name>

common/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<parent>
2020
<groupId>com.basistech.rosette</groupId>
2121
<artifactId>rosette-api-java-binding</artifactId>
22-
<version>1.15.102-SNAPSHOT</version>
22+
<version>1.15.103-SNAPSHOT</version>
2323
</parent>
2424
<artifactId>rosette-api-common</artifactId>
2525
<name>rosette-api-common</name>

examples/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<parent>
2121
<groupId>com.basistech.rosette</groupId>
2222
<artifactId>rosette-api-java-binding</artifactId>
23-
<version>1.15.102-SNAPSHOT</version>
23+
<version>1.15.103-SNAPSHOT</version>
2424
</parent>
2525
<groupId>com.basistech.rosette</groupId>
2626
<artifactId>rosette-api-examples</artifactId>

examples/src/main/java/com/basistech/rosette/examples/AddressSimilarityExample.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
import java.io.IOException;
2020

2121
import com.basistech.rosette.api.HttpRosetteAPI;
22-
import com.basistech.rosette.apimodel.Address;
2322
import com.basistech.rosette.apimodel.AddressSimilarityRequest;
2423
import com.basistech.rosette.apimodel.AddressSimilarityResponse;
24+
import com.basistech.rosette.apimodel.FieldedAddress;
25+
import com.basistech.rosette.apimodel.UnfieldedAddress;
2526

2627
/**
2728
* Example which demonstrates address similarity
@@ -42,24 +43,16 @@ private void run() throws IOException {
4243
String addressSimilarityCity1 = "Washington";
4344
String addressSimilarityState1 = "DC";
4445
String addressSimilarityPostcode1 = "20500";
45-
Address address1 = Address.builder()
46+
FieldedAddress address1 = FieldedAddress.builder()
4647
.houseNumber(addressSimilarityHouseno1)
4748
.road(addressSimilarityRoad1)
4849
.city(addressSimilarityCity1)
4950
.state(addressSimilarityState1)
5051
.postCode(addressSimilarityPostcode1)
5152
.build();
52-
String addressSimilarityHouseno2 = "160";
53-
String addressSimilarityRoad2 = "Pennsilvana Avenue";
54-
String addressSimilarityCity2 = "Washington";
55-
String addressSimilarityState2 = "D.C.";
56-
String addressSimilarityPostcode2 = "20500";
57-
Address address2 = Address.builder()
58-
.houseNumber(addressSimilarityHouseno2)
59-
.road(addressSimilarityRoad2)
60-
.city(addressSimilarityCity2)
61-
.state(addressSimilarityState2)
62-
.postCode(addressSimilarityPostcode2)
53+
String addressSimilarityAddress2 = "160 Pennsilvana Avenue, Washington, D.C., 20500";
54+
UnfieldedAddress address2 = UnfieldedAddress.builder()
55+
.address(addressSimilarityAddress2)
6356
.build();
6457
HttpRosetteAPI rosetteApi = new HttpRosetteAPI.Builder()
6558
.key(getApiKeyFromSystemProperty())

json/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<parent>
2121
<groupId>com.basistech.rosette</groupId>
2222
<artifactId>rosette-api-java-binding</artifactId>
23-
<version>1.15.102-SNAPSHOT</version>
23+
<version>1.15.103-SNAPSHOT</version>
2424
</parent>
2525
<artifactId>rosette-api-json</artifactId>
2626
<name>rosette-api-json</name>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright 2020 Basis Technology Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.basistech.rosette.apimodel.jackson;
18+
19+
import com.basistech.rosette.apimodel.FieldedAddress;
20+
import com.basistech.rosette.apimodel.IAddress;
21+
import com.basistech.rosette.apimodel.UnfieldedAddress;
22+
23+
import com.fasterxml.jackson.core.JsonParser;
24+
import com.fasterxml.jackson.core.TreeNode;
25+
import com.fasterxml.jackson.databind.DeserializationContext;
26+
import com.fasterxml.jackson.databind.JsonNode;
27+
import com.fasterxml.jackson.databind.ObjectMapper;
28+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
29+
import com.fasterxml.jackson.databind.node.ObjectNode;
30+
import com.fasterxml.jackson.databind.node.TextNode;
31+
32+
import java.io.IOException;
33+
import java.util.Iterator;
34+
import java.util.Map;
35+
36+
public class AddressDeserializer extends StdDeserializer<IAddress> {
37+
38+
private static final String UNFIELDED_KEY = "address";
39+
40+
AddressDeserializer() {
41+
super(IAddress.class);
42+
}
43+
44+
@Override
45+
public IAddress deserialize(JsonParser jp, DeserializationContext ctxt)
46+
throws IOException {
47+
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
48+
TreeNode root = mapper.readTree(jp);
49+
Class<? extends IAddress> addressClass = FieldedAddress.class;
50+
if (root instanceof TextNode) {
51+
// We only have a JsonProperty-based constructor, so we can't
52+
// have jackson create the object for us.
53+
return new UnfieldedAddress(((TextNode) root).textValue());
54+
} else {
55+
Iterator<Map.Entry<String, JsonNode>> iterator = ((ObjectNode)root).fields();
56+
if (iterator.hasNext()) {
57+
Map.Entry<String, JsonNode> element = iterator.next();
58+
if (UNFIELDED_KEY.equals(element.getKey())) {
59+
addressClass = UnfieldedAddress.class;
60+
}
61+
}
62+
}
63+
return mapper.treeToValue(root, addressClass);
64+
}
65+
}

json/src/main/java/com/basistech/rosette/apimodel/jackson/AddressSimilarityRequestMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import com.fasterxml.jackson.annotation.JsonTypeName;
2323
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
2424

25-
import com.basistech.rosette.apimodel.Address;
25+
import com.basistech.rosette.apimodel.IAddress;
2626

2727
@JsonTypeName("AddressSimilarityRequest")
2828
@JsonInclude(JsonInclude.Include.NON_NULL)
@@ -31,8 +31,8 @@ public class AddressSimilarityRequestMixin {
3131
@JsonCreator
3232
protected AddressSimilarityRequestMixin(
3333
@JsonProperty("profileId") String profileId,
34-
@JsonProperty("address1") Address address1,
35-
@JsonProperty("address2") Address address2
34+
@JsonProperty("address1") IAddress address1,
35+
@JsonProperty("address2") IAddress address2
3636
) {
3737
//
3838
}

json/src/main/java/com/basistech/rosette/apimodel/jackson/ApiModelMixinModule.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@
2121
import com.basistech.rosette.apimodel.AdmRequest;
2222
import com.basistech.rosette.apimodel.ConfigurationRequest;
2323
import com.basistech.rosette.apimodel.DocumentRequest;
24+
import com.basistech.rosette.apimodel.FieldedAddress;
25+
import com.basistech.rosette.apimodel.IAddress;
2426
import com.basistech.rosette.apimodel.Name;
2527
import com.basistech.rosette.apimodel.NameDeduplicationRequest;
2628
import com.basistech.rosette.apimodel.NameSimilarityRequest;
2729
import com.basistech.rosette.apimodel.NameTranslationRequest;
30+
import com.basistech.rosette.apimodel.UnfieldedAddress;
2831
import com.basistech.rosette.dm.jackson.AnnotatedDataModelModule;
2932
import com.fasterxml.jackson.databind.MapperFeature;
3033
import com.fasterxml.jackson.databind.Module;
3134
import com.fasterxml.jackson.databind.ObjectMapper;
35+
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
3236

3337
/**
3438
* Jackson module to configure Json serialization and deserialization for the
@@ -62,11 +66,20 @@ public void setupModule(Module.SetupContext context) {
6266
context.setMixInAnnotations(NameDeduplicationRequest.NameDeduplicationRequestBuilder.class, NameDeduplicationRequestMixin.NameDeduplicationRequestBuilderMixin.class);
6367
context.setMixInAnnotations(Address.class, AddressMixin.class);
6468
context.setMixInAnnotations(Address.AddressBuilder.class, AddressMixin.AddressBuilderMixin.class);
69+
context.setMixInAnnotations(FieldedAddress.class, FieldedAddressMixin.class);
70+
context.setMixInAnnotations(FieldedAddress.FieldedAddressBuilder.class, FieldedAddressMixin.FieldedAddressBuilderMixin.class);
71+
context.setMixInAnnotations(UnfieldedAddress.class, UnfieldedAddressMixin.class);
72+
context.setMixInAnnotations(UnfieldedAddress.UnfieldedAddressBuilder.class, UnfieldedAddressMixin.UnfieldedAddressBuilderMixin.class);
6573
context.setMixInAnnotations(AddressSimilarityRequest.class, AddressSimilarityRequestMixin.class);
6674
context.setMixInAnnotations(AddressSimilarityRequest.AddressSimilarityRequestBuilder.class, AddressSimilarityRequestMixin.AddressSimilarityRequestBuilderMixin.class);
6775
context.setMixInAnnotations(ConfigurationRequest.class, ConfigurationRequestMixin.class);
6876
context.setMixInAnnotations(ConfigurationRequest.ConfigurationRequestBuilder.class,
6977
ConfigurationRequestMixin.ConfigurationRequestBuilderMixin.class);
78+
79+
// IAddresses require a custom deserializer
80+
SimpleDeserializers deserializers = new SimpleDeserializers();
81+
deserializers.addDeserializer(IAddress.class, new AddressDeserializer());
82+
context.addDeserializers(deserializers);
7083
}
7184

7285
/**
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright 2020 Basis Technology Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.basistech.rosette.apimodel.jackson;
18+
19+
import com.fasterxml.jackson.annotation.JsonCreator;
20+
import com.fasterxml.jackson.annotation.JsonInclude;
21+
import com.fasterxml.jackson.annotation.JsonProperty;
22+
import com.fasterxml.jackson.annotation.JsonTypeName;
23+
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
24+
25+
@JsonTypeName("FieldedAddress")
26+
@JsonInclude(JsonInclude.Include.NON_NULL)
27+
public abstract class FieldedAddressMixin {
28+
29+
@JsonCreator
30+
protected FieldedAddressMixin(@JsonProperty("house") String house,
31+
@JsonProperty("houseNumber") String houseNumber,
32+
@JsonProperty("road") String road,
33+
@JsonProperty("unit") String unit,
34+
@JsonProperty("level") String level,
35+
@JsonProperty("staircase") String staircase,
36+
@JsonProperty("entrance") String entrance,
37+
@JsonProperty("suburb") String suburb,
38+
@JsonProperty("cityDistrict") String cityDistrict,
39+
@JsonProperty("city") String city,
40+
@JsonProperty("island") String island,
41+
@JsonProperty("stateDistrict") String stateDistrict,
42+
@JsonProperty("state") String state,
43+
@JsonProperty("countryRegion") String countryRegion,
44+
@JsonProperty("country") String country,
45+
@JsonProperty("worldRegion") String worldRegion,
46+
@JsonProperty("postCode") String postCode,
47+
@JsonProperty("poBox") String poBox) {
48+
//
49+
}
50+
51+
@JsonPOJOBuilder(withPrefix = "")
52+
abstract class FieldedAddressBuilderMixin {
53+
}
54+
}

0 commit comments

Comments
 (0)