diff --git a/src/ParkingLot/Client.java b/src/ParkingLot/Client.java index 319b4e7..9e82215 100644 --- a/src/ParkingLot/Client.java +++ b/src/ParkingLot/Client.java @@ -2,12 +2,10 @@ import ParkingLot.controllers.TicketController; import ParkingLot.dtos.IssueTicketRequestDTO; +import ParkingLot.dtos.IssueTicketResponseDTO; import ParkingLot.models.Gate; import ParkingLot.models.VehicleType; -import ParkingLot.repositories.GateRepository; -import ParkingLot.repositories.ParkingLotRepository; -import ParkingLot.repositories.TicketRepository; -import ParkingLot.repositories.VehicleRepository; +import ParkingLot.repositories.*; import ParkingLot.service.TicketService; public class Client { @@ -16,12 +14,18 @@ public static void main(String[] args) { TicketRepository ticketRepository = new TicketRepository(); ParkingLotRepository parkingLotRepository = new ParkingLotRepository(); GateRepository gateRepository = new GateRepository(); + OperatorRepository operatorRepository = new OperatorRepository(); + ParkingFloorRepository parkingFloorRepository = new ParkingFloorRepository(); + ParkingSlotRepository parkingSlotRepository = new ParkingSlotRepository(); TicketService ticketService = new TicketService( gateRepository, vehicleRepository, parkingLotRepository, - ticketRepository + ticketRepository, + parkingSlotRepository, + operatorRepository, + parkingFloorRepository ); TicketController ticketController = new TicketController(ticketService); @@ -33,7 +37,11 @@ public static void main(String[] args) { request.setVehicleNumber("DL 1VC 0001"); request.setParkingLotId(1); - ticketController.issueTicket(request); + IssueTicketResponseDTO responseDTO = ticketController.issueTicket(request); + + System.out.println("Response --> \n"+ + "getParkingSlotNumber -- "+responseDTO.getParkingSlotNumber() + + "\n getTicketId -- "+responseDTO.getTicketId()); } } diff --git a/src/ParkingLot/models/Operator.java b/src/ParkingLot/models/Operator.java index 382f67d..8b25ec5 100644 --- a/src/ParkingLot/models/Operator.java +++ b/src/ParkingLot/models/Operator.java @@ -2,5 +2,26 @@ public class Operator extends BaseModel{ private String Name; - private Gate gate; + private String email; + + public Operator(String name, String email) { + Name = name; + this.email = email; + } + + public String getName() { + return Name; + } + + public void setName(String name) { + Name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } } diff --git a/src/ParkingLot/models/ParkingLot.java b/src/ParkingLot/models/ParkingLot.java index 59412e6..83eea5a 100644 --- a/src/ParkingLot/models/ParkingLot.java +++ b/src/ParkingLot/models/ParkingLot.java @@ -17,12 +17,8 @@ public class ParkingLot extends BaseModel{ // private String address; public ParkingLot(){ - parkingFloors = new ArrayList(); - parkingFloors.add(new ParkingFloor()); + parkingFloors = new ArrayList<>(); name = "New Parking Lot"; - entryGates = new ArrayList<>(); - entryGates.add(new Gate()); - exitGates = new ArrayList<>(); vehicleCapacities = new ArrayList<>(); parkingLotStatus = ParkingLotStatus.OPEN; slotAssignmentStrategyType = SlotAssignmentStrategyType.RANDOM; diff --git a/src/ParkingLot/models/VehicleTypeCapacity.java b/src/ParkingLot/models/VehicleTypeCapacity.java index 3ac40cb..237fa56 100644 --- a/src/ParkingLot/models/VehicleTypeCapacity.java +++ b/src/ParkingLot/models/VehicleTypeCapacity.java @@ -4,6 +4,11 @@ public class VehicleTypeCapacity { private VehicleType vehicleType; private int capacity; + public VehicleTypeCapacity(VehicleType vehicleType, int capacity) { + this.vehicleType = vehicleType; + this.capacity = capacity; + } + public VehicleType getVehicleType() { return vehicleType; } diff --git a/src/ParkingLot/repositories/GateRepository.java b/src/ParkingLot/repositories/GateRepository.java index 5a401cd..4b3cedd 100644 --- a/src/ParkingLot/repositories/GateRepository.java +++ b/src/ParkingLot/repositories/GateRepository.java @@ -1,11 +1,37 @@ package ParkingLot.repositories; import ParkingLot.models.Gate; +import ParkingLot.models.GateType; +import java.util.Map; import java.util.Optional; +import java.util.TreeMap; public class GateRepository { - public Optional findGateById(int gateId){ + private Map gates = new TreeMap<>(); + + public GateRepository() + { + Gate entry = new Gate(); + entry.setId(1); + entry.setGateType(GateType.ENTRY); + gates.put(entry.getId(),entry); + + Gate exit = new Gate(); + exit.setId(2); + exit.setGateType(GateType.EXIT); + gates.put(exit.getId(),exit); + + } + + + + public Optional findGateById(int id) + { + if(gates.containsKey(id)) + { + return Optional.of(gates.get(id)); + } return Optional.empty(); } } diff --git a/src/ParkingLot/repositories/OperatorRepository.java b/src/ParkingLot/repositories/OperatorRepository.java new file mode 100644 index 0000000..ff5dbfe --- /dev/null +++ b/src/ParkingLot/repositories/OperatorRepository.java @@ -0,0 +1,32 @@ +package ParkingLot.repositories; + +import ParkingLot.models.Operator; +import ParkingLot.models.ParkingLot; + +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; + +public class OperatorRepository { + + public Map operators = new TreeMap<>(); + + public OperatorRepository() { + Operator operator = new Operator("entrywaala","entrywaala@scaler.com"); + operator.setId(1); + operators.put(operator.getId(), operator); + + Operator operator2 = new Operator("exitwaala","exitwaala@scaler.com"); + operator2.setId(2); + operators.put(operator2.getId(), operator2); + } + + public Optional getOperatorById(int operatorId) + { + if(operators.containsKey(operatorId)){ + return Optional.of(operators.get(operatorId)); + } + return Optional.empty(); + } + +} diff --git a/src/ParkingLot/repositories/ParkingFloorRepository.java b/src/ParkingLot/repositories/ParkingFloorRepository.java new file mode 100644 index 0000000..974db02 --- /dev/null +++ b/src/ParkingLot/repositories/ParkingFloorRepository.java @@ -0,0 +1,35 @@ +package ParkingLot.repositories; + +import ParkingLot.models.Operator; +import ParkingLot.models.ParkingFloor; +import ParkingLot.models.ParkingFloorStatus; + +import java.util.*; + +public class ParkingFloorRepository { + + public Map parkingFloors = new TreeMap<>(); + + public ParkingFloorRepository() + { + ParkingFloor parkingFloor = new ParkingFloor(); + parkingFloor.setFloorName("F1"); + parkingFloor.setParkingFloorStatus(ParkingFloorStatus.OPEN); + parkingFloor.setId(1); + parkingFloors.put(parkingFloor.getId(),parkingFloor); + + } + + public Optional getParkingFloorById(int id) + { + if(parkingFloors.containsKey(id)){ + return Optional.of(parkingFloors.get(id)); + } + return Optional.empty(); + } + + public Optional> getAvailableFloors() + { + return Optional.of(new ArrayList<>(parkingFloors.values())); + } +} diff --git a/src/ParkingLot/repositories/ParkingSlotRepository.java b/src/ParkingLot/repositories/ParkingSlotRepository.java new file mode 100644 index 0000000..8df3db2 --- /dev/null +++ b/src/ParkingLot/repositories/ParkingSlotRepository.java @@ -0,0 +1,55 @@ +package ParkingLot.repositories; + +import ParkingLot.models.ParkingFloor; +import ParkingLot.models.ParkingSlot; +import ParkingLot.models.ParkingSlotStatus; +import ParkingLot.models.VehicleType; + +import java.util.*; + +public class ParkingSlotRepository { + + public Map parkingSlots = new TreeMap<>(); + + public ParkingSlotRepository() + { + ParkingSlot parkingSlot = new ParkingSlot(); + parkingSlot.setSlotNumber("F1_001_CAR"); + parkingSlot.setVehicleType(VehicleType.CAR); + parkingSlot.setParkingSlotStatus(ParkingSlotStatus.EMPTY); + parkingSlot.setId(1); + + parkingSlots.put(parkingSlot.getId(),parkingSlot); + + ParkingSlot parkingSlot2 = new ParkingSlot(); + parkingSlot2.setSlotNumber("F1_002_BIKE"); + parkingSlot2.setVehicleType(VehicleType.BIKE); + parkingSlot2.setParkingSlotStatus(ParkingSlotStatus.EMPTY); + parkingSlot2.setId(2); + + parkingSlots.put(parkingSlot2.getId(),parkingSlot2); + + ParkingSlot parkingSlot3 = new ParkingSlot(); + parkingSlot3.setSlotNumber("F1_003_AUTO"); + parkingSlot3.setVehicleType(VehicleType.AUTO); + parkingSlot3.setParkingSlotStatus(ParkingSlotStatus.EMPTY); + parkingSlot3.setId(3); + + parkingSlots.put(parkingSlot3.getId(),parkingSlot3); + + ParkingSlot parkingSlot4 = new ParkingSlot(); + parkingSlot4.setSlotNumber("F1_002_BUS"); + parkingSlot4.setVehicleType(VehicleType.BUS); + parkingSlot4.setParkingSlotStatus(ParkingSlotStatus.EMPTY); + parkingSlot4.setId(4); + + parkingSlots.put(parkingSlot4.getId(),parkingSlot4); + } + + public Optional> getAvailableSlots() + { + return Optional.of(new ArrayList<>(parkingSlots.values())); + } + + +} diff --git a/src/ParkingLot/repositories/VehicleRepository.java b/src/ParkingLot/repositories/VehicleRepository.java index 66090bc..cd513e3 100644 --- a/src/ParkingLot/repositories/VehicleRepository.java +++ b/src/ParkingLot/repositories/VehicleRepository.java @@ -2,16 +2,25 @@ import ParkingLot.models.Vehicle; +import java.util.Map; import java.util.Optional; +import java.util.TreeMap; public class VehicleRepository { - public Optional findVehicleByVehicleNumber(String vehicleNumber){ - return Optional.empty(); - } + private Map vehicles = new TreeMap<>(); - public Vehicle save(Vehicle vehicle){ - // save this to db - vehicle.setId(1); + public Vehicle saveVehicle(Vehicle vehicle) + { + vehicles.put(vehicle.getLicensePlate(),vehicle); return vehicle; } + public Optional getVehicleByNumber(String vehicleNumber) + { + if(vehicles.containsKey(vehicleNumber)) + { + return Optional.of(vehicles.get(vehicleNumber)); + } + + return Optional.empty(); + } } diff --git a/src/ParkingLot/service/TicketService.java b/src/ParkingLot/service/TicketService.java index 54b5a22..3be5a64 100644 --- a/src/ParkingLot/service/TicketService.java +++ b/src/ParkingLot/service/TicketService.java @@ -2,13 +2,11 @@ import ExceptionHandling.D; import ParkingLot.models.*; -import ParkingLot.repositories.GateRepository; -import ParkingLot.repositories.ParkingLotRepository; -import ParkingLot.repositories.TicketRepository; -import ParkingLot.repositories.VehicleRepository; +import ParkingLot.repositories.*; import ParkingLot.strategies.SlotAssignmentStrategyFactory; import java.util.Date; +import java.util.List; import java.util.Optional; public class TicketService { @@ -16,64 +14,104 @@ public class TicketService { private VehicleRepository vehicleRepository; private ParkingLotRepository parkingLotRepository; private TicketRepository ticketRepository; + private ParkingSlotRepository parkingSlotRepository; + private OperatorRepository operatorRepository; + private ParkingFloorRepository parkingFloorRepository; - public TicketService( - GateRepository gateRepository, - VehicleRepository vehicleRepository, - ParkingLotRepository parkingLotRepository, - TicketRepository ticketRepository - ){ + + public TicketService(GateRepository gateRepository, VehicleRepository vehicleRepository, ParkingLotRepository parkingLotRepository, TicketRepository ticketRepository, + ParkingSlotRepository parkingSlotRepository, OperatorRepository operatorRepository, ParkingFloorRepository parkingFloorRepository) { this.gateRepository = gateRepository; this.vehicleRepository = vehicleRepository; this.parkingLotRepository = parkingLotRepository; this.ticketRepository = ticketRepository; + this.parkingSlotRepository = parkingSlotRepository; + this.operatorRepository = operatorRepository; + this.parkingFloorRepository = parkingFloorRepository; } + public Ticket issueTicket( int gateId, String vehicleNumber, String ownerName, VehicleType vehicleType, int parkingLotId - ){ + ) { // 1. create the ticket obj Ticket ticket = new Ticket(); ticket.setEntryTime(new Date()); Optional gateOptional = gateRepository.findGateById(gateId); - if(gateOptional.isEmpty()){ + if (gateOptional.isEmpty()) { throw new RuntimeException("Gate not found"); } Gate gate = gateOptional.get(); - ticket.setGate(gate); - ticket.setOperator(gate.getCurrentOperator()); - Optional vehicleOptional = vehicleRepository.findVehicleByVehicleNumber(vehicleNumber); + System.out.println("Gate fetched --"); + + /********************************************/ + //Vehicle + Optional vehicleOptional = vehicleRepository.getVehicleByNumber(vehicleNumber); Vehicle vehicle; - if(vehicleOptional.isEmpty()){ + if (vehicleOptional.isEmpty()) { vehicle = new Vehicle(); vehicle.setVehicleType(vehicleType); vehicle.setOwnerName(ownerName); vehicle.setLicensePlate(vehicleNumber); - vehicle = vehicleRepository.save(vehicle); + vehicle = vehicleRepository.saveVehicle(vehicle); } else { vehicle = vehicleOptional.get(); } ticket.setVehicle(vehicle); - // 2. Assignment of Slot + /********************************************/ + //adding Operators + Optional optionalOperator = operatorRepository.getOperatorById(1); + if (optionalOperator.isEmpty()) { + throw new RuntimeException("Operator not found"); + } + gate.setCurrentOperator(optionalOperator.get()); + ticket.setGate(gate); + ticket.setOperator(gate.getCurrentOperator()); + + /********************************************/ + // add ParkingLot Data Optional parkingLotOptional = parkingLotRepository.findParkingLotById(parkingLotId); - if(parkingLotOptional.isEmpty()){ + if (parkingLotOptional.isEmpty()) { throw new RuntimeException("Parking Lot not found"); } ParkingLot parkingLot = parkingLotOptional.get(); + + /********************************************/ + // add parkingSlot data + + Optional> optionalParkingSlots = parkingSlotRepository.getAvailableSlots(); + if (optionalParkingSlots.isEmpty()) { + throw new RuntimeException("Parking Floors not found"); + } + List parkingSlots = optionalParkingSlots.get(); + + /********************************************/ + //add floorsData + Optional> optionalParkingFloors = parkingFloorRepository.getAvailableFloors(); + if (optionalParkingFloors.isEmpty()) { + throw new RuntimeException("Parking Floors not found"); + } + + List parkingFloorsList = optionalParkingFloors.get(); + + for (ParkingFloor parkingFloor : parkingFloorsList) { + parkingFloor.setParkingSlots(parkingSlots); + } + parkingLot.setParkingFloors(parkingFloorsList); + // Multiple different ways : Random , nearest , farthest. // 3. Return ParkingSlot parkingSlot = - SlotAssignmentStrategyFactory - .getSlotAssignmentStrategyByType(parkingLot.getSlotAssignmentStrategyType()) - .assignSlot(parkingLot , vehicleType); + SlotAssignmentStrategyFactory + .getSlotAssignmentStrategyByType(parkingLot.getSlotAssignmentStrategyType()) + .assignSlot(parkingLot, vehicleType); ticket.setParkingSlot(parkingSlot); - // update the capacity if required parkingSlot.setParkingSlotStatus(ParkingSlotStatus.FILLED); return ticketRepository.save(ticket); }