/*
* GPL v3
*/
package org.kleini.address;
/**
* {@link Formatter} formats an {@link Address} in the country specific format.
*
* @author <a href="mailto:himself@kleini.org">Marcus Klein</a>
*/
public final class Formatter {
private Formatter() {
super();
}
public static String format(Address address) throws Exception {
StringBuilder sb = new StringBuilder();
switch (address.getCountry()) {
case CA:
addCanada(sb, address);
break;
case CL:
addChile(sb, address);
break;
case CN:
addChina(sb, address);
break;
case FI:
addFinland(sb, address);
break;
case GB:
addUnitedKingdom(sb, address);
break;
case SG:
addSingapore(sb, address);
break;
case RU:
addRussia(sb, address);
break;
case TH:
addThailand(sb, address);
break;
case TW:
addTaiwan(sb, address);
break;
case AT:
case BE:
case CH:
case DE:
case ES:
case FR:
case HK:
case HU:
case IT:
case NL:
case NO:
case SE:
addStandard(sb, address);
break;
case AU:
case JP:
case KR:
case MY:
case US:
case ZA:
addStandard2(sb, address);
break;
case CZ:
case RO:
addStandard3(sb, address);
break;
default:
throw new Exception("Formatter for country " + address.getCountry().getName() + " missing.");
}
return sb.toString();
}
private static void addName(StringBuilder sb, Address address) {
sb.append(address.getName()); lb(sb);
sb.append(address.getStreet1()); sb.append('\n');
if (null != address.getStreet2() && address.getStreet2().length() > 0) {
sb.append(address.getStreet2()); sb.append('\n');
}
}
private static void addCountry(StringBuilder sb, Address address) {
sb.append(address.getCountryName().toUpperCase());
}
private static void lb(StringBuilder sb) {
sb.append('\n');
}
private static void appendNotNull(StringBuilder sb, String text, String spacer) {
if (null != text && text.length() > 0) {
sb.append(text);
if (null != spacer && spacer.length() > 0) {
sb.append(spacer);
}
}
}
private static void appendNotNull(StringBuilder sb, String text) {
appendNotNull(sb, text, null);
}
private static void addStandard(StringBuilder sb, Address address) {
addName(sb, address);
if (null != address.getPostalCode()) {
sb.append(address.getPostalCode());
sb.append(' ');
}
if (null != address.getCityName()) {
sb.append(address.getCityName());
}
if (Country.DE == address.getCountry()) {
return;
}
if (null != address.getPostalCode() && null != address.getCityName()) {
sb.append('\n');
}
if (null != address.getStateOrProvince()) {
sb.append(address.getStateOrProvince()); sb.append('\n');
}
addCountry(sb, address);
}
private static void addStandard2(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName()); sb.append(", ");
appendNotNull(sb, address.getStateOrProvince(), " ");
sb.append(address.getPostalCode()); sb.append('\n');
addCountry(sb, address);
}
private static void addCanada(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName()); sb.append(' '); sb.append(address.getStateOrProvince()); sb.append(' '); sb.append(address.getPostalCode()); sb.append('\n');
addCountry(sb, address);
}
private static void addChina(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName()); lb(sb);
sb.append(address.getStateOrProvince()); sb.append(", "); sb.append(address.getPostalCode()); lb(sb);
addCountry(sb, address);
}
private static void addChile(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName());
if (null != address.getStateOrProvince()) {
sb.append(", ");
sb.append(address.getStateOrProvince());
}
if (null != address.getPostalCode()) {
sb.append(", ");
sb.append(address.getPostalCode());
}
sb.append('\n');
addCountry(sb, address);
}
private static void addStandard3(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName());
if (null != address.getStateOrProvince()) {
sb.append(", ");
sb.append(address.getStateOrProvince());
}
sb.append('\n');
sb.append(address.getPostalCode()); sb.append('\n');
addCountry(sb, address);
}
private static void addFinland(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName());
if (null != address.getStateOrProvince()) {
sb.append(", "); sb.append(address.getStateOrProvince());
}
sb.append('\n');
sb.append(address.getPostalCode()); sb.append('\n');
addCountry(sb, address);
}
private static void addRussia(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName()); lb(sb);
appendNotNull(sb, address.getStateOrProvince(), ", ");
sb.append(address.getPostalCode()); lb(sb);
addCountry(sb, address);
}
private static void addSingapore(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName()); sb.append(' '); sb.append(address.getPostalCode()); lb(sb);
appendNotNull(sb, address.getStateOrProvince()); addCountry(sb, address);
}
private static void addTaiwan(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getStateOrProvince()); sb.append('\n');
sb.append(address.getCityName()); sb.append(", "); sb.append(address.getPostalCode()); sb.append('\n');
addCountry(sb, address);
}
private static void addThailand(StringBuilder sb, Address address) {
addName(sb, address);
sb.append(address.getCityName()); sb.append('\n');
sb.append(address.getStateOrProvince()); sb.append(", "); sb.append(address.getPostalCode()); sb.append('\n');
addCountry(sb, address);
}
private static void addUnitedKingdom(StringBuilder sb, Address address) {
sb.append(address.getName()); lb(sb);
sb.append(address.getStreet1()); lb(sb);
if (null != address.getStreet2() && null != address.getStateOrProvince()) {
sb.append(address.getStreet2());
sb.append(", ");
sb.append(address.getCityName());
sb.append(", ");
sb.append(address.getStateOrProvince());
lb(sb);
} else {
if (null != address.getStreet2()) {
sb.append(address.getStreet2()); sb.append('\n');
}
sb.append(address.getCityName());
if (null != address.getStateOrProvince()) {
sb.append(", ");
sb.append(address.getStateOrProvince());
}
lb(sb);
}
sb.append(address.getPostalCode().toUpperCase()); lb(sb);
addCountry(sb, address);
}
}