Skip to content

Commit 779f0ec

Browse files
authored
Merge pull request #238 from google/FF0F89A9FFB90668CB5E5C968FD01756
(AUTOMATIC) opensource update
2 parents 7b7ced1 + d80bd4c commit 779f0ec

File tree

5 files changed

+108
-35
lines changed

5 files changed

+108
-35
lines changed

common/src/main/java/com/google/i18n/addressinput/common/AddressData.java

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ public final class AddressData {
110110
// part.
111111
private final List<String> addressLines;
112112

113+
// The landmark affix.
114+
private final String landmarkAffix;
115+
116+
// The landmark name.
117+
private final String landmarkName;
118+
113119
// Top-level administrative subdivision of this country.
114120
private final String administrativeArea;
115121

@@ -148,6 +154,8 @@ private AddressData(Builder builder) {
148154
this.sortingCode = builder.fields.get(AddressField.SORTING_CODE);
149155
this.organization = builder.fields.get(AddressField.ORGANIZATION);
150156
this.recipient = builder.fields.get(AddressField.RECIPIENT);
157+
this.landmarkAffix = builder.fields.get(AddressField.LANDMARK_AFFIX);
158+
this.landmarkName = builder.fields.get(AddressField.LANDMARK_NAME);
151159
this.addressLines = Collections.unmodifiableList(
152160
normalizeAddressLines(new ArrayList<String>(builder.addressLines)));
153161
this.languageCode = builder.language;
@@ -197,14 +205,26 @@ public String toString() {
197205
for (String line : addressLines) {
198206
output.append(line + "; ");
199207
}
200-
output.append("ADMIN_AREA=" + administrativeArea + "; "
201-
+ "LOCALITY=" + locality + "; "
202-
+ "DEPENDENT_LOCALITY=" + dependentLocality + "; "
203-
+ "POSTAL_CODE=" + postalCode + "; "
204-
+ "SORTING_CODE=" + sortingCode + "; "
205-
+ "ORGANIZATION=" + organization + "; "
206-
+ "RECIPIENT=" + recipient
207-
+ ")");
208+
output
209+
.append("ADMIN_AREA=")
210+
.append(administrativeArea)
211+
.append("; " + "LOCALITY=")
212+
.append(locality)
213+
.append("; " + "DEPENDENT_LOCALITY=")
214+
.append(dependentLocality)
215+
.append("; " + "POSTAL_CODE=")
216+
.append(postalCode)
217+
.append("; " + "SORTING_CODE=")
218+
.append(sortingCode)
219+
.append("; " + "ORGANIZATION=")
220+
.append(organization)
221+
.append("; " + "RECIPIENT=")
222+
.append(recipient)
223+
.append("; " + "LANDMARK_AFFIX=")
224+
.append(landmarkAffix)
225+
.append("; " + "LANDMARK_NAME=")
226+
.append(landmarkName)
227+
.append(")");
208228
return output.toString();
209229
}
210230

@@ -247,7 +267,13 @@ public boolean equals(Object o) {
247267
: recipient.equals(addressData.getRecipient()))
248268
&& (languageCode == null
249269
? addressData.getLanguageCode() == null
250-
: languageCode.equals(addressData.getLanguageCode()));
270+
: languageCode.equals(addressData.getLanguageCode()))
271+
&& (landmarkAffix == null
272+
? addressData.getLandmarkAffix() == null
273+
: landmarkAffix.equals(addressData.getLandmarkAffix()))
274+
&& (landmarkName == null
275+
? addressData.getLandmarkName() == null
276+
: landmarkName.equals(addressData.getLandmarkName()));
251277
}
252278

253279
@Override
@@ -265,7 +291,9 @@ public int hashCode() {
265291
sortingCode,
266292
organization,
267293
recipient,
268-
languageCode
294+
languageCode,
295+
landmarkAffix,
296+
landmarkName
269297
};
270298

271299
for (String field : fields) {
@@ -436,6 +464,16 @@ public String getRecipient() {
436464
return recipient;
437465
}
438466

467+
/** Returns the landmark affix. */
468+
public String getLandmarkAffix() {
469+
return landmarkAffix;
470+
}
471+
472+
/** Returns the landmark name. */
473+
public String getLandmarkName() {
474+
return landmarkName;
475+
}
476+
439477
/**
440478
* Returns a value for those address fields which map to a single string value.
441479
* <p>
@@ -472,6 +510,10 @@ public String getFieldValue(AddressField field) {
472510
return organization;
473511
case RECIPIENT:
474512
return recipient;
513+
case LANDMARK_AFFIX:
514+
return landmarkAffix;
515+
case LANDMARK_NAME:
516+
return landmarkName;
475517
default:
476518
throw new IllegalArgumentException("multi-value fields not supported: " + field);
477519
}
@@ -713,6 +755,25 @@ public Builder setRecipient(String recipient) {
713755
return set(AddressField.RECIPIENT, recipient);
714756
}
715757

758+
/**
759+
* Sets or clears the landmark affix of the address; see {@link
760+
* AddressData.Landmark#getPrefix()}.
761+
*
762+
* @param landmarkAffix the landmark affix, or null to clear an existing value.
763+
*/
764+
public Builder setLandmarkAffix(String landmarkAffix) {
765+
return set(AddressField.LANDMARK_AFFIX, landmarkAffix);
766+
}
767+
768+
/**
769+
* Sets or clears the landmark name of the address; see {@link AddressData.Landmark#getName()}.
770+
*
771+
* @param landmarkName the landmark name, or null to clear an existing value.
772+
*/
773+
public Builder setLandmarkName(String landmarkName) {
774+
return set(AddressField.LANDMARK_NAME, landmarkName);
775+
}
776+
716777
/**
717778
* Sets an address field with the specified value. If the value is empty (null or whitespace),
718779
* the original value associated with the field will be removed.

common/src/main/java/com/google/i18n/addressinput/common/AddressField.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,13 @@ public enum AddressField {
6868
/** The input field used to enter a value for {@link AddressData#getRecipient()}. */
6969
RECIPIENT('N'),
7070
/** The input field used to enter a value for {@link AddressData#getOrganization()}. */
71-
ORGANIZATION('O');
71+
ORGANIZATION('O'),
72+
73+
/** The input field used to enter a value for {@link AddressData.Landmark#getPrefix()}. */
74+
LANDMARK_AFFIX('F'),
75+
/** The input field used to enter a value for {@link AddressData.Landmark#getName()}. */
76+
LANDMARK_NAME('L'),
77+
;
7278

7379
/** Classification of the visual width of address input fields. */
7480
public enum WidthType {

common/src/main/java/com/google/i18n/addressinput/common/FormatInterpreter.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@
1818

1919
import com.google.i18n.addressinput.common.AddressField.WidthType;
2020
import com.google.i18n.addressinput.common.LookupKey.ScriptType;
21-
22-
import org.json.JSONException;
23-
import org.json.JSONObject;
24-
import org.json.JSONTokener;
25-
2621
import java.util.ArrayList;
2722
import java.util.Collections;
2823
import java.util.EnumSet;
2924
import java.util.List;
3025
import java.util.Map;
3126
import java.util.Set;
27+
import org.json.JSONException;
28+
import org.json.JSONObject;
29+
import org.json.JSONTokener;
30+
import org.jspecify.nullness.Nullable;
3231

3332
/**
3433
* Address format interpreter. A utility to find address format related info.
@@ -77,8 +76,7 @@ List<AddressField> getAddressFieldOrder(String formatString, String regionCode)
7776
AddressField field = getFieldForFormatSubstring(substring);
7877
// Accept only the first instance for any duplicate fields (which can occur because the
7978
// string we start with defines format order, which can contain duplicate fields).
80-
if (!visibleFields.contains(field)) {
81-
visibleFields.add(field);
79+
if (visibleFields.add(field)) {
8280
fieldOrder.add(field);
8381
}
8482
}
@@ -189,7 +187,7 @@ static WidthType getWidthOverride(AddressField field, String regionCode) {
189187
* Visible for Testing - same as {@link #getWidthOverride(AddressField, String)} but testable with
190188
* fake data.
191189
*/
192-
static WidthType getWidthOverride(
190+
static @Nullable WidthType getWidthOverride(
193191
AddressField field, String regionCode, Map<String, String> regionDataMap) {
194192
Util.checkNotNull(regionCode);
195193
String overridesString =
@@ -379,19 +377,27 @@ private static String getFormatString(ScriptType scriptType, String regionCode)
379377
return format;
380378
}
381379

382-
private static String getJsonValue(String regionCode, AddressDataKey key) {
380+
private static @Nullable String getJsonValue(String regionCode, AddressDataKey key) {
383381
return getJsonValue(regionCode, key, RegionDataConstants.getCountryFormatMap());
384382
}
385383

386-
/**
387-
* Visible for testing only.
388-
*/
389-
static String getJsonValue(
384+
/** Visible for testing only. */
385+
static @Nullable String getJsonValue(
390386
String regionCode, AddressDataKey key, Map<String, String> regionDataMap) {
391387
Util.checkNotNull(regionCode);
392388
String jsonString = regionDataMap.get(regionCode);
393-
Util.checkNotNull(jsonString, "no json data for region code " + regionCode);
394-
389+
if (jsonString == null) {
390+
if (regionCode.equals("CQ")) {
391+
// TODO: Return data for Guernsey for now for Sark but we should set up some mapping
392+
// constants file in the long term.
393+
jsonString = regionDataMap.get("GG");
394+
}
395+
if (jsonString == null) {
396+
// TODO: Set up some logging to track region codes we need to account for in the
397+
// aforementioned mapping constants file.
398+
return null;
399+
}
400+
}
395401
try {
396402
JSONObject jsonObj = new JSONObject(new JSONTokener(jsonString));
397403
if (!jsonObj.has(Util.toLowerCaseLocaleIndependent(key.name()))) {

common/src/main/java/com/google/i18n/addressinput/common/RegionDataConstants.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private static Map<String, String> createMap() {
138138
map.put("IE", "{\"name\":\"IRELAND\",\"lang\":\"en\",\"languages\":\"en\",\"fmt\":\"%N%n%O%n%A%n%D%n%C%n%S%n%Z\",\"sublocality_name_type\":\"townland\",\"state_name_type\":\"county\",\"zip_name_type\":\"eircode\",\"label_overrides\":[{\"field\":\"S\",\"label\":\"\",\"lang\":\"zh\"}]}");
139139
map.put("IL", "{\"name\":\"ISRAEL\",\"fmt\":\"%N%n%O%n%A%n%C %Z\"}");
140140
map.put("IM", "{\"name\":\"ISLE OF MAN\",\"fmt\":\"%N%n%O%n%A%n%C%n%Z\",\"require\":\"ACZ\",\"upper\":\"CZ\"}");
141-
map.put("IN", "{\"name\":\"INDIA\",\"lang\":\"en\",\"languages\":\"en~hi\",\"fmt\":\"%N%n%O%n%A%n%C %Z%n%S\",\"require\":\"ACSZ\",\"state_name_type\":\"state\",\"zip_name_type\":\"pin\",\"label_overrides\":[{\"field\":\"S1\",\"label\":\"Sublocality 1\"},{\"field\":\"S2\",\"label\":\"Sublocality 2\"},{\"field\":\"S3\",\"label\":\"Sublocality 3\"},{\"field\":\"S4\",\"label\":\"Sublocality 4\"}]}");
141+
map.put("IN", "{\"name\":\"INDIA\",\"lang\":\"en\",\"languages\":\"en~hi\",\"fmt\":\"%N%n%O%n%A%n%F%n%L%n%C %Z%n%S\",\"require\":\"ACSZ\",\"state_name_type\":\"state\",\"zip_name_type\":\"pin\",\"label_overrides\":[{\"field\":\"S1\",\"label\":\"Sublocality 1\"},{\"field\":\"S2\",\"label\":\"Sublocality 2\"},{\"field\":\"S3\",\"label\":\"Sublocality 3\"},{\"field\":\"S4\",\"label\":\"Sublocality 4\"}]}");
142142
map.put("IO", "{\"name\":\"BRITISH INDIAN OCEAN TERRITORY\",\"fmt\":\"%N%n%O%n%A%n%C%n%Z\",\"require\":\"ACZ\",\"upper\":\"CZ\"}");
143143
map.put("IQ", "{\"name\":\"IRAQ\",\"fmt\":\"%O%n%N%n%A%n%C, %S%n%Z\",\"require\":\"ACS\",\"upper\":\"CS\"}");
144144
map.put("IR", "{\"name\":\"IRAN\",\"lang\":\"fa\",\"languages\":\"fa\",\"fmt\":\"%O%n%N%n%S%n%C, %D%n%A%n%Z\",\"sublocality_name_type\":\"neighborhood\"}");
@@ -222,7 +222,7 @@ private static Map<String, String> createMap() {
222222
map.put("PY", "{\"name\":\"PARAGUAY\",\"fmt\":\"%N%n%O%n%A%n%Z %C\"}");
223223
map.put("QA", "{\"name\":\"QATAR\",\"upper\":\"AC\"}");
224224
map.put("RE", "{\"name\":\"REUNION\",\"fmt\":\"%O%n%N%n%A%n%Z %C %X\",\"require\":\"ACZ\",\"upper\":\"ACX\"}");
225-
map.put("RO", "{\"name\":\"ROMANIA\",\"fmt\":\"%N%n%O%n%A%n%Z %S %C\",\"require\":\"ACZ\",\"upper\":\"AC\",\"label_overrides\":[{\"field\":\"C\",\"label\":\"Județe/sectoare\",\"lang\":\"ro\"},{\"field\":\"C\",\"label\":\"County/sector\",\"lang\":\"en\"},{\"field\":\"S\",\"label\":\"Municipiu/oraș/comună\",\"lang\":\"ro\"},{\"field\":\"S\",\"label\":\"Municipality/city/town/commune\",\"lang\":\"en\"}]}");
225+
map.put("RO", "{\"name\":\"ROMANIA\",\"lang\":\"ro\",\"languages\":\"ro\",\"fmt\":\"%N%n%O%n%A%n%Z %S %C\",\"require\":\"ACZ\",\"upper\":\"AC\",\"label_overrides\":[{\"field\":\"C\",\"label\":\"Județe/sectoare\",\"lang\":\"ro\"},{\"field\":\"C\",\"label\":\"County/sector\",\"lang\":\"en\"},{\"field\":\"S\",\"label\":\"Municipiu/oraș/comună\",\"lang\":\"ro\"},{\"field\":\"S\",\"label\":\"Municipality/city/town/commune\",\"lang\":\"en\"}]}");
226226
map.put("RS", "{\"name\":\"REPUBLIC OF SERBIA\",\"fmt\":\"%N%n%O%n%A%n%Z %C\"}");
227227
map.put("RU", "{\"name\":\"RUSSIAN FEDERATION\",\"lang\":\"ru\",\"languages\":\"ru\",\"lfmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\",\"fmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\",\"require\":\"ACSZ\",\"upper\":\"AC\",\"state_name_type\":\"oblast\",\"label_overrides\":[{\"field\":\"CS\",\"message\":\"MSG_OFFICE_UNIT_NUMBER\"}]}");
228228
map.put("RW", "{\"name\":\"RWANDA\",\"upper\":\"AC\"}");

cpp/src/region_data_constants.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ const RegionData kRegionData[] = {
155155
R"("fmt":"%O%n%N%n%A%n%Z %C",)"
156156
R"("require":"ACZ",)"
157157
R"("zipex":"4000,1000",)"
158-
R"("posturl":"http://www.post.be/site/nl/residential/customerservice/search/postal_codes.html",)"
158+
R"("posturl":"https://www.bpost.be/nl/postcodevalidatie-tool",)"
159159
R"("languages":"nl~fr~de")"
160160
"}"},
161161
{"BF", "{"
@@ -221,7 +221,7 @@ const RegionData kRegionData[] = {
221221
{"BT", "{"
222222
R"("fmt":"%N%n%O%n%A%n%C %Z",)"
223223
R"("zipex":"11001,31101,35003",)"
224-
R"("posturl":"http://www.bhutanpost.bt/postcodes/",)"
224+
R"("posturl":"https://bhutanpost.bt/postcode/",)"
225225
R"("languages":"dz")"
226226
"}"},
227227
{"BV", "{"
@@ -516,7 +516,7 @@ const RegionData kRegionData[] = {
516516
R"("fmt":"%N%n%O%n%A%n%Z %C",)"
517517
R"("require":"ACZ",)"
518518
R"("zipex":"151 24,151 10,101 88",)"
519-
R"("posturl":"http://www.elta.gr/findapostcode.aspx",)"
519+
R"("posturl":"https://postalcodes.elta.gr",)"
520520
R"("languages":"el")"
521521
"}"},
522522
{"GS", "{"
@@ -611,7 +611,7 @@ const RegionData kRegionData[] = {
611611
R"("languages":"en~gv")"
612612
"}"},
613613
{"IN", "{"
614-
R"("fmt":"%N%n%O%n%A%n%C %Z%n%S",)"
614+
R"("fmt":"%N%n%O%n%A%n%F%n%L%n%C %Z%n%S",)"
615615
R"("require":"ACSZ",)"
616616
R"("zip_name_type":"pin",)"
617617
R"("state_name_type":"state",)"
@@ -794,7 +794,7 @@ const RegionData kRegionData[] = {
794794
R"("fmt":"%N%n%O%n%A%n%S%n%C, %Z",)"
795795
R"("require":"ACZ",)"
796796
R"("zipex":"LV-1073,LV-1000",)"
797-
R"("posturl":"http://www.pasts.lv/lv/uzzinas/nodalas/",)"
797+
R"("posturl":"https://pasts.lv/lv/kategorija/pasta_nodalas/",)"
798798
R"("languages":"lv")"
799799
"}"},
800800
{"LY", "{"
@@ -1002,7 +1002,7 @@ const RegionData kRegionData[] = {
10021002
R"("fmt":"%N%n%O%n%A%n%D%n%C %Z",)"
10031003
R"("require":"ACZ",)"
10041004
R"("zipex":"6001,6015,6332,8252,1030",)"
1005-
R"("posturl":"http://www.nzpost.co.nz/Cultures/en-NZ/OnlineTools/PostCodeFinder/",)"
1005+
R"("posturl":"https://www.nzpost.co.nz/tools/address-postcode-finder",)"
10061006
R"("languages":"en~mi")"
10071007
"}"},
10081008
{"OM", "{"
@@ -1239,7 +1239,7 @@ const RegionData kRegionData[] = {
12391239
{"SZ", "{"
12401240
R"("fmt":"%N%n%O%n%A%n%C%n%Z",)"
12411241
R"("zipex":"H100",)"
1242-
R"("posturl":"http://www.sptc.co.sz/swazipost/codes/index.php",)"
1242+
R"("posturl":"https://www.eswatinipost.co.sz/postcode.php",)"
12431243
R"("languages":"en~ss")"
12441244
"}"},
12451245
{"TA", "{"

0 commit comments

Comments
 (0)