Skip to content

Commit f047a7d

Browse files
Merge pull request #11 from Contargo/direct-truck-feature
Introduce new connection type: DTRUCK
2 parents 3e61947 + f99be93 commit f047a7d

46 files changed

Lines changed: 731 additions & 133 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package net.contargo.iris.co2.advice;
2+
3+
import net.contargo.iris.route.RoutePart;
4+
import net.contargo.iris.route.RoutePartData;
5+
6+
import java.math.BigDecimal;
7+
8+
import static net.contargo.iris.co2.advice.Co2PartTruckStrategy.CO2_TRUCK_EMPTY;
9+
import static net.contargo.iris.co2.advice.Co2PartTruckStrategy.CO2_TRUCK_FULL;
10+
import static net.contargo.iris.container.ContainerState.FULL;
11+
12+
13+
/**
14+
* @author Ben Antony - antony@synyx.de
15+
* @author Sandra Thieme - thieme@synyx.de
16+
*/
17+
public class Co2PartDtruckStrategy implements Co2PartStrategy {
18+
19+
@Override
20+
public BigDecimal getEmissionForRoutePart(RoutePart routePart) {
21+
22+
RoutePartData routePartData = routePart.getData();
23+
24+
BigDecimal co2Factor;
25+
26+
if (FULL == routePart.getContainerState()) {
27+
co2Factor = CO2_TRUCK_FULL;
28+
} else {
29+
co2Factor = CO2_TRUCK_EMPTY;
30+
}
31+
32+
BigDecimal distance = routePartData.getDtruckDistance();
33+
34+
return distance.multiply(co2Factor);
35+
}
36+
}

src/main/java/net/contargo/iris/co2/advice/Co2PartStrategyAdvisor.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
import net.contargo.iris.route.RouteType;
44

5+
import static net.contargo.iris.route.RouteType.BARGE;
6+
import static net.contargo.iris.route.RouteType.BARGE_RAIL;
7+
import static net.contargo.iris.route.RouteType.DTRUCK;
8+
import static net.contargo.iris.route.RouteType.RAIL;
9+
import static net.contargo.iris.route.RouteType.TRUCK;
10+
511

612
/**
713
* @author Oliver Messner - messner@synyx.de
@@ -12,6 +18,7 @@ public class Co2PartStrategyAdvisor {
1218
private Co2PartStrategy railStrategy;
1319
private Co2PartStrategy truckStrategy;
1420
private Co2PartStrategy bargeRailStrategy;
21+
private Co2PartStrategy dtruckStrategy;
1522

1623
Co2PartStrategyAdvisor() {
1724

@@ -20,12 +27,13 @@ public class Co2PartStrategyAdvisor {
2027

2128

2229
public Co2PartStrategyAdvisor(Co2PartStrategy bargeStrategy, Co2PartStrategy railStrategy,
23-
Co2PartStrategy truckStrategy, Co2PartStrategy bargeRailStrategy) {
30+
Co2PartStrategy truckStrategy, Co2PartStrategy bargeRailStrategy, Co2PartStrategy dtruckStrategy) {
2431

2532
this.bargeStrategy = bargeStrategy;
2633
this.railStrategy = railStrategy;
2734
this.truckStrategy = truckStrategy;
2835
this.bargeRailStrategy = bargeRailStrategy;
36+
this.dtruckStrategy = dtruckStrategy;
2937
}
3038

3139
void setBargeStrategy(Co2PartStrategy bargeStrategy) {
@@ -52,24 +60,34 @@ void setBargeRailStrategy(Co2PartStrategy bargeRailStrategy) {
5260
}
5361

5462

63+
public void setDtruckStrategy(Co2PartStrategy dtruckStrategy) {
64+
65+
this.dtruckStrategy = dtruckStrategy;
66+
}
67+
68+
5569
public Co2PartStrategy advice(RouteType routeType) {
5670

57-
if (routeType == RouteType.BARGE) {
71+
if (routeType == BARGE) {
5872
return bargeStrategy;
5973
}
6074

61-
if (routeType == RouteType.RAIL) {
75+
if (routeType == RAIL) {
6276
return railStrategy;
6377
}
6478

65-
if (routeType == RouteType.TRUCK) {
79+
if (routeType == TRUCK) {
6680
return truckStrategy;
6781
}
6882

69-
if (routeType == RouteType.BARGE_RAIL) {
83+
if (routeType == BARGE_RAIL) {
7084
return bargeRailStrategy;
7185
}
7286

87+
if (routeType == DTRUCK) {
88+
return dtruckStrategy;
89+
}
90+
7391
throw new IllegalStateException("Cannot determine co2 for route part of type " + routeType);
7492
}
7593
}

src/main/java/net/contargo/iris/co2/advice/Co2PartTruckStrategy.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99

1010
/**
1111
* @author Oliver Messner - messner@synyx.de
12+
* @author Ben Antony - antony@synyx.de
13+
* @author Sandra Thieme - thieme@synyx.de
1214
*/
1315
class Co2PartTruckStrategy implements Co2PartStrategy {
1416

15-
private static final BigDecimal CO2_TRUCK_FULL = BigDecimal.valueOf(0.88);
16-
private static final BigDecimal CO2_TRUCK_EMPTY = BigDecimal.valueOf(0.73);
17+
static final BigDecimal CO2_TRUCK_FULL = BigDecimal.valueOf(0.88);
18+
static final BigDecimal CO2_TRUCK_EMPTY = BigDecimal.valueOf(0.73);
1719

1820
@Override
1921
public BigDecimal getEmissionForRoutePart(RoutePart routePart) {

src/main/java/net/contargo/iris/connection/MainRunConnection.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@
33
import net.contargo.iris.route.RouteType;
44
import net.contargo.iris.seaport.Seaport;
55
import net.contargo.iris.terminal.Terminal;
6+
67
import net.contargo.validation.bigdecimal.BigDecimalValidate;
78

9+
import java.math.BigDecimal;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
814
import javax.persistence.CascadeType;
915
import javax.persistence.Entity;
1016
import javax.persistence.EnumType;
@@ -16,10 +22,8 @@
1622
import javax.persistence.OneToMany;
1723
import javax.persistence.Table;
1824
import javax.persistence.UniqueConstraint;
25+
1926
import javax.validation.constraints.NotNull;
20-
import java.math.BigDecimal;
21-
import java.util.ArrayList;
22-
import java.util.List;
2327

2428
import static net.contargo.iris.route.RouteType.BARGE_RAIL;
2529

@@ -30,6 +34,8 @@
3034
* @author Aljona Murygina - murygina@synyx.de
3135
* @author Vincent Potucek - potucek@synyx.de
3236
* @author Oliver Messner - messner@synyx.de
37+
* @author Ben Antony - antony@synyx.de
38+
* @author Sandra Thieme - thieme@synyx.de
3339
*/
3440
@Entity
3541
@Table(
@@ -64,6 +70,10 @@ public class MainRunConnection {
6470
@BigDecimalValidate(minValue = 0, minDecimalPlaces = 1L, maxDecimalPlaces = TEN, maxFractionalPlaces = TEN)
6571
private BigDecimal railElectricDistance;
6672

73+
@NotNull
74+
@BigDecimalValidate(minValue = 0, minDecimalPlaces = 1L, maxDecimalPlaces = TEN, maxFractionalPlaces = TEN)
75+
private BigDecimal roadDistance;
76+
6777
@NotNull
6878
@Enumerated(EnumType.STRING)
6979
private RouteType routeType;
@@ -238,6 +248,18 @@ public void setSubConnections(List<AbstractSubConnection> subConnections) {
238248
}
239249

240250

251+
public BigDecimal getRoadDistance() {
252+
253+
return roadDistance;
254+
}
255+
256+
257+
public void setRoadDistance(BigDecimal roadDistance) {
258+
259+
this.roadDistance = roadDistance;
260+
}
261+
262+
241263
/**
242264
* Checks whether this {@link MainRunConnection} is enabled along with its {@link Seaport} and {@link Terminal} and
243265
* all its {@link AbstractSubConnection}s.
@@ -277,6 +299,7 @@ public String toString() {
277299
+ ", location=" + terminal + ", bargeDieselDistance=" + bargeDieselDistance + ", railDieselDistance="
278300
+ railDieselDistance
279301
+ ", railElectricDistance=" + railElectricDistance
302+
+ ", roadDistance=" + roadDistance
280303
+ ", routeType=" + routeType + "]";
281304
}
282305
}

src/main/java/net/contargo/iris/connection/api/MainRunConnectionApiController.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import net.contargo.iris.connection.dto.MainRunConnectionDtoService;
88
import net.contargo.iris.connection.dto.SimpleMainRunConnectionDto;
99
import net.contargo.iris.connection.service.DuplicateMainRunConnectionException;
10+
import net.contargo.iris.route.RouteType;
1011

1112
import org.slf4j.Logger;
1213

1314
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.beans.factory.annotation.Value;
1416

1517
import org.springframework.http.HttpHeaders;
1618
import org.springframework.http.ResponseEntity;
@@ -34,9 +36,16 @@
3436
import java.net.URI;
3537

3638
import java.util.Collection;
39+
import java.util.Map;
40+
import java.util.TreeMap;
3741

3842
import javax.validation.Valid;
3943

44+
import static net.contargo.iris.route.RouteType.BARGE;
45+
import static net.contargo.iris.route.RouteType.BARGE_RAIL;
46+
import static net.contargo.iris.route.RouteType.DTRUCK;
47+
import static net.contargo.iris.route.RouteType.RAIL;
48+
4049
import static org.slf4j.LoggerFactory.getLogger;
4150

4251
import static org.springframework.http.HttpStatus.BAD_REQUEST;
@@ -54,6 +63,7 @@
5463
* @author Sandra Thieme - thieme@synyx.de
5564
* @author Oliver Messner - messner@synyx.de
5665
* @author Tobias Schneider - schneider@synyx.de
66+
* @author Ben Antony - antony@synyx.de
5767
*/
5868
@Controller
5969
@RequestMapping(value = "/connections")
@@ -63,10 +73,14 @@ public class MainRunConnectionApiController {
6373

6474
private final MainRunConnectionDtoService connectionApiDtoService;
6575

76+
private final boolean isDtruckFeatureActive;
77+
6678
@Autowired
67-
public MainRunConnectionApiController(MainRunConnectionDtoService connectionApiDtoService) {
79+
public MainRunConnectionApiController(MainRunConnectionDtoService connectionApiDtoService,
80+
@Value("${feature.dtruck}") boolean isDtruckFeatureActive) {
6881

6982
this.connectionApiDtoService = connectionApiDtoService;
83+
this.isDtruckFeatureActive = isDtruckFeatureActive;
7084
}
7185

7286
@ApiOperation(
@@ -108,10 +122,10 @@ public ResponseEntity createConnection(@Valid @RequestBody MainRunConnectionDto
108122
MainRunConnectionDto savedDto = connectionApiDtoService.save(dto);
109123

110124
URI location = ServletUriComponentsBuilder.fromCurrentServletMapping()
111-
.path("/../web/connections/{id}")
112-
.build()
113-
.expand(savedDto.getId())
114-
.toUri();
125+
.path("/../web/connections/{id}")
126+
.build()
127+
.expand(savedDto.getId())
128+
.toUri();
115129

116130
HttpHeaders headers = new HttpHeaders();
117131
headers.setLocation(location);
@@ -138,6 +152,23 @@ public ResponseEntity<MainRunConnectionDto> updateConnection(@Valid @RequestBody
138152
}
139153

140154

155+
@RequestMapping(value = "/types", method = GET)
156+
public ResponseEntity<Map<RouteType, String>> getTypes() {
157+
158+
Map<RouteType, String> types = new TreeMap<>();
159+
160+
types.put(BARGE, "Barge");
161+
types.put(RAIL, "Rail");
162+
types.put(BARGE_RAIL, "Barge-Rail");
163+
164+
if (isDtruckFeatureActive) {
165+
types.put(DTRUCK, "Direct Truck");
166+
}
167+
168+
return new ResponseEntity<>(types, OK);
169+
}
170+
171+
141172
@ExceptionHandler(DuplicateMainRunConnectionException.class)
142173
ResponseEntity<RestApiErrorDto> handleDuplicateMainRunConnectionException(DuplicateMainRunConnectionException e) {
143174

src/main/java/net/contargo/iris/connection/api/SeaportConnectionApiController.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.slf4j.Logger;
1111

1212
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.beans.factory.annotation.Value;
1314

1415
import org.springframework.stereotype.Controller;
1516

@@ -19,19 +20,27 @@
1920

2021
import java.lang.invoke.MethodHandles;
2122

23+
import java.util.ArrayList;
2224
import java.util.HashSet;
25+
import java.util.List;
2326
import java.util.Set;
2427

28+
import static net.contargo.iris.route.RouteCombo.ALL;
29+
import static net.contargo.iris.route.RouteType.DTRUCK;
30+
2531
import static org.slf4j.LoggerFactory.getLogger;
2632

2733
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
2834
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
2935

3036
import static org.springframework.web.bind.annotation.RequestMethod.GET;
3137

38+
import static java.util.Arrays.asList;
39+
3240

3341
/**
3442
* @author Sandra Thieme - thieme@synyx.de
43+
* @author Ben Antony - antony@synyx.de
3544
*/
3645
@Controller
3746
@RequestMapping(value = "/connections")
@@ -41,10 +50,14 @@ public class SeaportConnectionApiController {
4150

4251
private final SeaportTerminalConnectionDtoService seaportTerminalConnectionDtoService;
4352

53+
private final boolean dtruckActive;
54+
4455
@Autowired
45-
public SeaportConnectionApiController(SeaportTerminalConnectionDtoService seaportTerminalConnectionDtoService) {
56+
public SeaportConnectionApiController(SeaportTerminalConnectionDtoService seaportTerminalConnectionDtoService,
57+
@Value("${feature.dtruck}") boolean dtruckActive) {
4658

4759
this.seaportTerminalConnectionDtoService = seaportTerminalConnectionDtoService;
60+
this.dtruckActive = dtruckActive;
4861
}
4962

5063
@ApiOperation(
@@ -62,8 +75,20 @@ public SeaportsResponse getSeaportsInConnections(
6275

6376
Set<SeaportDto> ports = new HashSet<>();
6477

65-
for (RouteType t : routeCombo.getRouteTypes()) {
66-
ports.addAll(seaportTerminalConnectionDtoService.findSeaportsConnectedByRouteType(t));
78+
List<RouteType> routeTypes = new ArrayList<>(asList(routeCombo.getRouteTypes()));
79+
80+
if (routeCombo == ALL) {
81+
routeTypes.add(DTRUCK);
82+
}
83+
84+
for (RouteType t : routeTypes) {
85+
if (t == DTRUCK) {
86+
if (dtruckActive) {
87+
ports.addAll(seaportTerminalConnectionDtoService.findSeaportsConnectedByRouteType(t));
88+
}
89+
} else {
90+
ports.addAll(seaportTerminalConnectionDtoService.findSeaportsConnectedByRouteType(t));
91+
}
6792
}
6893

6994
response.setSeaports(ports);

0 commit comments

Comments
 (0)