diff --git a/solutions/java/src/parkinglot/Level.java b/solutions/java/src/parkinglot/Level.java index c076ba69..06787fa8 100644 --- a/solutions/java/src/parkinglot/Level.java +++ b/solutions/java/src/parkinglot/Level.java @@ -5,13 +5,16 @@ import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class Level { private final int floor; private final List parkingSpots; + private AtomicInteger availableSpots; public Level(int floor, int numSpots) { this.floor = floor; + availableSpots = new AtomicInteger(numSpots); parkingSpots = new ArrayList<>(numSpots); // Assign spots in ration of 50:40:10 for bikes, cars and trucks double spotsForBikes = 0.50; @@ -31,20 +34,27 @@ public Level(int floor, int numSpots) { } } - public synchronized boolean parkVehicle(Vehicle vehicle) { + public synchronized Ticket parkVehicle(Vehicle vehicle) { for (ParkingSpot spot : parkingSpots) { if (spot.isAvailable() && spot.getVehicleType() == vehicle.getType()) { spot.parkVehicle(vehicle); - return true; + availableSpots.incrementAndGet(); + Ticket ticket = new Ticket(vehicle, spot.getSpotNumber(), floor, java.time.LocalDateTime.now()); + return TicketManager.getTicket(ticket); } } - return false; + return null; + } + + public int getAvailableSpots() { + return availableSpots.get(); } public synchronized boolean unparkVehicle(Vehicle vehicle) { for (ParkingSpot spot : parkingSpots) { if (!spot.isAvailable() && spot.getParkedVehicle().equals(vehicle)) { spot.unparkVehicle(); + availableSpots.decrementAndGet(); return true; } } diff --git a/solutions/java/src/parkinglot/ParkingLot.java b/solutions/java/src/parkinglot/ParkingLot.java index ffc465bc..cc866ddc 100644 --- a/solutions/java/src/parkinglot/ParkingLot.java +++ b/solutions/java/src/parkinglot/ParkingLot.java @@ -24,15 +24,19 @@ public void addLevel(Level level) { levels.add(level); } - public boolean parkVehicle(Vehicle vehicle) { + public Ticket parkVehicle(Vehicle vehicle) { for (Level level : levels) { - if (level.parkVehicle(vehicle)) { + if (level.getAvailableSpots() > 0) { + Ticket ticket = level.parkVehicle(vehicle); + if (ticket == null) { + continue; // No available spot in this level + } System.out.println("Vehicle parked successfully."); - return true; + return ticket; } } System.out.println("Could not park vehicle."); - return false; + return null; } public boolean unparkVehicle(Vehicle vehicle) { diff --git a/solutions/java/src/parkinglot/ParkingLotDemo.java b/solutions/java/src/parkinglot/ParkingLotDemo.java index 6b0640f0..13c05e48 100644 --- a/solutions/java/src/parkinglot/ParkingLotDemo.java +++ b/solutions/java/src/parkinglot/ParkingLotDemo.java @@ -16,9 +16,19 @@ public static void run() { Vehicle motorcycle = new Motorcycle("M1234"); // Park vehicles - parkingLot.parkVehicle(car); - parkingLot.parkVehicle(truck); - parkingLot.parkVehicle(motorcycle); + Ticket ticket1 = parkingLot.parkVehicle(car); + Ticket ticket2 = parkingLot.parkVehicle(truck); + Ticket ticket3 = parkingLot.parkVehicle(motorcycle); + + if(ticket1 != null) { + System.out.println("Car parked with ticket ID: " + ticket1.getTicketId()); + } + if(ticket2 != null) { + System.out.println("Truck parked with ticket ID: " + ticket2.getTicketId()); + } + if(ticket3 != null) { + System.out.println("Motorcycle parked with ticket ID: " + ticket3.getTicketId()); + } // Display availability parkingLot.displayAvailability(); diff --git a/solutions/java/src/parkinglot/Ticket.java b/solutions/java/src/parkinglot/Ticket.java new file mode 100644 index 00000000..05f0c20e --- /dev/null +++ b/solutions/java/src/parkinglot/Ticket.java @@ -0,0 +1,48 @@ +package parkinglot; + +import java.time.LocalDateTime; +import java.util.concurrent.atomic.AtomicInteger; + +import parkinglot.vehicletype.Vehicle; + +public class Ticket { + int ticketId; + Vehicle vehicle; + int parkingLotId; + int level; + LocalDateTime entryTime; + + public Ticket(Vehicle vehicle, int parkingLotId, int level, LocalDateTime entryTime) { + this.vehicle = vehicle; + this.parkingLotId = parkingLotId; + this.level = level; + this.entryTime = entryTime; + } + + public Ticket(AtomicInteger ticketId, Ticket ticket) { + this.ticketId = Integer.parseInt(ticketId.toString()); + this.vehicle = ticket.getVehicle(); + this.parkingLotId = ticket.getParkingLotId(); + this.level = ticket.getLevel(); + this.entryTime = ticket.getEntryTime(); + } + private LocalDateTime getEntryTime() { + return entryTime; + } + + private int getLevel() { + return level; + } + + private int getParkingLotId() { + return parkingLotId; + } + + public int getTicketId() { + return ticketId; + } + public Vehicle getVehicle() { + return vehicle; + } +} + diff --git a/solutions/java/src/parkinglot/TicketManager.java b/solutions/java/src/parkinglot/TicketManager.java new file mode 100644 index 00000000..6051c931 --- /dev/null +++ b/solutions/java/src/parkinglot/TicketManager.java @@ -0,0 +1,49 @@ +package parkinglot; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + + + +public class TicketManager { + + + List tickets = new java.util.ArrayList<>(); + private static TicketManager instance; + private static AtomicInteger ticketId = new AtomicInteger(0); + public static TicketManager getInstance() { + if (instance == null) { + instance = new TicketManager(); + } + return instance; + } + + public static synchronized Ticket getTicket(Ticket ticket) { + ticketId.incrementAndGet(); + return new Ticket(ticketId, ticket); + } + + + public Ticket getTicket(int ticketId) { + for (Ticket ticket : tickets) { + if (ticket.getTicketId() == ticketId) { + return ticket; + } + } + return null; + } + public void addTicket(Ticket ticket) { + tickets.add(ticket); + } + public void removeTicket(int ticketId) { + Ticket ticket = getTicket(ticketId); + if (ticket != null) { + tickets.remove(ticket); + } + } + public List getAllTickets() { + return tickets; + } + +} +