Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
69 changes: 29 additions & 40 deletions src/ParkingLot/Client.java
Original file line number Diff line number Diff line change
@@ -1,56 +1,45 @@
package ParkingLot;

import ParkingLot.controllers.TicketController;
import ParkingLot.Controllers.TicketController;
import ParkingLot.DataBase.DataBaseController;
import ParkingLot.Repositories.*;
import ParkingLot.Services.TicketService;
import ParkingLot.dtos.IssueTicketRequestDTO;
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.service.TicketService;
import ParkingLot.dtos.IssueTicketResponseDTO;
import ParkingLot.models.AllowedVehicleType;

public class Client {
public static void main(String[] args) {
VehicleRepository vehicleRepository = new VehicleRepository();
TicketRepository ticketRepository = new TicketRepository();
ParkingLotRepository parkingLotRepository = new ParkingLotRepository();
GateRepository gateRepository = new GateRepository();
ParkingLotRepository parkingLotRepository = new ParkingLotRepository();
TicketRepository ticketRepository = new TicketRepository();
VehicleRepository vehicleRepository = new VehicleRepository();
OperatorRepository operatorRepository = new OperatorRepository();
ParkingSlotRepository parkingSlotRepository = new ParkingSlotRepository();
ParkingFloorRepository parkingFloorRepository = new ParkingFloorRepository();

TicketService ticketService = new TicketService(
gateRepository,
vehicleRepository,
parkingLotRepository,
ticketRepository
);

TicketController ticketController = new TicketController(ticketService);
DataBaseController.InitializeDataBaseTransaction(gateRepository,parkingLotRepository,operatorRepository,parkingFloorRepository,parkingSlotRepository);

IssueTicketRequestDTO request = new IssueTicketRequestDTO();
request.setGateId(1);
request.setOwnerName("Mohit");
request.setVehicleType(VehicleType.AUTO);
request.setVehicleNumber("DL 1VC 0001");
request.setParkingLotId(1);
TicketService ticketService = new TicketService(gateRepository,vehicleRepository,
parkingLotRepository,ticketRepository);

ticketController.issueTicket(request);
}
}
TicketController ticketController = new TicketController(ticketService);

// Controllers
// Services
// Repository
IssueTicketRequestDTO issueTicketRequestDTO = new IssueTicketRequestDTO();
issueTicketRequestDTO.setGateNumber("1A");
issueTicketRequestDTO.setVehicleNumber("KA 09 567");
issueTicketRequestDTO.setOwnerName("Radha");
issueTicketRequestDTO.setVehicleType(AllowedVehicleType.CAR);
issueTicketRequestDTO.setParkingLotId(1);

// C <- S <- R
IssueTicketResponseDTO issueTicketResponseDTO = ticketController.issueTicket(issueTicketRequestDTO);

// Generate the ticket : CRUD : Ticket : TicketController
System.out.println("Ticket Details Below");
System.out.println("Ticket Id : " + issueTicketResponseDTO.getTicketId());
System.out.println("Assigned Slot : "+ issueTicketResponseDTO.getParkingSlotNumber());

// Gathered requirement
// class diagram
// schema design
// code models
// code controller
// DTO
// Issue ticket completion

// HW : Generating the bill , check-out

}
}
89 changes: 89 additions & 0 deletions src/ParkingLot/DataBase/DataBaseController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package ParkingLot.DataBase;

import ParkingLot.Repositories.*;
import ParkingLot.models.*;

import java.util.Arrays;


public class DataBaseController {
public static void InitializeDataBaseTransaction(GateRepository gateRepository, ParkingLotRepository parkingLotRepository,
OperatorRepository operatorRepository,
ParkingFloorRepository parkingFloorRepository,
ParkingSlotRepository parkingSlotRepository) {
//Operator
Operator operator1 = new Operator();
operator1.setName("Rachana");
operator1.setPhoneNumber(12334);
operatorRepository.save(operator1);


Operator operator2= new Operator();
operator2.setName("Rambo");
operator2.setPhoneNumber(56789);
operatorRepository.save(operator2);

//Gate
Gate gate1 = new Gate();
gate1.setGateNumber("1A");
gate1.setGateType(GateType.ENTRY_GATE);
gate1.setOperator(operator1);
gate1.setGateStatus(GateStatus.OPEN);
gateRepository.saveGate(gate1);

Gate gate2 = new Gate();
gate2.setGateNumber("1B");
gate2.setGateType(GateType.EXIT_GATE);
gate2.setOperator(operator2);
gate2.setGateStatus(GateStatus.OPEN);
gateRepository.saveGate(gate2);



//ParkingFloor
ParkingFloor parkingFloor = new ParkingFloor();
parkingFloor.setParkingFloorName("GroundFloor");
parkingFloor.setAllowedVehicleTypes(Arrays.asList(AllowedVehicleType.CAR,AllowedVehicleType.CAR));
parkingFloor.setParkingFloorStatus(ParkingFloorStatus.OPEN);
parkingFloor = parkingFloorRepository.Save(parkingFloor);

VehicleTypeCapacity vehicleTypeCapacity1 = new VehicleTypeCapacity();
vehicleTypeCapacity1.setVehicleType(AllowedVehicleType.CAR);
vehicleTypeCapacity1.setCapacity(0);

VehicleTypeCapacity vehicleTypeCapacity2 = new VehicleTypeCapacity();
vehicleTypeCapacity2.setVehicleType(AllowedVehicleType.AUTO);
vehicleTypeCapacity2.setCapacity(0);

parkingFloor.setVehicleTypeCapacity(Arrays.asList(vehicleTypeCapacity1, vehicleTypeCapacity2));

// ParkingFloorVehicleTypeCapacityRepository.
// LoadData(parkingFloor.getParkingFloorName(), (ArrayList<VehicleTypeCapacity>) Arrays.asList(vehicleTypeCapacity1,vehicleTypeCapacity2));


//ParkingSlot
ParkingSlot parkingSlot = new ParkingSlot();
parkingSlot.setParkingSlotId("GA");
parkingSlot.setAllowedVehicleType(AllowedVehicleType.CAR);
parkingSlot.setParkingSlotStatus(ParkingSlotStatus.EMPTY);
parkingSlot.setVehicle(null);
parkingSlot.setParkingFloor(parkingFloor);
parkingSlot = parkingSlotRepository.SaveParkingSlot(parkingSlot);


//add this slot to the floor
parkingFloor.setParkingSlots(Arrays.asList(parkingSlot));


//ParkingLot
ParkingLot parkingLot = new ParkingLot();
parkingLot.setLocation("Bangalore");
parkingLot.setAllowedVehicleTypes(Arrays.asList(AllowedVehicleType.AUTO,AllowedVehicleType.BIKE,AllowedVehicleType.CAR));
parkingLot.setParkingFloors(Arrays.asList(parkingFloor));
parkingLot.setEntryGateList(Arrays.asList(gate1,gate2));
parkingLot.setExitGateList(Arrays.asList(gate2,gate1));
parkingLot.setParkingSlotAssignmentStrategyType(SlotAssignmentStrategyType.RANDOM);
parkingLotRepository.save(parkingLot);

}
}
91 changes: 91 additions & 0 deletions src/ParkingLot/Services/TicketService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package ParkingLot.Services;

import ParkingLot.Repositories.GateRepository;
import ParkingLot.Repositories.ParkingLotRepository;
import ParkingLot.Repositories.TicketRepository;
import ParkingLot.Repositories.VehicleRepository;
import ParkingLot.Strategy.SlotAssignmentFactory;
import ParkingLot.models.*;

import java.util.Date;
import java.util.Optional;

public class TicketService {
private GateRepository gateRepository;
private VehicleRepository vehicleRepository;
private ParkingLotRepository parkingLotRepository;
private TicketRepository ticketRepository;

public TicketService(GateRepository gateRepository,
VehicleRepository vehicleRepository,
ParkingLotRepository parkingLotRepository,
TicketRepository ticketRepository) {
this.gateRepository = gateRepository;
this.vehicleRepository = vehicleRepository;
this.parkingLotRepository = parkingLotRepository;
this.ticketRepository = ticketRepository;
}

public Ticket issueTicket(String gateNumber, String vehicleNumber,
AllowedVehicleType allowedVehicleType, String ownerName, int parkingLotId) {
// 1.create Ticket
// 2.Assign slot
// 3.return ticket

Ticket ticket = new Ticket();

//Gate
Optional<Gate> gateOptional = gateRepository.getGateByGateNumber(gateNumber);
Gate gate;
if(gateOptional.isEmpty()) {
throw new IllegalArgumentException("Gate not found");
}
gate = gateOptional.get();
ticket.setGate(gate);
ticket.setEntryTime(new Date());

//Vehicle
Optional<Vehicle> vehicleOptional = vehicleRepository.findVehicleByVehicleNumber(vehicleNumber);
Vehicle vehicle ;
if(vehicleOptional.isEmpty()) {
vehicle = new Vehicle();
vehicle.setVehicleNumber(vehicleNumber);
vehicle.setOwnerName(ownerName);
vehicle.setVehicleType(allowedVehicleType);
vehicle = vehicleRepository.save(vehicle);
}else{
vehicle = vehicleOptional.get();
}
ticket.setVehicle(vehicle);

//Assign Slot

Optional<ParkingLot> parkingLotOptional = parkingLotRepository.getParkingLotByID(parkingLotId);
ParkingLot parkingLot ;
if(parkingLotOptional.isEmpty()) {
throw new IllegalArgumentException("ParkingLot not found");
}

parkingLot = parkingLotOptional.get();

//find the slot now
ParkingSlot parkingSlot = SlotAssignmentFactory.
getSlotAssignmentStrategy(parkingLot.getParkingSlotAssignmentStrategyType())
.FindParkingSlot(parkingLot,allowedVehicleType);
if(parkingSlot == null) {
throw new RuntimeException("ParkingSlot not found");
}

ticket.setParkingSlot(parkingSlot);
parkingSlot.setParkingSlotStatus(ParkingSlotStatus.FILLED);
parkingSlot.setVehicle(vehicle);

//update vehicle capacity in floor and lot
ParkingFloor parkingFloor = parkingSlot.getParkingFloor();
VehicleTypeCapacity vehicleTypeCapacity = new VehicleTypeCapacity();

return ticketRepository.save(ticket);


}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package ParkingLot.strategies;
package ParkingLot.Strategy;

import ParkingLot.models.*;

public class RandomSlotAssignmentStrategy implements SlotAssignmentStrategy {
public class RandomSlotAssignmentStrategy implements SlotAssignmentStrategy{
@Override
public ParkingSlot assignSlot(ParkingLot parkingLot, VehicleType vehicleType) {
public ParkingSlot FindParkingSlot(ParkingLot parkingLot, AllowedVehicleType vehicleType) {
for(ParkingFloor parkingFloor : parkingLot.getParkingFloors()){

for(ParkingSlot parkingSlot : parkingFloor.getParkingSlots()){
if(parkingSlot.getParkingSlotStatus().equals(ParkingSlotStatus.EMPTY) && parkingSlot.getVehicleType().equals(vehicleType)){
if(parkingSlot.getAllowedVehicleType().equals(vehicleType) && parkingSlot.getParkingSlotStatus().equals(ParkingSlotStatus.EMPTY)){
return parkingSlot;
}
}
}

return null;
}
}
12 changes: 12 additions & 0 deletions src/ParkingLot/Strategy/SlotAssignmentFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ParkingLot.Strategy;

import ParkingLot.models.SlotAssignmentStrategyType;

public class SlotAssignmentFactory {
public static SlotAssignmentStrategy getSlotAssignmentStrategy(SlotAssignmentStrategyType slotAssignmentStrategyType){
if(slotAssignmentStrategyType.equals(SlotAssignmentStrategyType.RANDOM)){
return new RandomSlotAssignmentStrategy();
}
return null;
}
}
9 changes: 9 additions & 0 deletions src/ParkingLot/Strategy/SlotAssignmentStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ParkingLot.Strategy;

import ParkingLot.models.AllowedVehicleType;
import ParkingLot.models.ParkingLot;
import ParkingLot.models.ParkingSlot;

public interface SlotAssignmentStrategy {
public ParkingSlot FindParkingSlot(ParkingLot parkingLot, AllowedVehicleType vehicleType);
}
45 changes: 19 additions & 26 deletions src/ParkingLot/controllers/TicketController.java
Original file line number Diff line number Diff line change
@@ -1,43 +1,36 @@
package ParkingLot.controllers;
package ParkingLot.Controllers;

import ParkingLot.Services.TicketService;
import ParkingLot.dtos.IssueTicketRequestDTO;
import ParkingLot.dtos.IssueTicketResponseDTO;
import ParkingLot.dtos.ResponseStatus;
import ParkingLot.models.Gate;
import ParkingLot.models.Operator;
import ParkingLot.models.Ticket;
import ParkingLot.models.Vehicle;
import ParkingLot.service.TicketService;


public class TicketController {
private TicketService ticketService;
TicketService ticketService = null;

public TicketController(TicketService ticketService) {
this.ticketService = ticketService;
}

public IssueTicketResponseDTO issueTicket(IssueTicketRequestDTO request){
IssueTicketResponseDTO response = new IssueTicketResponseDTO();
public IssueTicketResponseDTO issueTicket(IssueTicketRequestDTO issueTicketRequestDTO) {
IssueTicketResponseDTO issueTicketResponseDTO = new IssueTicketResponseDTO();

try{
Ticket ticket = ticketService.issueTicket(
request.getGateId(),
request.getVehicleNumber(),
request.getOwnerName(),
request.getVehicleType(),
request.getParkingLotId()
);
response.setTicketId(ticket.getId());
response.setParkingSlotNumber(ticket.getParkingSlot().getSlotNumber());
response.setResponseStatus(ResponseStatus.SUCCESS);
} catch (Exception e){
response.setResponseStatus(ResponseStatus.FAILURE);
Ticket ticket = ticketService.issueTicket(issueTicketRequestDTO.getGateNumber(),
issueTicketRequestDTO.getVehicleNumber(),
issueTicketRequestDTO.getVehicleType(),
issueTicketRequestDTO.getOwnerName(),
issueTicketRequestDTO.getParkingLotId());

issueTicketResponseDTO.setTicketId(ticket.getId());
issueTicketResponseDTO.setParkingSlotNumber(ticket.getParkingSlot().getParkingSlotId());
issueTicketResponseDTO.setResponseStatus(ResponseStatus.SUCCESS);
}
return response;
catch (RuntimeException e){
issueTicketResponseDTO.setResponseStatus(ResponseStatus.FAILED);
}
return issueTicketResponseDTO;
}
}

// DTO : Data Transfer Object

// business logic
// service
Loading