From 6a07fc479021dbf61143d432285c573faf38d6b9 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 7 May 2015 12:51:04 +1200 Subject: Implement address formatter --- src/org/traccar/geocode/Address.java | 48 ++++++++++++++++ src/org/traccar/geocode/AddressFormat.java | 74 +++++++++++++++++++++++++ test/org/traccar/geocode/AddressFormatTest.java | 32 +++++++++++ 3 files changed, 154 insertions(+) create mode 100644 src/org/traccar/geocode/Address.java create mode 100644 src/org/traccar/geocode/AddressFormat.java create mode 100644 test/org/traccar/geocode/AddressFormatTest.java diff --git a/src/org/traccar/geocode/Address.java b/src/org/traccar/geocode/Address.java new file mode 100644 index 000000000..660348509 --- /dev/null +++ b/src/org/traccar/geocode/Address.java @@ -0,0 +1,48 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.geocode; + +public class Address { + + private String postcode; + public String getPostcode() { return postcode; } + public void setPostcode(String postcode) { this.postcode = postcode; } + + private String country; + public String getCountry() { return country; } + public void setCountry(String country) { this.country = country; } + + private String state; + public String getState() { return state; } + public void setState(String state) { this.state = state; } + + private String district; + public String getDistrict() { return district; } + public void setDistrict(String district) { this.district = district; } + + private String settlement; + public String getSettlement() { return settlement; } + public void setSettlement(String settlement) { this.settlement = settlement; } + + private String street; + public String getStreet() { return street; } + public void setStreet(String street) { this.street = street; } + + private String house; + public String getHouse() { return house; } + public void setHouse(String house) { this.house = house; } + +} diff --git a/src/org/traccar/geocode/AddressFormat.java b/src/org/traccar/geocode/AddressFormat.java new file mode 100644 index 000000000..972326975 --- /dev/null +++ b/src/org/traccar/geocode/AddressFormat.java @@ -0,0 +1,74 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.geocode; + +import java.text.FieldPosition; +import java.text.Format; +import java.text.ParsePosition; + +/** + * Available parameters: + * + * %p - postcode + * %c - country + * %s - state + * %d - district + * %t - settlement (town) + * %r - street (road) + * %h - house + * + */ +public class AddressFormat extends Format { + + private final String format; + + public AddressFormat(String format) { + this.format = format; + } + + private static String replace(String s, String key, String value) { + if (value != null) { + s = s.replace(key, value); + } else { + s = s.replaceAll("[, ]*" + key, ""); + } + return s; + } + + @Override + public StringBuffer format(Object o, StringBuffer stringBuffer, FieldPosition fieldPosition) { + Address address = (Address) o; + String result = format; + + result = replace(result, "%p", address.getPostcode()); + result = replace(result, "%c", address.getCountry()); + result = replace(result, "%s", address.getState()); + result = replace(result, "%d", address.getDistrict()); + result = replace(result, "%t", address.getSettlement()); + result = replace(result, "%r", address.getStreet()); + result = replace(result, "%h", address.getHouse()); + + result = result.replaceAll("^[, ]*", ""); + + return stringBuffer.append(result); + } + + @Override + public Address parseObject(String s, ParsePosition parsePosition) { + throw new UnsupportedOperationException(); + } + +} diff --git a/test/org/traccar/geocode/AddressFormatTest.java b/test/org/traccar/geocode/AddressFormatTest.java new file mode 100644 index 000000000..325ae1433 --- /dev/null +++ b/test/org/traccar/geocode/AddressFormatTest.java @@ -0,0 +1,32 @@ +package org.traccar.geocode; + +import org.junit.Assert; +import org.junit.Test; + +public class AddressFormatTest { + + private void test(Address address, String format, String expected) { + Assert.assertEquals(expected, new AddressFormat(format).format(address)); + } + + @Test + public void testFormat() { + + Address address = new Address(); + address.setCountry("NZ"); + address.setSettlement("Auckland"); + address.setStreet("Queen St"); + address.setHouse("1A"); + + test(address, "%h %r %t %d %s %c %p", "1A Queen St Auckland NZ"); + test(address, "%h %r %t", "1A Queen St Auckland"); + test(address, "%h %r, %t", "1A Queen St, Auckland"); + test(address, "%h %r, %t %p", "1A Queen St, Auckland"); + test(address, "%t %d %c", "Auckland NZ"); + test(address, "%t, %d, %c", "Auckland, NZ"); + test(address, "%d %c", "NZ"); + test(address, "%d, %c", "NZ"); + test(address, "%p", ""); + } + +} -- cgit v1.2.3