From 0122de4bb55223cfdf58db0aa2ec090eab10e390 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 9 Jan 2015 14:43:57 +0100 Subject: [PATCH] Hafas: Improve handling of station name suffixes. --- .../schildbach/pte/AbstractHafasProvider.java | 1 + .../src/de/schildbach/pte/BvgProvider.java | 31 ++++++++++++++----- .../src/de/schildbach/pte/DsbProvider.java | 3 -- .../de/schildbach/pte/StockholmProvider.java | 3 -- .../src/de/schildbach/pte/VbbProvider.java | 31 ++++++++++++++----- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java index 215d3c59..0caa97a0 100644 --- a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java @@ -248,6 +248,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider protected static final Pattern P_SPLIT_NAME_FIRST_COMMA = Pattern.compile("([^,]*), (.*)"); protected static final Pattern P_SPLIT_NAME_LAST_COMMA = Pattern.compile("(.*), ([^,]*)"); + protected static final Pattern P_SPLIT_NAME_PAREN = Pattern.compile("(.*) \\((.{3,}?)\\)"); protected String[] splitStationName(final String name) { diff --git a/enabler/src/de/schildbach/pte/BvgProvider.java b/enabler/src/de/schildbach/pte/BvgProvider.java index ddf3cd4b..6a9ca6bb 100644 --- a/enabler/src/de/schildbach/pte/BvgProvider.java +++ b/enabler/src/de/schildbach/pte/BvgProvider.java @@ -119,25 +119,42 @@ public final class BvgProvider extends AbstractHafasProvider } } - private static final Pattern P_SPLIT_NAME_PAREN = Pattern.compile("(.*?) +\\((.{4,}?)\\)(?: +\\((U|S|S\\+U)\\))?"); + private static final Pattern P_SPLIT_NAME_SU = Pattern.compile("(.*?)(?:\\s+\\((S|U|S\\+U)\\))?"); + private static final Pattern P_SPLIT_NAME_BUS = Pattern.compile("(.*?)(\\s+\\[[^\\]]+\\])?"); @Override - protected String[] splitStationName(final String name) + protected String[] splitStationName(String name) { + final Matcher mSu = P_SPLIT_NAME_SU.matcher(name); + if (!mSu.matches()) + throw new IllegalStateException(name); + name = mSu.group(1); + final String su = mSu.group(2); + + final Matcher mBus = P_SPLIT_NAME_BUS.matcher(name); + if (!mBus.matches()) + throw new IllegalStateException(name); + name = mBus.group(1); + final Matcher mParen = P_SPLIT_NAME_PAREN.matcher(name); if (mParen.matches()) - { - final String su = mParen.group(3); - return new String[] { mParen.group(2), mParen.group(1) + (su != null ? " (" + su + ")" : "") }; - } + return new String[] { normalizePlace(mParen.group(2)), (su != null ? su + " " : "") + mParen.group(1) }; final Matcher mComma = P_SPLIT_NAME_FIRST_COMMA.matcher(name); if (mComma.matches()) - return new String[] { mComma.group(1), mComma.group(2) }; + return new String[] { normalizePlace(mComma.group(1)), mComma.group(2) }; return super.splitStationName(name); } + private String normalizePlace(final String place) + { + if ("Bln".equals(place)) + return "Berlin"; + else + return place; + } + @Override protected String[] splitAddress(final String address) { diff --git a/enabler/src/de/schildbach/pte/DsbProvider.java b/enabler/src/de/schildbach/pte/DsbProvider.java index d646874b..51a7bebb 100644 --- a/enabler/src/de/schildbach/pte/DsbProvider.java +++ b/enabler/src/de/schildbach/pte/DsbProvider.java @@ -19,7 +19,6 @@ package de.schildbach.pte; import java.util.Collection; import java.util.regex.Matcher; -import java.util.regex.Pattern; import de.schildbach.pte.dto.Product; @@ -122,8 +121,6 @@ public class DsbProvider extends AbstractHafasProvider } } - private static final Pattern P_SPLIT_NAME_PAREN = Pattern.compile("(.*) \\((.{4,}?)\\)"); - @Override protected String[] splitStationName(final String name) { diff --git a/enabler/src/de/schildbach/pte/StockholmProvider.java b/enabler/src/de/schildbach/pte/StockholmProvider.java index 85da9485..9cf1b51a 100644 --- a/enabler/src/de/schildbach/pte/StockholmProvider.java +++ b/enabler/src/de/schildbach/pte/StockholmProvider.java @@ -20,7 +20,6 @@ package de.schildbach.pte; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; -import java.util.regex.Pattern; import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Product; @@ -112,8 +111,6 @@ public class StockholmProvider extends AbstractHafasProvider } } - private static final Pattern P_SPLIT_NAME_PAREN = Pattern.compile("(.*) \\((.{4,}?)\\)"); - @Override protected String[] splitStationName(final String name) { diff --git a/enabler/src/de/schildbach/pte/VbbProvider.java b/enabler/src/de/schildbach/pte/VbbProvider.java index 92168048..5c9caf68 100644 --- a/enabler/src/de/schildbach/pte/VbbProvider.java +++ b/enabler/src/de/schildbach/pte/VbbProvider.java @@ -115,25 +115,42 @@ public class VbbProvider extends AbstractHafasProvider } } - private static final Pattern P_SPLIT_NAME_PAREN = Pattern.compile("(.*?) \\((.{4,}?)\\)(?: \\((U|S|S\\+U)\\))?"); + private static final Pattern P_SPLIT_NAME_SU = Pattern.compile("(.*?)(?:\\s+\\((S|U|S\\+U)\\))?"); + private static final Pattern P_SPLIT_NAME_BUS = Pattern.compile("(.*?)(\\s+\\[[^\\]]+\\])?"); @Override - protected String[] splitStationName(final String name) + protected String[] splitStationName(String name) { + final Matcher mSu = P_SPLIT_NAME_SU.matcher(name); + if (!mSu.matches()) + throw new IllegalStateException(name); + name = mSu.group(1); + final String su = mSu.group(2); + + final Matcher mBus = P_SPLIT_NAME_BUS.matcher(name); + if (!mBus.matches()) + throw new IllegalStateException(name); + name = mBus.group(1); + final Matcher mParen = P_SPLIT_NAME_PAREN.matcher(name); if (mParen.matches()) - { - final String su = mParen.group(3); - return new String[] { mParen.group(2), mParen.group(1) + (su != null ? " (" + su + ")" : "") }; - } + return new String[] { normalizePlace(mParen.group(2)), (su != null ? su + " " : "") + mParen.group(1) }; final Matcher mComma = P_SPLIT_NAME_FIRST_COMMA.matcher(name); if (mComma.matches()) - return new String[] { mComma.group(1), mComma.group(2) }; + return new String[] { normalizePlace(mComma.group(1)), mComma.group(2) }; return super.splitStationName(name); } + private String normalizePlace(final String place) + { + if ("Bln".equals(place)) + return "Berlin"; + else + return place; + } + @Override protected String[] splitAddress(final String address) {