diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java index 0731abf2..dde922f1 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java @@ -140,6 +140,24 @@ public class VehicleImpl extends AbstractVehicle { if (id == null) throw new IllegalArgumentException("Vehicle id must not be null."); } + /** + * This can be used to initialize the new vehicle (to be built) with another vehicle. + * + * @param baseVehicle + */ + private Builder(Vehicle baseVehicle) { + this.id = baseVehicle.getId(); + this.earliestStart = baseVehicle.getEarliestDeparture(); + this.latestArrival = baseVehicle.getLatestArrival(); + this.returnToDepot = baseVehicle.isReturnToDepot(); + this.type = baseVehicle.getType(); + this.skills = baseVehicle.getSkills(); + this.startLocation = baseVehicle.getStartLocation(); + this.endLocation = baseVehicle.getEndLocation(); + this.aBreak = baseVehicle.getBreak(); + this.userData = baseVehicle.getUserData(); + } + /** * Sets the {@link VehicleType}.
* @@ -291,6 +309,16 @@ public class VehicleImpl extends AbstractVehicle { return new Builder(vehicleId); } + /** + * Returns new instance of vehicle builder and initializes every attribute with a attributes of baseVehicle + * + * @param baseVehicle + * @return + */ + public static Builder newInstance(Vehicle baseVehicle) { + return new Builder(baseVehicle); + } + public Builder addSkills(Skills skills) { this.skillBuilder.addAllSkills(skills.values()); return this; diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImplTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImplTest.java index cf276e48..ae09e448 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImplTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImplTest.java @@ -52,6 +52,23 @@ public class VehicleImplTest { assertEquals(30., v.getBreak().getServiceDuration(), 0.1); } + @Test + public void buildingANewVehicleBasedOnAnotherOneShouldWork() { + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build(); + Break aBreak = Break.Builder.newInstance("break").setTimeWindow(TimeWindow.newInstance(100, 200)).setServiceTime(30).build(); + Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")) + .setType(type1).setEndLocation(Location.newInstance("start")) + .setBreak(aBreak).build(); + + Vehicle newVehicle = VehicleImpl.Builder.newInstance(v).setStartLocation(Location.newInstance("newStartLocation")).build(); + assertNotNull(newVehicle.getBreak()); + assertEquals(100., newVehicle.getBreak().getTimeWindow().getStart(), 0.1); + assertEquals(200., newVehicle.getBreak().getTimeWindow().getEnd(), 0.1); + assertEquals(30., newVehicle.getBreak().getServiceDuration(), 0.1); + assertEquals("newStartLocation", newVehicle.getStartLocation().getId()); + assertEquals(type1, newVehicle.getType()); + } + @Test public void whenAddingSkills_theyShouldBeAddedCorrectly() {