Skip to content

Commit e6b3840

Browse files
committed
Extract base classes to reduce request and search DTO boilerplate.
Pull duplicated fields and request-building logic into shared abstract base classes, leaning on Lombok's @SuperBuilder/@Getter/@EqualsAndHashCode (callSuper = true) in place of the per-class @Value/@Builder/@DaTa setup. Search DTOs: - Add an abstract BaseSearch holding the fields common to ArrivalSearch and DepartureSearch in the postcodes, routes, timefilter, timefilterfast, timemap and zones packages; the concrete classes now only declare their distinguishing fields (e.g. arrivalTime / departureTime). - Merge the identical timemapfast ManyToOne and OneToMany into a single Search class and reference it from ArrivalSearches. Request DTOs: - Add BaseTravelTimePostRequest centralising POST request creation behind abstract endpoint() and acceptType() hooks, and move createPostRequest out of TravelTimeRequest into it. - Add BaseTimeMapRequest / BaseTimeMapFastRequest sharing the departure, arrival, intersections and unions fields plus the endpoint across the TimeMap(Fast) JSON, WKT, KML, GeoJSON and boxes variants. - TravelTimeRequest gains @SuperBuilder/@NoArgsConstructor and exposes the JSON media type as protected for the subclasses. Tests & fixtures: - Update request unit tests and the expected JSON fixtures to match the new field serialisation order (inherited base fields are emitted before the subclass-specific ones).
1 parent 6d2240d commit e6b3840

56 files changed

Lines changed: 745 additions & 1074 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.traveltime.sdk.dto.requests;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.traveltime.sdk.dto.requests.timemapfast.ArrivalSearches;
5+
import lombok.*;
6+
import lombok.experimental.SuperBuilder;
7+
8+
@SuperBuilder
9+
@Getter
10+
@EqualsAndHashCode(callSuper = true)
11+
@JsonInclude(JsonInclude.Include.NON_NULL)
12+
@NoArgsConstructor
13+
public abstract class BaseTimeMapFastRequest<T> extends BaseTravelTimePostRequest<T> {
14+
15+
@NonNull
16+
ArrivalSearches arrivalSearches;
17+
18+
@Override
19+
protected String endpoint() {
20+
return "time-map/fast";
21+
}
22+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.traveltime.sdk.dto.requests;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.traveltime.sdk.dto.requests.timemap.*;
5+
import jakarta.validation.Valid;
6+
import java.util.List;
7+
import lombok.*;
8+
import lombok.experimental.SuperBuilder;
9+
10+
@SuperBuilder
11+
@Getter
12+
@EqualsAndHashCode(callSuper = true)
13+
@JsonInclude(JsonInclude.Include.NON_NULL)
14+
@NoArgsConstructor
15+
public abstract class BaseTimeMapRequest<T> extends BaseTravelTimePostRequest<T> {
16+
17+
@Valid
18+
@Singular
19+
List<DepartureSearch> departureSearches;
20+
21+
@Valid
22+
@Singular
23+
List<ArrivalSearch> arrivalSearches;
24+
25+
@Singular
26+
List<Intersection> intersections;
27+
28+
@Singular
29+
List<Union> unions;
30+
31+
@Override
32+
protected String endpoint() {
33+
return "time-map";
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.traveltime.sdk.dto.requests;
2+
3+
import com.traveltime.sdk.auth.TravelTimeCredentials;
4+
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
5+
import com.traveltime.sdk.utils.*;
6+
import io.vavr.control.Either;
7+
import lombok.NoArgsConstructor;
8+
import lombok.experimental.SuperBuilder;
9+
import lombok.val;
10+
import okhttp3.*;
11+
12+
@SuperBuilder
13+
@NoArgsConstructor
14+
public abstract class BaseTravelTimePostRequest<T> extends TravelTimeRequest<T> {
15+
16+
protected abstract String endpoint();
17+
18+
protected abstract AcceptType acceptType();
19+
20+
@Override
21+
public final Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
22+
val uri = baseUri.newBuilder().addPathSegments(endpoint()).build();
23+
return JsonUtils.toJson(this).map(json -> createPostRequest(credentials, uri, json));
24+
}
25+
26+
protected final Request createPostRequest(TravelTimeCredentials credentials, HttpUrl url, String jsonString) {
27+
return new Request.Builder()
28+
.url(url)
29+
.headers(credentials.getHeaders())
30+
.addHeader("Accept", acceptType().getValue())
31+
.addHeader("User-Agent", "Travel Time Java SDK " + Version.getVersion())
32+
.post(RequestBody.create(jsonString, JSON))
33+
.build();
34+
}
35+
}

src/main/java/com/traveltime/sdk/dto/requests/RoutesRequest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,23 @@
11
package com.traveltime.sdk.dto.requests;
22

33
import com.fasterxml.jackson.annotation.JsonInclude;
4-
import com.traveltime.sdk.auth.TravelTimeCredentials;
54
import com.traveltime.sdk.dto.common.Location;
65
import com.traveltime.sdk.dto.requests.routes.ArrivalSearch;
76
import com.traveltime.sdk.dto.requests.routes.DepartureSearch;
87
import com.traveltime.sdk.dto.responses.RoutesResponse;
9-
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
108
import com.traveltime.sdk.utils.AcceptType;
11-
import com.traveltime.sdk.utils.JsonUtils;
12-
import io.vavr.control.Either;
139
import jakarta.validation.Valid;
1410
import java.util.List;
1511
import lombok.*;
1612
import lombok.extern.jackson.Jacksonized;
17-
import okhttp3.HttpUrl;
18-
import okhttp3.Request;
1913

2014
@Data
2115
@Builder
2216
@Jacksonized
2317
@AllArgsConstructor
2418
@EqualsAndHashCode(callSuper = true)
2519
@JsonInclude(JsonInclude.Include.NON_NULL)
26-
public class RoutesRequest extends TravelTimeRequest<RoutesResponse> {
20+
public class RoutesRequest extends BaseTravelTimePostRequest<RoutesResponse> {
2721
@NonNull
2822
@Singular
2923
List<Location> locations;
@@ -37,10 +31,13 @@ public class RoutesRequest extends TravelTimeRequest<RoutesResponse> {
3731
List<ArrivalSearch> arrivalSearches;
3832

3933
@Override
40-
public Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
41-
val uri = baseUri.newBuilder().addPathSegments("routes").build();
42-
return JsonUtils.toJson(this)
43-
.map(json -> createPostRequest(credentials, uri, json, AcceptType.APPLICATION_JSON));
34+
protected String endpoint() {
35+
return "routes";
36+
}
37+
38+
@Override
39+
protected AcceptType acceptType() {
40+
return AcceptType.APPLICATION_JSON;
4441
}
4542

4643
@Override

src/main/java/com/traveltime/sdk/dto/requests/SupportedLocationsRequest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
11
package com.traveltime.sdk.dto.requests;
22

3-
import com.traveltime.sdk.auth.TravelTimeCredentials;
43
import com.traveltime.sdk.dto.common.Location;
54
import com.traveltime.sdk.dto.responses.SupportedLocationsResponse;
6-
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
75
import com.traveltime.sdk.utils.AcceptType;
8-
import com.traveltime.sdk.utils.JsonUtils;
9-
import io.vavr.control.Either;
106
import java.util.List;
117
import lombok.*;
128
import lombok.extern.jackson.Jacksonized;
13-
import okhttp3.HttpUrl;
14-
import okhttp3.Request;
159

1610
@Data
1711
@Builder
1812
@Jacksonized
1913
@AllArgsConstructor
2014
@EqualsAndHashCode(callSuper = true)
21-
public class SupportedLocationsRequest extends TravelTimeRequest<SupportedLocationsResponse> {
15+
public class SupportedLocationsRequest extends BaseTravelTimePostRequest<SupportedLocationsResponse> {
2216
@NonNull
2317
@Singular
2418
List<Location> locations;
2519

2620
@Override
27-
public Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
28-
val uri = baseUri.newBuilder().addPathSegments("supported-locations").build();
29-
return JsonUtils.toJson(this)
30-
.map(json -> createPostRequest(credentials, uri, json, AcceptType.APPLICATION_JSON));
21+
protected String endpoint() {
22+
return "supported-locations";
23+
}
24+
25+
@Override
26+
protected AcceptType acceptType() {
27+
return AcceptType.APPLICATION_JSON;
3128
}
3229

3330
@Override

src/main/java/com/traveltime/sdk/dto/requests/TimeFilterDistrictsRequest.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,33 @@
11
package com.traveltime.sdk.dto.requests;
22

3-
import com.traveltime.sdk.auth.TravelTimeCredentials;
4-
import com.traveltime.sdk.dto.requests.zones.*;
3+
import com.traveltime.sdk.dto.requests.zones.ArrivalSearch;
4+
import com.traveltime.sdk.dto.requests.zones.DepartureSearch;
55
import com.traveltime.sdk.dto.responses.TimeFilterDistrictsResponse;
6-
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
76
import com.traveltime.sdk.utils.AcceptType;
8-
import com.traveltime.sdk.utils.JsonUtils;
9-
import io.vavr.control.Either;
107
import java.util.List;
118
import lombok.*;
129
import lombok.extern.jackson.Jacksonized;
13-
import okhttp3.HttpUrl;
14-
import okhttp3.Request;
1510

1611
@Data
1712
@Builder
1813
@Jacksonized
1914
@AllArgsConstructor
2015
@EqualsAndHashCode(callSuper = true)
21-
public class TimeFilterDistrictsRequest extends TravelTimeRequest<TimeFilterDistrictsResponse> {
16+
public class TimeFilterDistrictsRequest extends BaseTravelTimePostRequest<TimeFilterDistrictsResponse> {
2217
@Singular
2318
List<DepartureSearch> departureSearches;
2419

2520
@Singular
2621
List<ArrivalSearch> arrivalSearches;
2722

2823
@Override
29-
public Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
30-
val uri = baseUri.newBuilder()
31-
.addPathSegments("time-filter/postcode-districts")
32-
.build();
33-
return JsonUtils.toJson(this)
34-
.map(json -> createPostRequest(credentials, uri, json, AcceptType.APPLICATION_JSON));
24+
protected String endpoint() {
25+
return "time-filter/postcode-districts";
26+
}
27+
28+
@Override
29+
protected AcceptType acceptType() {
30+
return AcceptType.APPLICATION_JSON;
3531
}
3632

3733
@Override

src/main/java/com/traveltime/sdk/dto/requests/TimeFilterFastRequest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
package com.traveltime.sdk.dto.requests;
22

3-
import com.traveltime.sdk.auth.TravelTimeCredentials;
43
import com.traveltime.sdk.dto.common.Location;
54
import com.traveltime.sdk.dto.requests.timefilterfast.ArrivalSearches;
65
import com.traveltime.sdk.dto.responses.TimeFilterFastResponse;
7-
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
86
import com.traveltime.sdk.utils.AcceptType;
9-
import com.traveltime.sdk.utils.JsonUtils;
10-
import io.vavr.control.Either;
117
import java.util.List;
128
import lombok.*;
139
import lombok.extern.jackson.Jacksonized;
14-
import okhttp3.HttpUrl;
15-
import okhttp3.Request;
1610

1711
@Data
1812
@Builder
1913
@Jacksonized
2014
@AllArgsConstructor
2115
@EqualsAndHashCode(callSuper = true)
22-
public class TimeFilterFastRequest extends TravelTimeRequest<TimeFilterFastResponse> {
16+
public class TimeFilterFastRequest extends BaseTravelTimePostRequest<TimeFilterFastResponse> {
2317
@NonNull
2418
@Singular
2519
List<Location> locations;
@@ -28,10 +22,13 @@ public class TimeFilterFastRequest extends TravelTimeRequest<TimeFilterFastRespo
2822
ArrivalSearches arrivalSearches;
2923

3024
@Override
31-
public Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
32-
val uri = baseUri.newBuilder().addPathSegments("time-filter/fast").build();
33-
return JsonUtils.toJson(this)
34-
.map(json -> createPostRequest(credentials, uri, json, AcceptType.APPLICATION_JSON));
25+
protected String endpoint() {
26+
return "time-filter/fast";
27+
}
28+
29+
@Override
30+
protected AcceptType acceptType() {
31+
return AcceptType.APPLICATION_JSON;
3532
}
3633

3734
@Override

src/main/java/com/traveltime/sdk/dto/requests/TimeFilterPostcodesRequest.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
package com.traveltime.sdk.dto.requests;
22

3-
import com.traveltime.sdk.auth.TravelTimeCredentials;
4-
import com.traveltime.sdk.dto.requests.postcodes.*;
3+
import com.traveltime.sdk.dto.requests.postcodes.ArrivalSearch;
4+
import com.traveltime.sdk.dto.requests.postcodes.DepartureSearch;
55
import com.traveltime.sdk.dto.responses.TimeFilterPostcodesResponse;
6-
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
76
import com.traveltime.sdk.utils.AcceptType;
8-
import com.traveltime.sdk.utils.JsonUtils;
9-
import io.vavr.control.Either;
107
import jakarta.validation.Valid;
118
import java.util.List;
129
import lombok.*;
1310
import lombok.extern.jackson.Jacksonized;
14-
import okhttp3.HttpUrl;
15-
import okhttp3.Request;
1611

1712
@Data
1813
@Builder
1914
@Jacksonized
2015
@AllArgsConstructor
2116
@EqualsAndHashCode(callSuper = true)
22-
public class TimeFilterPostcodesRequest extends TravelTimeRequest<TimeFilterPostcodesResponse> {
17+
public class TimeFilterPostcodesRequest extends BaseTravelTimePostRequest<TimeFilterPostcodesResponse> {
2318
@Valid
2419
@Singular
2520
List<DepartureSearch> departureSearches;
@@ -29,10 +24,13 @@ public class TimeFilterPostcodesRequest extends TravelTimeRequest<TimeFilterPost
2924
List<ArrivalSearch> arrivalSearches;
3025

3126
@Override
32-
public Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
33-
val uri = baseUri.newBuilder().addPathSegments("time-filter/postcodes").build();
34-
return JsonUtils.toJson(this)
35-
.map(json -> createPostRequest(credentials, uri, json, AcceptType.APPLICATION_JSON));
27+
protected String endpoint() {
28+
return "time-filter/postcodes";
29+
}
30+
31+
@Override
32+
protected AcceptType acceptType() {
33+
return AcceptType.APPLICATION_JSON;
3634
}
3735

3836
@Override

src/main/java/com/traveltime/sdk/dto/requests/TimeFilterRequest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,23 @@
11
package com.traveltime.sdk.dto.requests;
22

33
import com.fasterxml.jackson.annotation.JsonInclude;
4-
import com.traveltime.sdk.auth.TravelTimeCredentials;
54
import com.traveltime.sdk.dto.common.Location;
65
import com.traveltime.sdk.dto.requests.timefilter.ArrivalSearch;
76
import com.traveltime.sdk.dto.requests.timefilter.DepartureSearch;
87
import com.traveltime.sdk.dto.responses.TimeFilterResponse;
9-
import com.traveltime.sdk.dto.responses.errors.TravelTimeError;
108
import com.traveltime.sdk.utils.AcceptType;
11-
import com.traveltime.sdk.utils.JsonUtils;
12-
import io.vavr.control.Either;
139
import jakarta.validation.Valid;
1410
import java.util.List;
1511
import lombok.*;
1612
import lombok.extern.jackson.Jacksonized;
17-
import okhttp3.HttpUrl;
18-
import okhttp3.Request;
1913

2014
@Data
2115
@Builder
2216
@Jacksonized
2317
@AllArgsConstructor
2418
@EqualsAndHashCode(callSuper = true)
2519
@JsonInclude(JsonInclude.Include.NON_NULL)
26-
public class TimeFilterRequest extends TravelTimeRequest<TimeFilterResponse> {
20+
public class TimeFilterRequest extends BaseTravelTimePostRequest<TimeFilterResponse> {
2721
@NonNull
2822
@Singular
2923
List<Location> locations;
@@ -37,10 +31,13 @@ public class TimeFilterRequest extends TravelTimeRequest<TimeFilterResponse> {
3731
List<ArrivalSearch> arrivalSearches;
3832

3933
@Override
40-
public Either<TravelTimeError, Request> createRequest(HttpUrl baseUri, TravelTimeCredentials credentials) {
41-
val uri = baseUri.newBuilder().addPathSegments("time-filter").build();
42-
return JsonUtils.toJson(this)
43-
.map(json -> createPostRequest(credentials, uri, json, AcceptType.APPLICATION_JSON));
34+
protected String endpoint() {
35+
return "time-filter";
36+
}
37+
38+
@Override
39+
protected AcceptType acceptType() {
40+
return AcceptType.APPLICATION_JSON;
4441
}
4542

4643
@Override

0 commit comments

Comments
 (0)