Skip to content

Added Ticket Management System for Parking Spot Tracking #105

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
16 changes: 13 additions & 3 deletions solutions/java/src/parkinglot/Level.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<ParkingSpot> 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;
Expand All @@ -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;
}
}
Expand Down
12 changes: 8 additions & 4 deletions solutions/java/src/parkinglot/ParkingLot.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
16 changes: 13 additions & 3 deletions solutions/java/src/parkinglot/ParkingLotDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
48 changes: 48 additions & 0 deletions solutions/java/src/parkinglot/Ticket.java
Original file line number Diff line number Diff line change
@@ -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;
}
}

49 changes: 49 additions & 0 deletions solutions/java/src/parkinglot/TicketManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package parkinglot;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;



public class TicketManager {


List<Ticket> 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<Ticket> getAllTickets() {
return tickets;
}

}