Skip to content

TRIAS StopEventRequest #6510

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 79 commits into
base: dev-2.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
eb1dc16
Initial OJP request
leonardehrenfried Feb 7, 2025
f5db79b
Add initial TRIAS skeleton
leonardehrenfried Feb 7, 2025
e371af2
Add streaming response
leonardehrenfried Feb 7, 2025
85f34d2
Flesh out result
leonardehrenfried Feb 7, 2025
1d41491
Move method into Transformer
leonardehrenfried Feb 7, 2025
e4cacb7
Flesh out response
leonardehrenfried Feb 10, 2025
ce30db5
Handle language
leonardehrenfried Feb 10, 2025
0b57f53
Re-indent XSLT
leonardehrenfried Feb 10, 2025
51a4683
Simplify
leonardehrenfried Feb 10, 2025
d0a9cb4
Add API explorer
leonardehrenfried Feb 13, 2025
c82c1ba
Also map TRIAS requests
leonardehrenfried Feb 13, 2025
1a447b6
WIP
leonardehrenfried Feb 13, 2025
668e85f
Handle error condition
leonardehrenfried Feb 13, 2025
06f9a07
Clean up package structure
leonardehrenfried Feb 13, 2025
0e5e42f
Add optional features
leonardehrenfried Feb 14, 2025
c134dc3
Implement previous/onward calls
leonardehrenfried Feb 14, 2025
b87f683
Implement onward/previous calls
leonardehrenfried Feb 15, 2025
d6718cb
Look up language from feed info
leonardehrenfried Feb 16, 2025
5aba735
Add tests
leonardehrenfried Feb 16, 2025
3133934
Regenereate docs
leonardehrenfried Feb 17, 2025
a40229f
Auto-write file
leonardehrenfried Feb 17, 2025
bd71b03
Make feed id configurable
leonardehrenfried Feb 17, 2025
dd56077
Change default ID
leonardehrenfried Feb 17, 2025
41b986e
Remove extra dependency
leonardehrenfried Feb 17, 2025
33c954a
Implement arrival time
leonardehrenfried Feb 18, 2025
c5697e1
Add skip node for trias API
leonardehrenfried Feb 18, 2025
908365e
Small clean up
leonardehrenfried Feb 18, 2025
356fe6c
Extract coordinate from request
leonardehrenfried Feb 18, 2025
d0161e9
Implement GeoPosition-based searches
leonardehrenfried Feb 19, 2025
f0dc278
Implement GeoPosition request
leonardehrenfried Feb 19, 2025
0846eab
Add time window
leonardehrenfried Feb 19, 2025
997a3ba
Introduce filter request
leonardehrenfried Feb 20, 2025
57a7eb7
Implement numberOfDepartures
leonardehrenfried Feb 21, 2025
ab37b3d
Implement separate params
leonardehrenfried Feb 21, 2025
9ea41f2
Implement operator filter
leonardehrenfried Feb 21, 2025
3739f98
Implement line filter
leonardehrenfried Feb 21, 2025
eec6fd4
Improve line ref matching
leonardehrenfried Feb 22, 2025
82805c6
Fix explorer
leonardehrenfried Feb 22, 2025
71e531b
Remove outdated comment
leonardehrenfried Feb 27, 2025
41050a3
Remove TimeAtStop
leonardehrenfried Mar 2, 2025
2fd72a1
Implement inclusion/exclusion of lines/operators
leonardehrenfried Mar 2, 2025
bdcec74
Set version to 1.2
leonardehrenfried Mar 2, 2025
65d6a10
Add inclusion/exclusion of modes
leonardehrenfried Mar 2, 2025
3f1b003
Add inclusion/exclusion of modes
leonardehrenfried Mar 2, 2025
04971c6
Add test
leonardehrenfried Mar 2, 2025
e95f651
Remove unused code in TransitService
leonardehrenfried Mar 2, 2025
de9a0c8
Add test
leonardehrenfried Mar 3, 2025
9b7a287
Add test for TripTimeOnDate
leonardehrenfried Mar 3, 2025
2af2a90
Add documentation
leonardehrenfried Mar 3, 2025
b31aacc
Add test for previous/next
leonardehrenfried Mar 4, 2025
41bbcf0
Apply new formatting
leonardehrenfried Mar 4, 2025
73eafc7
Use artifact from org.opentripplanner
leonardehrenfried Mar 4, 2025
c3948b4
Clean up and docs
leonardehrenfried Mar 4, 2025
497bf16
Take UseRealtimeData into account
leonardehrenfried Mar 5, 2025
3e11cab
Implement maxDistance
leonardehrenfried Mar 5, 2025
10bfd62
Use new StopTimesHelper
leonardehrenfried Mar 6, 2025
f1ecbcf
Rename method and add Javadoc
leonardehrenfried Mar 12, 2025
59d85be
Add cancelled stop
leonardehrenfried Mar 12, 2025
c196e8e
Add cancellation
leonardehrenfried Mar 12, 2025
4d4811a
Allow specifying a sort order
leonardehrenfried Mar 13, 2025
0117064
Implement station lookup for stop point ref
leonardehrenfried Mar 13, 2025
bd15e5c
Move creation of filters into builder
leonardehrenfried Mar 13, 2025
c35fff9
Re-order package structure
leonardehrenfried Mar 14, 2025
e2134b5
Update docs
leonardehrenfried Mar 14, 2025
1090ade
Add direction ref
leonardehrenfried Mar 14, 2025
7af5f7d
Optimise performance by instantiating context only once
leonardehrenfried Mar 14, 2025
41adefc
Add XML to compressible mime types
leonardehrenfried Mar 17, 2025
e82862e
Use full trias namespace
leonardehrenfried Mar 17, 2025
308b489
Add test
leonardehrenfried Mar 17, 2025
213b218
Change language namespace
leonardehrenfried Mar 17, 2025
9c8379a
Update docs, add test
leonardehrenfried Mar 17, 2025
c0b5775
Configure time zone in TRIAS
leonardehrenfried Mar 18, 2025
52204f4
Make code slightly more readable
leonardehrenfried Mar 18, 2025
8762ba7
Improve time handling
leonardehrenfried Mar 18, 2025
e2082c5
Merge remote-tracking branch 'upstream/dev-2.x' into trias
leonardehrenfried Mar 31, 2025
f076fb1
Harmonise naming
leonardehrenfried Mar 31, 2025
fc3c446
Apply review feedback
leonardehrenfried Apr 2, 2025
d50146b
Harmonise plural/singular
leonardehrenfried Apr 2, 2025
88d0b59
Merge remote-tracking branch 'upstream/dev-2.x' into trias
leonardehrenfried Apr 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,12 @@
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
<!-- JAXB serialize Jersey response objects to XML. -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-jaxb</artifactId>
<version>${jersey.version}</version>
</dependency>
<!-- HK2 dependency injection framework for injecting context -->
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
Expand Down Expand Up @@ -378,6 +384,12 @@
<version>0.28.2</version>
</dependency>

<dependency>
<groupId>org.opentripplanner</groupId>
<artifactId>ojp-java-model</artifactId>
<version>2.0.0</version>
</dependency>

<!-- create zip test files-->
<dependency>
<groupId>org.apache.commons</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.opentripplanner.ext.ojp.id;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.opentripplanner.transit.model.framework.FeedScopedId;

class HideFeedIdResolverTest {

private static final HideFeedIdResolver RESOLVER = new HideFeedIdResolver("aaa");

@Test
void parse() {
var id = RESOLVER.parse("bbb");
assertEquals(new FeedScopedId("aaa", "bbb"), id);
}

@Test
void tostring() {
var id = RESOLVER.toString(new FeedScopedId("aaa", "bbb"));
assertEquals("bbb", id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.opentripplanner.ext.ojp.id;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.opentripplanner.transit.model.framework.FeedScopedId;

class UseFeedIdResolverTest {

private static final IdResolver RESOLVER = new UseFeedIdResolver();

@Test
void parse() {
var id = RESOLVER.parse("aaa:bbb");
assertEquals(new FeedScopedId("aaa", "bbb"), id);
}

@Test
void tostring() {
var id = RESOLVER.toString(new FeedScopedId("aaa", "bbb"));
assertEquals("aaa:bbb", id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.opentripplanner.ext.ojp.mapping;

import static org.junit.jupiter.api.Assertions.assertNotNull;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.opentripplanner.transit.model.basic.TransitMode;

class PtModeMapperTest {

@ParameterizedTest
@EnumSource(TransitMode.class)
void map(TransitMode mode) {
assertNotNull(PtModeMapper.map(mode));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
package org.opentripplanner.ext.ojp.service;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.opentripplanner.transit.model._data.TimetableRepositoryForTest.id;
import static org.opentripplanner.transit.model.basic.TransitMode.BUS;
import static org.opentripplanner.transit.model.basic.TransitMode.FERRY;

import de.vdv.ojp20.IndividualTransportOptionStructure;
import de.vdv.ojp20.ItModesStructure;
import de.vdv.ojp20.LineDirectionFilterStructure;
import de.vdv.ojp20.ModeFilterStructure;
import de.vdv.ojp20.OJPStopEventRequestStructure;
import de.vdv.ojp20.PersonalModesEnumeration;
import de.vdv.ojp20.PlaceContextStructure;
import de.vdv.ojp20.StopEventParamStructure;
import de.vdv.ojp20.siri.LineDirectionStructure;
import de.vdv.ojp20.siri.LineRefStructure;
import de.vdv.ojp20.siri.VehicleModesOfTransportEnumeration;
import java.math.BigInteger;
import java.time.ZonedDateTime;
import java.util.Set;
import org.junit.jupiter.api.Test;
import org.opentripplanner._support.time.ZoneIds;
import org.opentripplanner.ext.ojp.id.UseFeedIdResolver;
import org.opentripplanner.ext.ojp.service.OjpServiceMapper;
import org.opentripplanner.transit.model.framework.FeedScopedId;
import org.rutebanken.time.XmlDateTime;

class OjpServiceMapperTest {

private static final ZonedDateTime ZDT = ZonedDateTime.parse("2025-02-17T14:24:02+01:00");
private static final UseFeedIdResolver ID_RESOLVER = new UseFeedIdResolver();
private static final OjpServiceMapper SERVICE = new OjpServiceMapper(
null,
ID_RESOLVER,
ZoneIds.BERLIN
);

private static final FeedScopedId LINE_ID = id("line1");

@Test
void defaultCase() {
var params = SERVICE.extractStopEventParams(stopEvent(new StopEventParamStructure()));
assertThat(params.includedAgencies()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertThat(params.includedRoutes()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertThat(params.includedModes()).isEmpty();
assertThat(params.excludedModes()).isEmpty();
assertEquals(OjpServiceMapper.DEFAULT_RADIUS_METERS, params.maximumWalkDistance());
assertEquals(OjpServiceMapper.DEFAULT_NUM_DEPARTURES, params.numDepartures());
}

@Test
void maxDistance() {
var params = SERVICE.extractStopEventParams(
new OJPStopEventRequestStructure()
.withLocation(
new PlaceContextStructure()
.withDepArrTime(new XmlDateTime(ZDT))
.withIndividualTransportOption(
new IndividualTransportOptionStructure()
.withItModeAndModeOfOperation(
new ItModesStructure().withPersonalMode(PersonalModesEnumeration.FOOT)
)
.withMaxDistance(BigInteger.TEN)
)
)
);
assertEquals(10, params.maximumWalkDistance());
}

@Test
void numDepartures() {
var params = SERVICE.extractStopEventParams(
stopEvent(new StopEventParamStructure().withNumberOfResults(BigInteger.TWO))
);
assertEquals(2, params.numDepartures());
}

@Test
void lineFilterImplicitExclude() {
var params = SERVICE.extractStopEventParams(
lineFilter(
new LineDirectionFilterStructure()
.withLine(
new LineDirectionStructure()
.withLineRef(new LineRefStructure().withValue(LINE_ID.toString()))
)
)
);
assertThat(params.includedAgencies()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertThat(params.includedRoutes()).isEmpty();
assertEquals(Set.of(LINE_ID), params.excludedRoutes());
assertThat(params.includedModes()).isEmpty();
assertThat(params.excludedModes()).isEmpty();
}

@Test
void lineFilterInclude() {
var params = SERVICE.extractStopEventParams(
lineFilter(
new LineDirectionFilterStructure()
.withExclude(true)
.withLine(
new LineDirectionStructure()
.withLineRef(new LineRefStructure().withValue(LINE_ID.toString()))
)
)
);
assertThat(params.includedAgencies()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertThat(params.includedRoutes()).isEmpty();
assertEquals(Set.of(LINE_ID), params.excludedRoutes());
assertThat(params.includedModes()).isEmpty();
assertThat(params.excludedModes()).isEmpty();
}

@Test
void lineFilterExclude() {
var params = SERVICE.extractStopEventParams(
lineFilter(
new LineDirectionFilterStructure()
.withExclude(false)
.withLine(
new LineDirectionStructure()
.withLineRef(new LineRefStructure().withValue(LINE_ID.toString()))
)
)
);
assertThat(params.includedAgencies()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertEquals(Set.of(LINE_ID), params.includedRoutes());
assertThat(params.excludedRoutes()).isEmpty();
assertThat(params.includedModes()).isEmpty();
assertThat(params.excludedModes()).isEmpty();
}

@Test
void modeFilter() {
var params = SERVICE.extractStopEventParams(
stopEvent(
new StopEventParamStructure()
.withModeFilter(
new ModeFilterStructure()
.withPtMode(
VehicleModesOfTransportEnumeration.BUS,
VehicleModesOfTransportEnumeration.FERRY
)
)
)
);
assertThat(params.includedAgencies()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertThat(params.includedRoutes()).isEmpty();
assertThat(params.excludedRoutes()).isEmpty();
assertThat(params.includedModes()).isEmpty();
assertEquals(Set.of(BUS, FERRY), params.excludedModes());
}

@Test
void modeFilterExclude() {
var params = SERVICE.extractStopEventParams(
stopEvent(
new StopEventParamStructure()
.withModeFilter(
new ModeFilterStructure()
.withExclude(false)
.withPtMode(VehicleModesOfTransportEnumeration.BUS)
)
)
);
assertThat(params.includedAgencies()).isEmpty();
assertThat(params.excludedAgencies()).isEmpty();
assertThat(params.includedRoutes()).isEmpty();
assertThat(params.excludedRoutes()).isEmpty();
assertEquals(Set.of(BUS), params.includedModes());
assertThat(params.excludedModes()).isEmpty();
}

private static OJPStopEventRequestStructure lineFilter(LineDirectionFilterStructure value) {
return stopEvent(new StopEventParamStructure().withLineFilter(value));
}

private static OJPStopEventRequestStructure stopEvent(StopEventParamStructure p) {
return new OJPStopEventRequestStructure()
.withLocation(new PlaceContextStructure().withDepArrTime(new XmlDateTime(ZDT)))
.withParams(p);
}
}
Loading
Loading