implement client methods for reading messages

Reading response type 2 (messages) from API with optional stop filter.
This commit is contained in:
Stefan Kalscheuer 2019-11-04 17:40:10 +01:00
parent 4f3d8694e1
commit 5b6c02d6a3
6 changed files with 120 additions and 1 deletions

View File

@ -5,6 +5,9 @@ All notable changes to this project will be documented in this file.
### Security
* Updated dependencies
### Features
* Added support for reading messages, using `getMessages()` method (#5)
## 1.2.0 - 2019-06-20
### Security

View File

@ -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);
}
}
}

View File

@ -16,6 +16,7 @@
package de.stklcode.pubtrans.ura;
import de.stklcode.pubtrans.ura.model.Message;
import de.stklcode.pubtrans.ura.model.Stop;
import de.stklcode.pubtrans.ura.model.Trip;
import net.bytebuddy.ByteBuddy;
@ -331,6 +332,43 @@ public class UraClientTest {
}
@Test
public void getMessages() {
// Mock the HTTP call.
mockHttpToFile("instant_V1_messages.txt");
// Get messages without filter and verify some values.
List<Message> messages = new UraClient("mocked")
.getMessages();
assertThat(messages, hasSize(2));
assertThat(messages.get(0).getStop().getId(), is("100707"));
assertThat(messages.get(0).getUuid(), is("016e1231d4e30014_100707"));
assertThat(messages.get(1).getStop().getName(), is("Herzogenr. Rathaus"));
assertThat(messages.get(1).getUuid(), is("016e2cc3a3750006_210511"));
assertThat(messages.get(0).getType(), is(0));
assertThat(messages.get(1).getPriority(), is(0));
assertThat(messages.get(0).getText(), is("Sehr geehrte Fahrgäste, wegen Strassenbauarbeiten kann diese Haltestelle nicht von den Bussen der Linien 17, 44 und N2 angefahren werden."));
assertThat(messages.get(1).getText(), is("Sehr geehrte Fahrgäste, diese Haltestelle wird vorübergehend von den Linien 47, 147 und N3 nicht angefahren."));
}
@Test
public void getMessagesForStop() {
// Mock the HTTP call.
mockHttpToFile("instant_V2_messages_stop.txt");
// Get trips for stop ID 100707 (Berensberger Str.) and verify some values.
List<Message> messages = new UraClient("mocked")
.forStops("100707")
.getMessages();
assertThat(messages, hasSize(1));
assertThat(messages.stream().filter(t -> !t.getStop().getId().equals("100707")).findAny(), is(Optional.empty()));
assertThat(messages.get(0).getUuid(), is("016e1231d4e30014_100707"));
assertThat(messages.get(0).getType(), is(0));
assertThat(messages.get(0).getPriority(), is(3));
assertThat(messages.get(0).getText(), is("Sehr geehrte Fahrgäste, wegen Strassenbauarbeiten kann diese Haltestelle nicht von den Bussen der Linien 17, 44 und N2 angefahren werden."));
}
private static void mockHttpToFile(String newResourceFile) {
mockResource = newResourceFile;
}

View File

@ -29,7 +29,7 @@ import static org.hamcrest.core.Is.is;
import static org.junit.jupiter.api.Assertions.fail;
/**
* Unit test for the {@link Message} metamodel.
* Unit test for the {@link Message} meta model.
*
* @author Stefan Kalscheuer
*/

View File

@ -0,0 +1,3 @@
[4,"1.0",1572882473479]
[2,"Berensberger Str.","100707","",0,50.8087069,6.0607177,"016e1231d4e30014_100707",0,3,"Sehr geehrte Fahrgäste, wegen Strassenbauarbeiten kann diese Haltestelle nicht von den Bussen der Linien 17, 44 und N2 angefahren werden."]
[2,"Herzogenr. Rathaus","210511","",0,50.8718175,6.1025675,"016e2cc3a3750006_210511",0,0,"Sehr geehrte Fahrgäste, diese Haltestelle wird vorübergehend von den Linien 47, 147 und N3 nicht angefahren."]

View File

@ -0,0 +1,2 @@
[4,"2.0",1572882473479]
[2,"Berensberger Str.","100707","",0,50.8087069,6.0607177,"016e1231d4e30014_100707",0,3,"Sehr geehrte Fahrgäste, wegen Strassenbauarbeiten kann diese Haltestelle nicht von den Bussen der Linien 17, 44 und N2 angefahren werden."]