Merge pull request #7 from stklcode/feature/5-messages
fetch public messages from API (#5)
This commit is contained in:
@ -17,6 +17,7 @@
|
||||
package de.stklcode.pubtrans.ura;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import de.stklcode.pubtrans.ura.model.Message;
|
||||
import de.stklcode.pubtrans.ura.model.Stop;
|
||||
import de.stklcode.pubtrans.ura.model.Trip;
|
||||
import de.stklcode.pubtrans.ura.reader.AsyncUraTripReader;
|
||||
@ -58,14 +59,21 @@ public class UraClient implements Serializable {
|
||||
private static final String PAR_ESTTIME = "EstimatedTime";
|
||||
private static final String PAR_TOWARDS = "Towards";
|
||||
private static final String PAR_CIRCLE = "Circle";
|
||||
private static final String PAR_MSG_UUID = "MessageUUID";
|
||||
private static final String PAR_MSG_TYPE = "MessageType";
|
||||
private static final String PAR_MSG_PRIORITY = "MessagePriority";
|
||||
private static final String PAR_MSG_TEXT = "MessageText";
|
||||
|
||||
private static final Integer RES_TYPE_STOP = 0;
|
||||
private static final Integer RES_TYPE_PREDICTION = 1;
|
||||
private static final Integer RES_TYPE_FLEX_MESSAGE = 2;
|
||||
private static final Integer RES_TYPE_URA_VERSION = 4;
|
||||
|
||||
private static final String[] REQUEST_STOP = {PAR_STOP_NAME, PAR_STOP_ID, PAR_STOP_INDICATOR, PAR_STOP_STATE, PAR_GEOLOCATION};
|
||||
private static final String[] REQUEST_TRIP = {PAR_STOP_NAME, PAR_STOP_ID, PAR_STOP_INDICATOR, PAR_STOP_STATE, PAR_GEOLOCATION,
|
||||
PAR_VISIT_NUMBER, PAR_LINE_ID, PAR_LINE_NAME, PAR_DIR_ID, PAR_DEST_NAME, PAR_DEST_TEXT, PAR_VEHICLE_ID, PAR_TRIP_ID, PAR_ESTTIME};
|
||||
private static final String[] REQUEST_MESSAGE = {PAR_STOP_NAME, PAR_STOP_ID, PAR_STOP_INDICATOR, PAR_STOP_STATE, PAR_GEOLOCATION,
|
||||
PAR_MSG_UUID, PAR_MSG_TYPE, PAR_MSG_PRIORITY, PAR_MSG_TEXT};
|
||||
|
||||
private final String baseURL;
|
||||
private final String instantURL;
|
||||
@ -309,6 +317,61 @@ public class UraClient implements Serializable {
|
||||
return stops;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of messages.
|
||||
*
|
||||
* @return List of messages.
|
||||
* @since 1.3
|
||||
*/
|
||||
public List<Message> getMessages() {
|
||||
return getMessages(new Query(), null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get list of messages.
|
||||
* If forStops() has been called, those will be used as filter.
|
||||
*
|
||||
* @param query The query.
|
||||
* @return List of trips.
|
||||
* @since 1.3
|
||||
*/
|
||||
public List<Message> getMessages(final Query query) {
|
||||
return getMessages(query, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of messages for given stopIDs with result limit.
|
||||
*
|
||||
* @param query The query.
|
||||
* @param limit Maximum number of results.
|
||||
* @return List of trips.
|
||||
* @since 1.3
|
||||
*/
|
||||
public List<Message> getMessages(final Query query, final Integer limit) {
|
||||
List<Message> messages = new ArrayList<>();
|
||||
try (InputStream is = requestInstant(REQUEST_MESSAGE, query);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
|
||||
String version = null;
|
||||
String line = br.readLine();
|
||||
while (line != null && (limit == null || messages.size() < limit)) {
|
||||
List l = mapper.readValue(line, List.class);
|
||||
/* Check if result exists and has correct response type */
|
||||
if (l != null && !l.isEmpty()) {
|
||||
if (l.get(0).equals(RES_TYPE_URA_VERSION)) {
|
||||
version = l.get(1).toString();
|
||||
} else if (l.get(0).equals(RES_TYPE_FLEX_MESSAGE)) {
|
||||
messages.add(new Message(l, version));
|
||||
}
|
||||
}
|
||||
line = br.readLine();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException("Failed to read from API", e);
|
||||
}
|
||||
return messages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Issue request to instant endpoint and return input stream.
|
||||
*
|
||||
@ -517,5 +580,15 @@ public class UraClient implements Serializable {
|
||||
public AsyncUraTripReader getTripsStream(List<Consumer<Trip>> consumers) throws IOException {
|
||||
return UraClient.this.getTripsStream(this, consumers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get trips for set filters.
|
||||
*
|
||||
* @return List of matching messages.
|
||||
* @since 1.3
|
||||
*/
|
||||
public List<Message> getMessages() {
|
||||
return UraClient.this.getMessages(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
165
src/main/java/de/stklcode/pubtrans/ura/model/Message.java
Normal file
165
src/main/java/de/stklcode/pubtrans/ura/model/Message.java
Normal file
@ -0,0 +1,165 @@
|
||||
package de.stklcode.pubtrans.ura.model;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Entity for a message.
|
||||
*
|
||||
* @author Stefan Kalscheuer
|
||||
* @since 1.3
|
||||
*/
|
||||
public class Message implements Model {
|
||||
private static final int MSG_UUID = 7;
|
||||
private static final int MSG_TYPE = 8;
|
||||
private static final int MSG_PRIORITY = 9;
|
||||
private static final int MSG_TEXT = 10;
|
||||
private static final int NUM_OF_FIELDS = 11;
|
||||
|
||||
private final Stop stop;
|
||||
private final String uuid;
|
||||
private final Integer type;
|
||||
private final Integer priority;
|
||||
private final String text;
|
||||
|
||||
/**
|
||||
* Construct Message object from complete set of data.
|
||||
*
|
||||
* @param stopID Stop ID.
|
||||
* @param stopName Stop name.
|
||||
* @param stopIndicator Stop Indicator.
|
||||
* @param stopState Stop state.
|
||||
* @param stopLatitude Stop geolocation latitude.
|
||||
* @param stopLongitude Stop geolocation latitude.
|
||||
* @param msgUUID Message UUID.
|
||||
* @param msgType Message type.
|
||||
* @param msgPriority Message priority.
|
||||
* @param msgText Message text.
|
||||
*/
|
||||
public Message(final String stopID,
|
||||
final String stopName,
|
||||
final String stopIndicator,
|
||||
final Integer stopState,
|
||||
final Double stopLatitude,
|
||||
final Double stopLongitude,
|
||||
final String msgUUID,
|
||||
final Integer msgType,
|
||||
final Integer msgPriority,
|
||||
final String msgText) {
|
||||
this(new Stop(stopID,
|
||||
stopName,
|
||||
stopIndicator,
|
||||
stopState,
|
||||
stopLatitude,
|
||||
stopLongitude),
|
||||
msgUUID,
|
||||
msgType,
|
||||
msgPriority,
|
||||
msgText);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct Message object from Stop model and set of additional data.
|
||||
*
|
||||
* @param stop Stop model
|
||||
* @param msgUUID Message UUID.
|
||||
* @param msgType Message type.
|
||||
* @param msgPriority Message priority.
|
||||
* @param msgText Message text.
|
||||
*/
|
||||
public Message(final Stop stop,
|
||||
final String msgUUID,
|
||||
final Integer msgType,
|
||||
final Integer msgPriority,
|
||||
final String msgText) {
|
||||
this.stop = stop;
|
||||
this.uuid = msgUUID;
|
||||
this.type = msgType;
|
||||
this.priority = msgPriority;
|
||||
this.text = msgText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct Message object from raw list of attributes parsed from JSON.
|
||||
*
|
||||
* @param raw List of attributes from JSON line
|
||||
* @throws IOException Thrown on invalid line format.
|
||||
*/
|
||||
public Message(final List raw) throws IOException {
|
||||
this(raw, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct Message object from raw list of attributes parsed from JSON with explicitly specified version.
|
||||
*
|
||||
* @param raw List of attributes from JSON line
|
||||
* @param version API version
|
||||
* @throws IOException Thrown on invalid line format.
|
||||
*/
|
||||
public Message(final List raw, final String version) throws IOException {
|
||||
if (raw == null || raw.size() < NUM_OF_FIELDS) {
|
||||
throw new IOException("Invalid number of fields");
|
||||
}
|
||||
|
||||
stop = new Stop(raw);
|
||||
|
||||
if (raw.get(MSG_UUID) instanceof String) {
|
||||
uuid = (String) raw.get(MSG_UUID);
|
||||
} else {
|
||||
throw Model.typeErrorString(MSG_UUID, raw.get(MSG_UUID).getClass());
|
||||
}
|
||||
|
||||
if (raw.get(MSG_TYPE) instanceof Integer) {
|
||||
type = (Integer) raw.get(MSG_TYPE);
|
||||
} else {
|
||||
throw Model.typeError(MSG_TYPE, raw.get(MSG_TYPE).getClass(), "Integer");
|
||||
}
|
||||
|
||||
if (raw.get(MSG_PRIORITY) instanceof Integer) {
|
||||
priority = (Integer) raw.get(MSG_PRIORITY);
|
||||
} else {
|
||||
throw Model.typeError(MSG_PRIORITY, raw.get(MSG_PRIORITY).getClass(), "Integer");
|
||||
}
|
||||
|
||||
if (raw.get(MSG_TEXT) instanceof String) {
|
||||
text = (String) raw.get(MSG_TEXT);
|
||||
} else {
|
||||
throw Model.typeErrorString(MSG_TEXT, raw.get(MSG_TEXT).getClass());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The affected stop.
|
||||
*/
|
||||
public Stop getStop() {
|
||||
return stop;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Message's unique identifier.
|
||||
*/
|
||||
public String getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Message type.
|
||||
*/
|
||||
public Integer getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Message priority. Lower value equals higher priority.
|
||||
*/
|
||||
public Integer getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Message text.
|
||||
*/
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user