diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ee9930..441ffe4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,8 @@
-## 0.1.1 [2017-01-07]
+## 1.1.1 [work in progress]
+* [improvement] On connection or parsing errors, the `IOException` is no longer ignored, but encapsulated in `RuntimeException` (no StackTraces printed)
+* [internal] Code cleanup and minor improvements
+
+## 1.1.0 [2017-01-07]
* [feature] Filter stops by coordinates and radius
* [feature] Filter trips by destination and and towards fields
* [test] Test coverage 100% (line); tested against ASEAG and TFL APIs
diff --git a/pom.xml b/pom.xml
index 85e4ac2..b4964c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
de.stklcode.pubtrans
juraclient
- 1.1.0
+ 1.1.1-SNAPSHOT
UTF-8
diff --git a/src/main/java/de/stklcode/pubtrans/ura/model/Model.java b/src/main/java/de/stklcode/pubtrans/ura/model/Model.java
new file mode 100644
index 0000000..bc8b5be
--- /dev/null
+++ b/src/main/java/de/stklcode/pubtrans/ura/model/Model.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2016-2017 Stefan Kalscheuer
+ *
+ * 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 de.stklcode.pubtrans.ura.model;
+
+import java.io.IOException;
+
+/**
+ * @author Stefan Kalscheuer
+ * @since 1.1.1
+ */
+interface Model {
+ /**
+ * Generate exception for unmatched type when String is expected.
+ *
+ * @param field Field number.
+ * @param actual Actual class.
+ * @return The Exception.
+ */
+ static IOException typeErrorString(int field, Class actual) {
+ return typeError(field, actual, "String");
+ }
+
+ /**
+ * Generate exception for unmatched type.
+ *
+ * @param field Field number.
+ * @param actual Actual class.
+ * @param expected Expected type.
+ * @return The Exception.
+ */
+ static IOException typeError(int field, Class actual, String expected) {
+ return new IOException(String.format("Field %d not of expected type %s, found %s",
+ field, expected, actual.getSimpleName()));
+ }
+}
diff --git a/src/main/java/de/stklcode/pubtrans/ura/model/Stop.java b/src/main/java/de/stklcode/pubtrans/ura/model/Stop.java
index 4710cc2..49169cf 100644
--- a/src/main/java/de/stklcode/pubtrans/ura/model/Stop.java
+++ b/src/main/java/de/stklcode/pubtrans/ura/model/Stop.java
@@ -24,14 +24,14 @@ import java.util.List;
*
* @author Stefan Kalscheuer
*/
-public final class Stop {
- private static final int STOP_NAME = 1;
- private static final int STOP_ID = 2;
- private static final int INDICATOR = 3;
- private static final int STATE = 4;
- private static final int LATITUDE = 5;
- private static final int LONGITUDE = 6;
- private static final int NUM_OF_FIELDS = 7;
+public final class Stop implements Model {
+ private static final int F_STOP_NAME = 1;
+ private static final int F_STOP_ID = 2;
+ private static final int F_INDICATOR = 3;
+ private static final int F_STATE = 4;
+ private static final int F_LATITUDE = 5;
+ private static final int F_LONGITUDE = 6;
+ private static final int F_NUM_OF_FIELDS = 7;
private final String id;
private final String name;
@@ -71,52 +71,46 @@ public final class Stop {
* @throws IOException Thrown on invalid line format.
*/
public Stop(final List raw) throws IOException {
- if (raw == null || raw.size() < NUM_OF_FIELDS) {
+ if (raw == null || raw.size() < F_NUM_OF_FIELDS) {
throw new IOException("Invalid number of fields");
}
if (raw.get(1) instanceof String) {
- name = (String) raw.get(STOP_NAME);
+ name = (String) raw.get(F_STOP_NAME);
} else {
- throw new IOException("Field " + STOP_NAME + " not of expected type String, found "
- + raw.get(STOP_NAME).getClass().getSimpleName());
+ throw Model.typeErrorString(F_STOP_NAME, raw.get(F_STOP_NAME).getClass());
}
- if (raw.get(STOP_ID) instanceof String) {
- id = (String) raw.get(STOP_ID);
+ if (raw.get(F_STOP_ID) instanceof String) {
+ id = (String) raw.get(F_STOP_ID);
} else {
- throw new IOException("Field " + STOP_ID + " not of expected type String, found "
- + raw.get(STOP_ID).getClass().getSimpleName());
+ throw Model.typeErrorString(F_STOP_ID, raw.get(F_STOP_ID).getClass());
}
- if (raw.get(INDICATOR) instanceof String) {
- indicator = (String) raw.get(INDICATOR);
- } else if (raw.get(INDICATOR) == null) {
+ if (raw.get(F_INDICATOR) instanceof String) {
+ indicator = (String) raw.get(F_INDICATOR);
+ } else if (raw.get(F_INDICATOR) == null) {
indicator = null;
- } else {
- throw new IOException("Field " + INDICATOR + " not of expected type String, found "
- + raw.get(INDICATOR).getClass().getSimpleName());
+ } else {
+ throw Model.typeErrorString(F_INDICATOR, raw.get(F_INDICATOR).getClass());
}
- if (raw.get(STATE) instanceof Integer) {
- state = (Integer) raw.get(STATE);
+ if (raw.get(F_STATE) instanceof Integer) {
+ state = (Integer) raw.get(F_STATE);
} else {
- throw new IOException("Field " + STATE + " not of expected type Integer, found "
- + raw.get(STATE).getClass().getSimpleName());
+ throw Model.typeError(F_STATE, raw.get(F_STATE).getClass(), "Integer");
}
- if (raw.get(LATITUDE) instanceof Double) {
- latitude = (Double) raw.get(LATITUDE);
+ if (raw.get(F_LATITUDE) instanceof Double) {
+ latitude = (Double) raw.get(F_LATITUDE);
} else {
- throw new IOException("Field " + LATITUDE + " not of expected type Double, found "
- + raw.get(LATITUDE).getClass().getSimpleName());
+ throw Model.typeError(F_LATITUDE, raw.get(F_LATITUDE).getClass(), "Double");
}
- if (raw.get(LONGITUDE) instanceof Double) {
- longitude = (Double) raw.get(LONGITUDE);
+ if (raw.get(F_LONGITUDE) instanceof Double) {
+ longitude = (Double) raw.get(F_LONGITUDE);
} else {
- throw new IOException("Field " + LONGITUDE + " not of expected type Double, found "
- + raw.get(LONGITUDE).getClass().getSimpleName());
+ throw Model.typeError(F_LONGITUDE, raw.get(F_LONGITUDE).getClass(), "Double");
}
}
diff --git a/src/main/java/de/stklcode/pubtrans/ura/model/Trip.java b/src/main/java/de/stklcode/pubtrans/ura/model/Trip.java
index bf1035b..ec540ed 100644
--- a/src/main/java/de/stklcode/pubtrans/ura/model/Trip.java
+++ b/src/main/java/de/stklcode/pubtrans/ura/model/Trip.java
@@ -24,7 +24,7 @@ import java.util.List;
*
* @author Stefan Kalscheuer
*/
-public final class Trip {
+public final class Trip implements Model {
private static final int VISIT_ID = 7;
private static final int LINE_ID = 8;
private static final int LINE_NAME = 9;
@@ -161,22 +161,19 @@ public final class Trip {
if (raw.get(VISIT_ID) instanceof Integer) {
visitID = (Integer) raw.get(VISIT_ID);
} else {
- throw new IOException("Field " + VISIT_ID + " not of expected type Integer, found "
- + raw.get(VISIT_ID).getClass().getSimpleName());
+ throw Model.typeError(VISIT_ID, raw.get(VISIT_ID).getClass(), "Integer");
}
if (raw.get(LINE_ID) instanceof String) {
lineID = (String) raw.get(LINE_ID);
} else {
- throw new IOException("Field " + LINE_ID + " not of expected type String, found "
- + raw.get(LINE_ID).getClass().getSimpleName());
+ throw Model.typeErrorString(LINE_ID, raw.get(LINE_ID).getClass());
}
if (raw.get(LINE_NAME) instanceof String) {
lineName = (String) raw.get(LINE_NAME);
} else {
- throw new IOException("Field " + LINE_NAME + " not of expected type String, found "
- + raw.get(LINE_NAME).getClass().getSimpleName());
+ throw Model.typeErrorString(LINE_NAME, raw.get(LINE_NAME).getClass());
}
if (raw.get(DIRECTION_ID) instanceof Integer) {
@@ -185,22 +182,19 @@ public final class Trip {
throw new IOException("Direction out of range. Expected 1 or 2, found " + directionID);
}
} else {
- throw new IOException("Field " + DIRECTION_ID + " not of expected type Integer, found "
- + raw.get(DIRECTION_ID).getClass().getSimpleName());
+ throw Model.typeError(DIRECTION_ID, raw.get(DIRECTION_ID).getClass(), "Integer");
}
if (raw.get(DESTINATION_NAME) instanceof String) {
destinationName = (String) raw.get(DESTINATION_NAME);
} else {
- throw new IOException("Field " + DESTINATION_NAME + " not of expected type String, found "
- + raw.get(DESTINATION_NAME).getClass().getSimpleName());
+ throw Model.typeErrorString(DESTINATION_NAME, raw.get(DESTINATION_NAME).getClass());
}
if (raw.get(DESTINATION_TEXT) instanceof String) {
destinationText = (String) raw.get(DESTINATION_TEXT);
} else {
- throw new IOException("Field " + DESTINATION_TEXT + " not of expected type String, found "
- + raw.get(DESTINATION_TEXT).getClass().getSimpleName());
+ throw Model.typeErrorString(DESTINATION_TEXT, raw.get(DESTINATION_TEXT).getClass());
}
/* TFL and ASEAG deliver different types with the same API version, so this field is a little more tolerant */
@@ -209,8 +203,7 @@ public final class Trip {
|| raw.get(VEHICLE_ID) instanceof Long) {
vehicleID = raw.get(VEHICLE_ID).toString();
} else {
- throw new IOException("Field " + VEHICLE_ID + " not of expected type String/Integer/Long, found "
- + raw.get(VEHICLE_ID).getClass().getSimpleName());
+ throw Model.typeError(VEHICLE_ID, raw.get(VEHICLE_ID).getClass(), "String/Integer/Long");
}
if (raw.get(TRIP_ID) instanceof String
@@ -218,15 +211,13 @@ public final class Trip {
|| raw.get(TRIP_ID) instanceof Long) {
id = raw.get(TRIP_ID).toString();
} else {
- throw new IOException("Field " + TRIP_ID + " not of expected type String/Integer/Long, found "
- + raw.get(TRIP_ID).getClass().getSimpleName());
+ throw Model.typeError(TRIP_ID, raw.get(TRIP_ID).getClass(), "String/Integer/Long");
}
if (raw.get(ESTIMATED_TIME) instanceof Long) {
estimatedTime = (Long) raw.get(ESTIMATED_TIME);
} else {
- throw new IOException("Field " + ESTIMATED_TIME + " not of expected type Long, found "
- + raw.get(ESTIMATED_TIME).getClass().getSimpleName());
+ throw Model.typeError(ESTIMATED_TIME, raw.get(ESTIMATED_TIME).getClass(), "Long");
}
}