Skip to content

Commit

Permalink
Adresse.validate(String) refactored
Browse files Browse the repository at this point in the history
  • Loading branch information
oboehm committed Jan 21, 2018
1 parent dcdaf64 commit 8d04dd4
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 8 deletions.
60 changes: 55 additions & 5 deletions src/main/java/de/jfachwert/post/Adresse.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@
import de.jfachwert.pruefung.exception.InvalidValueException;
import org.apache.commons.lang3.StringUtils;

import javax.validation.ValidationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Bei einer Adresse kann es sich um eine Wohnungsadresse oder Gebaeudeadresse
* handeln. Sie besteht aus Ort, Strasse und Hausnummer. Sie unterscheidet sich
Expand All @@ -31,6 +38,8 @@
*/
public class Adresse implements Fachwert {

private static final Logger LOG = Logger.getLogger(Adresse.class.getName());

private final Ort ort;
private final String strasse;
private final String hausnummer;
Expand Down Expand Up @@ -74,15 +83,56 @@ public static void validate(Ort ort, String strasse, String hausnummer) {

/**
* Zerlegt die uebergebene Adresse in ihre Einzelteile und validiert sie.
* Folgende Heuristiken werden fuer die Zerlegung herangezogen:
* <ul>
* <li>Reihenfolge kann Ort, Strasse oder Strasse, Ort sein</li>
* <li>Ort / Strasse werden durch Komma oder Zeilenvorschub getrennt</li>
* <li>vor dem Ort steht die PLZ</li>
* </ul>
*
* @param adresse z.B. "12345 Entenhausen, Gansstr. 23"
*/
public static void validate(String adresse) {
Ort ort = new Ort(StringUtils.substringBefore(adresse, ","));
String strasseHausnummer = StringUtils.substringAfter(adresse, ",").trim();
String strasse = StringUtils.substringBeforeLast(strasseHausnummer, " ");
String hausnummer = StringUtils.substringAfterLast(strasseHausnummer, " ");
validate(ort, strasse, hausnummer);
String[] splitted = split(adresse);
Ort ort = new Ort(splitted[0]);
validate(ort, splitted[1], splitted[2]);
}

private static String[] split(String adresse) {
String[] lines = StringUtils.trimToEmpty(adresse).split("[,\\n$]");
if (lines.length != 2) {
throw new InvalidValueException(adresse, "address");
}
List<String> splitted = new ArrayList<>();
if (hasPLZ(lines[0])) {
splitted.add(lines[0].trim());
splitted.addAll(toStrasseHausnummer(lines[1]));
} else {
splitted.add(lines[1].trim());
splitted.addAll(toStrasseHausnummer(lines[0]));
}
return splitted.toArray(new String[3]);
}

private static boolean hasPLZ(String line) {
try {
Ort ort = new Ort(line);
return ort.getPLZ().isPresent();
} catch (ValidationException ex) {
LOG.log(Level.FINE, "no PLZ inside '" + line + "' found:", ex);
return false;
}
}

private static List<String> toStrasseHausnummer(String line) {
String[] splitted = line.trim().split("\\s+");
if (splitted.length != 2) {
splitted = line.split("\\s+[0-9]", 2);
}
if (splitted.length != 2) {
throw new InvalidValueException(line, "street_or_house_number");
}
return Arrays.asList(splitted);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/de/jfachwert/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ phone_number=phone number
post_office_box=post office box
postal_code=postal code
street=street
street_or_house_number=street or house number
values_exchanged=value exhanged
year=year

Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/de/jfachwert/messages_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ number=Nummer
phone_number=Telefonnummer
post_office_box=Postfach
postal_code=Postleitzahl
street=Strasse
street=Stra\u00dfe
street_or_house_number=Stra\u00dfe oder Hausnummer
values_exchanged=Werte verwechselt
year=Jahr

Expand Down
14 changes: 12 additions & 2 deletions src/test/java/de/jfachwert/post/AdresseTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,18 @@ public void testGetPLZ() {
* Test-Methode fuer {@link Adresse#validate(String)}.
*/
@Test
public void testValidate() {
Adresse.validate("12345 Entenhausen, Gansstr. 23");
public void testValidateOrtStrasse() {
Adresse.validate("D12345 Entenhausen, Gansstr. 23");
}

/**
* Die verwendete Adresse stammt von der Uni Erfurt und ist eine gueltige
* Adresse.
*/
@Test
public void testValidateStrasseOrt() {
String adresse = "Nordh\u00e4user Stra\u00dfe 63\n99089 Erfurt";
Adresse.validate(adresse);
}

}

0 comments on commit 8d04dd4

Please sign in to comment.