├── 5_Logger ├── Requirements.docx └── Logger │ └── src │ └── main │ └── java │ └── com │ └── lowleveldesign │ └── logger │ ├── sink │ ├── DebugLogSubject.java │ ├── ErrorLogSubject.java │ ├── InfoLogSubject.java │ ├── LogSink.java │ ├── FileSink.java │ ├── ConsoleSink.java │ ├── DatabaseSink.java │ └── LogSubject.java │ ├── Application.java │ ├── category │ ├── DebugLogger.java │ ├── ErrorLogger.java │ ├── InfoLogger.java │ └── MainLogger.java │ ├── Logger.java │ └── LogConfig.java ├── 6_NotifyMe ├── Requirements.docx └── NotifyMe │ └── src │ └── main │ └── java │ └── org │ └── example │ ├── Observer │ ├── UserObserver.java │ ├── EmailObserver.java │ └── MessageObserver.java │ ├── Observable │ ├── WatchStock.java │ ├── MobileStock.java │ └── StocksObservable.java │ └── Application.java ├── 2_SnakeAndLadder ├── Requirements.docx └── SnakeAndLadder │ └── src │ └── main │ └── java │ ├── model │ ├── Snake.java │ ├── Ladder.java │ ├── Cell.java │ ├── Player.java │ ├── Dice.java │ ├── Game.java │ └── Board.java │ └── SnakeLadderApplication.java ├── 4_VehicleRentalSystem ├── Requirements.docx └── VehicleRentalSystem │ └── src │ └── main │ └── java │ ├── model │ ├── VehicleType.java │ ├── VehicleStatus.java │ ├── Bike.java │ ├── Car.java │ ├── Location.java │ ├── User.java │ ├── VehicleInventory.java │ ├── VehicleRentalSystem.java │ ├── Vehicle.java │ └── Store.java │ ├── booking │ ├── BillStatus.java │ ├── PaymentMode.java │ ├── ReservationType.java │ ├── ReservationStatus.java │ ├── Bill.java │ ├── Payment.java │ └── Reservation.java │ └── VehicleRentalSystemApplication.java ├── 3_ElevatorSystem └── ElevatorSystem │ └── src │ └── main │ └── java │ ├── model │ ├── Direction.java │ ├── Display.java │ ├── Button.java │ ├── Door.java │ ├── ExternalButton.java │ ├── Floor.java │ ├── InternalButton.java │ ├── ElevatorController.java │ ├── ElevatorSystem.java │ └── ElevatorCar.java │ ├── algorithm │ ├── PendingRequests.java │ ├── ElevatorSelectionStrategy.java │ ├── FirstComeFirstServe.java │ ├── ShortestSeekTime.java │ ├── ZoneStrategy.java │ ├── ElevatorControlStrategy.java │ ├── ScanAlgorithm.java │ ├── OddEvenStrategy.java │ └── LookAlgorithm.java │ ├── dispatcher │ ├── InternalDispatcher.java │ └── ExternalDispatcher.java │ └── ElevatorSystemApplication.java ├── 1_ParkingLot └── ParkingLot │ └── src │ └── main │ └── java │ └── com │ └── sj │ └── parkinglot │ ├── parking │ ├── PaymentType.java │ ├── ParkingSpaceType.java │ ├── ParkingStrategy.java │ ├── CarParkingSpace.java │ ├── TruckParkingSpace.java │ ├── BikeParkingSpace.java │ ├── NaturalOrderParking.java │ ├── HourPaymentStrategy.java │ ├── EntryGate.java │ ├── ParkingSpace.java │ ├── PaymentStrategy.java │ ├── DayPaymentStrategy.java │ ├── Payment.java │ ├── Ticket.java │ ├── ExitGate.java │ ├── ParkingLot.java │ └── Floor.java │ ├── vehicle │ ├── VehicleType.java │ ├── CarVehicle.java │ ├── BikeVehicle.java │ ├── TruckVehicle.java │ └── Vehicle.java │ ├── admin │ ├── LoginInfo.java │ ├── ContactInfo.java │ ├── Address.java │ └── Admin.java │ └── ParkingLotApplication.java └── README.md /5_Logger/Requirements.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swatijha-2906/LowLevelDesigns/HEAD/5_Logger/Requirements.docx -------------------------------------------------------------------------------- /6_NotifyMe/Requirements.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swatijha-2906/LowLevelDesigns/HEAD/6_NotifyMe/Requirements.docx -------------------------------------------------------------------------------- /2_SnakeAndLadder/Requirements.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swatijha-2906/LowLevelDesigns/HEAD/2_SnakeAndLadder/Requirements.docx -------------------------------------------------------------------------------- /4_VehicleRentalSystem/Requirements.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swatijha-2906/LowLevelDesigns/HEAD/4_VehicleRentalSystem/Requirements.docx -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/Direction.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public enum Direction { 4 | UP, DOWN, NONE; 5 | } 6 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/VehicleType.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public enum VehicleType { 4 | CAR, 5 | BIKE 6 | } 7 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/BillStatus.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | public enum BillStatus { 4 | PAID, 5 | PENDING 6 | } 7 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Observer/UserObserver.java: -------------------------------------------------------------------------------- 1 | package org.example.Observer; 2 | 3 | public interface UserObserver { 4 | void update(); 5 | } 6 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/PaymentMode.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | public enum PaymentMode { 4 | CARD, 5 | UPI, 6 | CASH 7 | } 8 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/ReservationType.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | public enum ReservationType { 4 | DAILY, 5 | HOURLY 6 | } 7 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/DebugLogSubject.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | public class DebugLogSubject extends LogSubject{ 4 | } 5 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/VehicleStatus.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public enum VehicleStatus { 4 | RENTED, 5 | AVAILABLE, 6 | MAINTENANCE 7 | } 8 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/ErrorLogSubject.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | public class ErrorLogSubject extends LogSubject{ 4 | 5 | } 6 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/PaymentType.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | public enum PaymentType { 4 | CASH, 5 | CARD, 6 | UPI 7 | } 8 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/vehicle/VehicleType.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.vehicle; 2 | 3 | public enum VehicleType { 4 | CAR, 5 | BIKE, 6 | TRUCK 7 | } 8 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/ParkingSpaceType.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | public enum ParkingSpaceType { 4 | CarParking, 5 | BikeParking, 6 | TruckParking 7 | } 8 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/ReservationStatus.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | public enum ReservationStatus { 4 | SCHEDULED, 5 | INPROGRESS, 6 | COMPLETED, 7 | CANCELLED 8 | } 9 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Observable/WatchStock.java: -------------------------------------------------------------------------------- 1 | package org.example.Observable; 2 | 3 | public class WatchStock extends StocksObservable{ 4 | public WatchStock(String name) { 5 | super(name); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/InfoLogSubject.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class InfoLogSubject extends LogSubject{ 7 | 8 | } 9 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Observable/MobileStock.java: -------------------------------------------------------------------------------- 1 | package org.example.Observable; 2 | 3 | public class MobileStock extends StocksObservable{ 4 | 5 | public MobileStock(String name) { 6 | super(name); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/vehicle/CarVehicle.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.vehicle; 2 | 3 | public class CarVehicle extends Vehicle{ 4 | public CarVehicle(String regNum) { 5 | super(regNum, VehicleType.CAR); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/Display.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Display { 9 | private int floor; 10 | private Direction dir; 11 | } 12 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/vehicle/BikeVehicle.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.vehicle; 2 | 3 | public class BikeVehicle extends Vehicle{ 4 | 5 | public BikeVehicle(String regNum) { 6 | super(regNum, VehicleType.BIKE); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/ParkingStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import java.util.List; 4 | 5 | public abstract class ParkingStrategy { 6 | public abstract ParkingSpace park(List availableSpaces); 7 | } 8 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/Bike.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | public class Bike extends Vehicle { 6 | 7 | public Bike(int vehicleId) { 8 | super(vehicleId, VehicleType.BIKE); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/vehicle/TruckVehicle.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.vehicle; 2 | 3 | public class TruckVehicle extends Vehicle { 4 | 5 | public TruckVehicle(String regNum) { 6 | super(regNum, VehicleType.TRUCK); 7 | 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/Car.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | public class Car extends Vehicle{ 6 | 7 | 8 | public Car(int vehicleId) { 9 | super(vehicleId, VehicleType.CAR); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/Button.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public class Button { 4 | //for External Button 5 | public void pressButton(int floor, Direction dir){} 6 | 7 | //for Internal Button 8 | public void pressButton(int floor, Direction dir, int elevatorId){} 9 | } 10 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Snake.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class Snake { 7 | private int start; 8 | private int end; 9 | public Snake(int start, int end) 10 | { 11 | this.start= start; 12 | this.end= end; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Ladder.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class Ladder { 7 | private int start; 8 | private int end; 9 | public Ladder(int start, int end) 10 | { 11 | this.start = start; 12 | this.end= end; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/LogSink.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | public abstract class LogSink { 4 | LogSubject logsubject; 5 | 6 | LogSink(LogSubject logsubject) 7 | { 8 | this.logsubject= logsubject; 9 | } 10 | abstract void log(String msg); 11 | } 12 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Cell.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Cell { 9 | private Snake snake; 10 | private Ladder ladder; 11 | 12 | public Cell(){ 13 | snake= null; 14 | ladder= null; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/Door.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | 4 | public class Door { 5 | public void open(int id) 6 | { 7 | System.out.println("Door opens for elevator "+ id); 8 | } 9 | public void close(int id) 10 | { 11 | System.out.println("Door closes for elevator "+ id); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/Location.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | public class Location { 10 | String address; 11 | String city; 12 | String state; 13 | String country; 14 | int pinCode; 15 | } 16 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/admin/LoginInfo.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.admin; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @Getter 8 | @Setter 9 | @AllArgsConstructor 10 | public class LoginInfo { 11 | private String userName; 12 | private String password; 13 | } 14 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/CarParkingSpace.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class CarParkingSpace extends ParkingSpace { 7 | 8 | public CarParkingSpace(String spaceId) { 9 | super(spaceId, ParkingSpaceType.CarParking); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/TruckParkingSpace.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | public class TruckParkingSpace extends ParkingSpace{ 7 | public TruckParkingSpace(String spaceId) { 8 | super(spaceId, ParkingSpaceType.TruckParking); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/BikeParkingSpace.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | 7 | public class BikeParkingSpace extends ParkingSpace{ 8 | 9 | public BikeParkingSpace(String spaceId) { 10 | super(spaceId, ParkingSpaceType.BikeParking); 11 | } 12 | 13 | 14 | } 15 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/FileSink.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | public class FileSink extends LogSink{ 4 | public FileSink(LogSubject logsubject) { 5 | super(logsubject); 6 | } 7 | 8 | @Override 9 | public void log(String msg) { 10 | System.out.println("Logged in file: " + msg); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/Application.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger; 2 | 3 | public class Application { 4 | public static void main(String args[]) 5 | { 6 | Logger logger= Logger.getInstance(); 7 | logger.log(3, "This is debug log"); 8 | logger.log(1, "This is info log"); 9 | logger.log(2, "This is error log"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/ConsoleSink.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | public class ConsoleSink extends LogSink{ 4 | 5 | public ConsoleSink(LogSubject logsubject) { 6 | super(logsubject); 7 | } 8 | 9 | @Override 10 | public void log(String msg) { 11 | System.out.println("Logged in console: " + msg); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/DatabaseSink.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | public class DatabaseSink extends LogSink{ 4 | public DatabaseSink(LogSubject logsubject) { 5 | super(logsubject); 6 | } 7 | 8 | @Override 9 | public void log(String msg) { 10 | System.out.println("Logged in database: " + msg); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/admin/ContactInfo.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.admin; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @Getter 8 | @Setter 9 | @AllArgsConstructor 10 | public class ContactInfo { 11 | private String phone; 12 | private String email; 13 | private Address address; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/User.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.UUID; 6 | 7 | @Getter 8 | public class User { 9 | int userId; 10 | String divingLicense; 11 | 12 | public User(int userId, String divingLicense) 13 | { 14 | this.userId= userId; 15 | this.divingLicense= divingLicense; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LowLevelDesign 2 | 3 | ## Problems Included Till Now- 4 | 5 | 1. Parking Lot 6 | 2. Snake and Ladder 7 | 3. Elevator System 8 | 4. Vehicle Rental System 9 | 5. Logging System 10 | 6. Notify Me 11 | 12 | 13 | 14 | ### To be updated with more problems... 15 | 16 | #### Connect with Me 17 | 18 | [LinkedIn](https://www.linkedin.com/in/swati-jha2906)\ 19 | [Twitter](https://twitter.com/this_is_swati_) -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/PendingRequests.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import lombok.Getter; 4 | import model.Direction; 5 | 6 | @Getter 7 | public class PendingRequests { 8 | private int floor; 9 | private Direction dir; 10 | 11 | public PendingRequests(int floor, Direction dir) 12 | { 13 | this.floor= floor; 14 | this.dir= dir; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/admin/Address.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.admin; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Address { 9 | private String addressLine1; 10 | private String addressLine2; 11 | private String city; 12 | private String state; 13 | private String country; 14 | private String pinCode; 15 | } 16 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/NaturalOrderParking.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import lombok.Setter; 5 | 6 | import java.util.List; 7 | 8 | 9 | public class NaturalOrderParking extends ParkingStrategy{ 10 | 11 | public ParkingSpace park(List availableSpaces){ 12 | return availableSpaces.get(0); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Player.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | public class Player { 8 | private int id; 9 | private String name; 10 | @Setter 11 | private int currentPosition; 12 | 13 | public Player(int id, String name){ 14 | this.id= id; 15 | this.name= name; 16 | currentPosition= 1; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/vehicle/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.vehicle; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | public abstract class Vehicle { 8 | private String regNum; 9 | private VehicleType vType; 10 | 11 | 12 | public Vehicle(String regNum, VehicleType vType) 13 | { 14 | this.regNum= regNum; 15 | this.vType= vType; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/ElevatorSelectionStrategy.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.Direction; 4 | import model.ElevatorController; 5 | import model.ElevatorSystem; 6 | 7 | import java.util.List; 8 | 9 | public class ElevatorSelectionStrategy { 10 | protected List elevatorControllerList = ElevatorSystem.INSTANCE.getElevatorControllerList(); 11 | 12 | 13 | public int selectElevator(int floor, Direction dir) { 14 | return 0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/SnakeLadderApplication.java: -------------------------------------------------------------------------------- 1 | import model.Game; 2 | 3 | public class SnakeLadderApplication { 4 | public static void main(String args[]) 5 | { 6 | Game game= new Game(); 7 | game.setDice(2); 8 | game.setBoard(100, 4, 3); 9 | game.addPlayers(1, "Swati"); 10 | game.addPlayers(2, "Shristi"); 11 | game.addPlayers(3, "Shivani"); 12 | game.addPlayers(4, "Sonal"); 13 | game.startGame(); 14 | 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/category/DebugLogger.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.category; 2 | 3 | import com.lowleveldesign.logger.sink.LogSubject; 4 | 5 | public class DebugLogger extends MainLogger { 6 | public DebugLogger(int level, LogSubject logSubject, MainLogger nextLogger) { 7 | super(level, logSubject, nextLogger); 8 | 9 | } 10 | 11 | @Override 12 | public void display(String msg){ 13 | logSubject.notifyAllObservers("DEBUG: "+ msg); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/category/ErrorLogger.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.category; 2 | 3 | import com.lowleveldesign.logger.sink.LogSubject; 4 | 5 | public class ErrorLogger extends MainLogger { 6 | public ErrorLogger(int level, LogSubject logSubject, MainLogger nextLogger) { 7 | super(level, logSubject, nextLogger); 8 | 9 | } 10 | 11 | @Override 12 | public void display(String msg){ 13 | 14 | logSubject.notifyAllObservers("ERROR: "+ msg); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/category/InfoLogger.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.category; 2 | 3 | import com.lowleveldesign.logger.sink.LogSubject; 4 | 5 | public class InfoLogger extends MainLogger { 6 | 7 | public InfoLogger(int level, LogSubject logSubject, MainLogger nextLogger) { 8 | super(level, logSubject, nextLogger); 9 | 10 | } 11 | 12 | 13 | 14 | @Override 15 | public void display(String msg){ 16 | logSubject.notifyAllObservers("INFO: "+ msg); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/FirstComeFirstServe.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.ElevatorController; 4 | 5 | public class FirstComeFirstServe extends ElevatorControlStrategy { 6 | 7 | 8 | public void moveElevator(ElevatorController elevatorController) 9 | { 10 | //poll each requests out of queue one by one 11 | //move elevator according to each request 12 | //Disadvantage: frequent change of direction of elevator, hence inefficient and 13 | // long waiting time for users 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Dice.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.concurrent.ThreadLocalRandom; 6 | 7 | @Getter 8 | public class Dice { 9 | private int diceCount; 10 | 11 | public Dice(int count) 12 | { 13 | diceCount= count; 14 | } 15 | 16 | public int rollDice() 17 | { 18 | int count=0, total=0; 19 | while(count< diceCount) 20 | { 21 | total+= ThreadLocalRandom.current().nextInt(1, 7); 22 | count++; 23 | } 24 | return total; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/ExternalButton.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import dispatcher.ExternalDispatcher; 4 | import lombok.Getter; 5 | 6 | 7 | public class ExternalButton extends Button{ 8 | private ExternalDispatcher edispatcher= ExternalDispatcher.INSTANCE; 9 | @Getter 10 | private Direction direction; 11 | 12 | 13 | 14 | public void pressButton(int floor, Direction dir) 15 | { 16 | direction= dir; 17 | System.out.println("Pressed " + direction + " from floor " + floor); 18 | edispatcher.submitRequest(floor, dir); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/dispatcher/InternalDispatcher.java: -------------------------------------------------------------------------------- 1 | package dispatcher; 2 | 3 | import model.Direction; 4 | import model.ElevatorController; 5 | import model.ElevatorSystem; 6 | 7 | public class InternalDispatcher { 8 | 9 | public void submitRequest(int floor, Direction dir, int elevatorId) 10 | { 11 | for(ElevatorController eController: ElevatorSystem.INSTANCE.getElevatorControllerList()) 12 | { 13 | if(eController.getId()== elevatorId) 14 | { 15 | eController.acceptRequest(floor, dir); 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/sink/LogSubject.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.sink; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class LogSubject { 7 | List observers = new ArrayList<>(); 8 | 9 | public void add(LogSink logSink) { 10 | observers.add(logSink); 11 | } 12 | 13 | public void remove(LogSink logSink) { 14 | observers.remove(logSink); 15 | } 16 | 17 | public void notifyAllObservers(String msg) { 18 | for (LogSink logsink : observers) { 19 | logsink.log(msg); 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/Bill.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.UUID; 6 | 7 | @Getter 8 | public class Bill { 9 | String billID; 10 | Reservation reservation; 11 | int amount; 12 | BillStatus status; 13 | 14 | public Bill(Reservation reservation) 15 | { 16 | billID = UUID.randomUUID().toString(); 17 | this.reservation = reservation; 18 | //calculate amount based on pickup and drop time and vehicle rental cost 19 | // (we can get all these from reservation object) 20 | amount= 100; 21 | status = BillStatus.PENDING; 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/HourPaymentStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | 5 | import java.time.temporal.ChronoUnit; 6 | 7 | public class HourPaymentStrategy extends PaymentStrategy{ 8 | public HourPaymentStrategy(){ 9 | this.setBikeCharges(10); 10 | this.setCarCharges(20); 11 | this.setTruckCharges(30); 12 | } 13 | 14 | @Override 15 | public double calculateCost(Ticket ticket) { 16 | long hours = ChronoUnit.HOURS.between(ticket.getExitTime(), ticket.getEntryTime()); 17 | return hours * getChargeType(ticket.getVehicle()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/Payment.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | import java.util.UUID; 4 | 5 | public class Payment { 6 | String paymentID; 7 | Bill bill; 8 | PaymentMode paymentMode; 9 | 10 | public Payment() 11 | { 12 | paymentID = UUID.randomUUID().toString(); 13 | } 14 | 15 | public void makePayment(Bill bill, PaymentMode paymentMode) 16 | { 17 | this.bill= bill; 18 | this.paymentMode= paymentMode; 19 | bill.status= BillStatus.PAID; 20 | 21 | System.out.println("Paid Rs " + bill.amount + " successfully"); 22 | System.out.println("Your Reservation is successful"); 23 | 24 | } 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/Logger.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger; 2 | 3 | import com.lowleveldesign.logger.category.MainLogger; 4 | 5 | public class Logger { 6 | private static Logger logger = null; 7 | private static MainLogger mainLogger; 8 | private Logger() 9 | { 10 | 11 | } 12 | public static Logger getInstance() 13 | { 14 | if(logger == null) 15 | { 16 | logger= new Logger(); 17 | mainLogger= LogConfig.configLog(); 18 | 19 | } 20 | 21 | return logger; 22 | } 23 | 24 | void log(int logLevel,String msg) 25 | { 26 | mainLogger.log(logLevel, msg); 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/ShortestSeekTime.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.ElevatorController; 4 | 5 | public class ShortestSeekTime extends ElevatorControlStrategy { 6 | public void moveElevator(ElevatorController elevatorController) 7 | { 8 | //implemented using min heap which is sorted according to 9 | //min distance of requested floor from the current floor of elevator 10 | 11 | //this min heap is updated everytime a new request is added in the queue or 12 | // when elevator moves to another floor 13 | 14 | //Disadvantage: starvation of distant floor when maximum request keeps comes from nearly floors 15 | 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/ZoneStrategy.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.Direction; 4 | import model.ElevatorController; 5 | 6 | import java.util.concurrent.ThreadLocalRandom; 7 | 8 | public class ZoneStrategy extends ElevatorSelectionStrategy { 9 | @Override 10 | public int selectElevator(int floor, Direction dir) { 11 | for(ElevatorController eController: elevatorControllerList) 12 | { 13 | //assign elevators according to zones in building 14 | //out of these elevators select the elevator which is going in the same direction or is idle 15 | } 16 | return ThreadLocalRandom.current().nextInt(1, elevatorControllerList.size()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/Floor.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Floor { 9 | private int id; 10 | private Display display; 11 | private Button button; 12 | 13 | public Floor(int id) 14 | { 15 | this.id= id; 16 | button= new ExternalButton(); 17 | } 18 | 19 | public void pressButton(Direction dir) 20 | { 21 | button.pressButton(id, dir); 22 | 23 | } 24 | 25 | //called everytime selected elevator moves each floor 26 | private void setDisplay(int floor, Direction dir) 27 | { 28 | display.setDir(dir); 29 | display.setFloor(floor); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Observer/EmailObserver.java: -------------------------------------------------------------------------------- 1 | package org.example.Observer; 2 | 3 | import org.example.Observable.StocksObservable; 4 | 5 | public class EmailObserver implements UserObserver { 6 | String emailId; 7 | StocksObservable stocksObservable; 8 | 9 | public EmailObserver(String email, StocksObservable observable) 10 | { 11 | emailId= email; 12 | stocksObservable = observable; 13 | } 14 | 15 | @Override 16 | public void update() { 17 | sendMail(); 18 | } 19 | 20 | void sendMail() 21 | { 22 | String msg= stocksObservable.getStockName() + " is back in stocks"; 23 | System.out.println("Mail sent to " + emailId + ": " + msg); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/EntryGate.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import lombok.Getter; 5 | 6 | import java.time.LocalDateTime; 7 | import java.util.UUID; 8 | 9 | @Getter 10 | public class EntryGate { 11 | private String gateId; 12 | 13 | public EntryGate(String gateId){ 14 | this.gateId= gateId; 15 | } 16 | 17 | public Ticket generateTicket(Vehicle v){ 18 | if(!ParkingLot.INSTANCE.isParkingSpaceAvailable(v.getVType())) 19 | return null; 20 | 21 | 22 | ParkingSpace pSpace= ParkingLot.INSTANCE.findParkingSpace(v); 23 | pSpace.parkVehicle(v); 24 | return new Ticket(v, pSpace); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/ElevatorControlStrategy.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import model.ElevatorController; 6 | import model.ElevatorSystem; 7 | 8 | import java.util.LinkedList; 9 | import java.util.List; 10 | import java.util.Queue; 11 | 12 | @Getter 13 | public class ElevatorControlStrategy { 14 | //queue storing pending requests in form of 15 | @Setter private Queue pendingRequestList= new LinkedList(); 16 | private List elevatorControllerList = ElevatorSystem.INSTANCE.getElevatorControllerList(); 17 | 18 | public void moveElevator(ElevatorController elevatorController) 19 | { 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Observer/MessageObserver.java: -------------------------------------------------------------------------------- 1 | package org.example.Observer; 2 | 3 | import org.example.Observable.StocksObservable; 4 | 5 | public class MessageObserver implements UserObserver { 6 | String mobileNumber; 7 | StocksObservable stocksObservable; 8 | 9 | public MessageObserver(String mobile, StocksObservable observable) 10 | { 11 | mobileNumber= mobile; 12 | stocksObservable = observable; 13 | } 14 | 15 | @Override 16 | public void update() { 17 | sendMsg(); 18 | } 19 | 20 | void sendMsg() 21 | { 22 | String msg= stocksObservable.getStockName() + " is back in stocks"; 23 | System.out.println("Text message sent to " + mobileNumber + ": " + msg); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/InternalButton.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import dispatcher.InternalDispatcher; 4 | import lombok.Getter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class InternalButton extends Button{ 10 | private InternalDispatcher idispatcher; 11 | @Getter 12 | private List floors= new ArrayList(); 13 | 14 | public InternalButton() 15 | { 16 | idispatcher = new InternalDispatcher(); 17 | } 18 | 19 | public void pressButton(int floor, Direction dir, int elevatorId) 20 | { 21 | 22 | floors.add(floor); 23 | System.out.println("Pressed floor "+ floor + " from elevator "+ elevatorId); 24 | idispatcher.submitRequest(floor, dir, elevatorId); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/ParkingSpace.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | public abstract class ParkingSpace 8 | { 9 | private String spaceId; 10 | private ParkingSpaceType pType; 11 | private Vehicle vehicle; 12 | boolean isEmpty; 13 | 14 | 15 | public ParkingSpace(String spaceId, ParkingSpaceType type){ 16 | this.spaceId= spaceId; 17 | this.pType= type; 18 | this.isEmpty= true; 19 | 20 | } 21 | public void parkVehicle(Vehicle v) 22 | { 23 | isEmpty= false; 24 | vehicle= v; 25 | } 26 | public void removeVehicle() 27 | { 28 | vehicle= null; 29 | isEmpty= true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/PaymentStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @Setter 8 | @Getter 9 | public abstract class PaymentStrategy { 10 | 11 | private double bikeCharges; 12 | private double carCharges; 13 | private double truckCharges; 14 | public abstract double calculateCost(Ticket t); 15 | protected double getChargeType(Vehicle v){ 16 | switch (v.getVType()){ 17 | case CAR : 18 | return carCharges; 19 | case BIKE: 20 | return bikeCharges; 21 | case TRUCK: 22 | return truckCharges; 23 | 24 | 25 | } 26 | 27 | return 0; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/DayPaymentStrategy.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.time.LocalDateTime; 8 | import java.time.temporal.ChronoUnit; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | 12 | public class DayPaymentStrategy extends PaymentStrategy{ 13 | 14 | public DayPaymentStrategy(){ 15 | this.setBikeCharges(100); 16 | this.setCarCharges(200); 17 | this.setTruckCharges(300); 18 | } 19 | 20 | @Override 21 | public double calculateCost(Ticket ticket) { 22 | 23 | long days = ChronoUnit.DAYS.between(ticket.getExitTime(), ticket.getEntryTime()); 24 | return days * getChargeType(ticket.getVehicle()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/VehicleInventory.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class VehicleInventory { 9 | List vehicles= new ArrayList<>(); 10 | 11 | public VehicleInventory(List vehicles) 12 | { 13 | this.vehicles= vehicles; 14 | } 15 | 16 | List getAvailableVehicles(VehicleType vehicleType) 17 | { 18 | //return vehicles whose status is AVAILABLE and VehicleType is vehicletype 19 | return vehicles; 20 | } 21 | 22 | void addVehicle(Vehicle vehicle) 23 | { 24 | vehicles.add(vehicle); 25 | } 26 | 27 | void removeVehicle(Vehicle vehicle) 28 | { 29 | vehicles.remove(vehicle); 30 | } 31 | 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/ElevatorController.java: -------------------------------------------------------------------------------- 1 | package model; 2 | import algorithm.PendingRequests; 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class ElevatorController { 7 | 8 | private int id; 9 | private ElevatorCar elevatorCar; 10 | 11 | 12 | 13 | 14 | public ElevatorController(int id) 15 | { 16 | this.id= id; 17 | elevatorCar= new ElevatorCar(id); 18 | } 19 | 20 | public void acceptRequest(int floor, Direction dir) 21 | { 22 | ElevatorSystem.elevatorControlStrategy.getPendingRequestList().add(new PendingRequests(floor, dir)); 23 | 24 | controlCar(); 25 | } 26 | private void controlCar() 27 | { 28 | 29 | ElevatorSystem.elevatorControlStrategy.moveElevator(this); 30 | System.out.println("Elevator moving..."); 31 | } 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/category/MainLogger.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger.category; 2 | 3 | import com.lowleveldesign.logger.sink.LogSubject; 4 | 5 | public abstract class MainLogger { 6 | int level; 7 | MainLogger nextLogger; 8 | LogSubject logSubject; 9 | 10 | //set nextLogger in constructor or create setNextLogger method; 11 | public MainLogger(int level, LogSubject logSubject, MainLogger nextLogger) 12 | { 13 | this.level= level; 14 | this.nextLogger= nextLogger; 15 | this.logSubject= logSubject; 16 | } 17 | 18 | public void log(int logLevel, String msg) 19 | { 20 | if(level == logLevel) 21 | display(msg); 22 | else 23 | nextLogger.log(logLevel, msg); 24 | } 25 | 26 | public abstract void display(String msg); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/dispatcher/ExternalDispatcher.java: -------------------------------------------------------------------------------- 1 | package dispatcher; 2 | 3 | import model.Direction; 4 | import model.ElevatorController; 5 | import model.ElevatorSystem; 6 | 7 | public class ExternalDispatcher { 8 | 9 | public static ExternalDispatcher INSTANCE = new ExternalDispatcher(); 10 | private ExternalDispatcher() 11 | { 12 | 13 | } 14 | 15 | public void submitRequest(int floor, Direction dir) 16 | { 17 | int elevatorId= ElevatorSystem.elevatorSelectionStrategy.selectElevator(floor, dir); 18 | System.out.println("Selected elevator " + elevatorId); 19 | for(ElevatorController eController: ElevatorSystem.INSTANCE.getElevatorControllerList()) 20 | { 21 | if(eController.getId()== elevatorId) 22 | { 23 | eController.acceptRequest(floor, dir); 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/Payment.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import lombok.Getter; 4 | 5 | import java.time.LocalDateTime; 6 | import java.util.UUID; 7 | 8 | @Getter 9 | public class Payment 10 | { 11 | private final String paymentId; 12 | private final LocalDateTime pTime; 13 | private final double amount; 14 | private final Ticket ticket; 15 | private PaymentType pType; 16 | private final PaymentStrategy pStrategy; 17 | 18 | public Payment(double amount, Ticket ticket, PaymentStrategy pStrategy){ 19 | this.paymentId= UUID.randomUUID().toString(); 20 | this.pTime= LocalDateTime.now(); 21 | this.amount= amount; 22 | this.pStrategy= pStrategy; 23 | this.ticket= ticket; 24 | 25 | 26 | } 27 | public void makePayment(PaymentType pType) 28 | { 29 | this.pType= pType; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/Ticket.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | import java.util.UUID; 10 | 11 | @Getter 12 | public class Ticket { 13 | private final String ticketId; 14 | private final LocalDateTime entryTime; 15 | private final Vehicle vehicle; 16 | private final ParkingSpace pSpaceAssigned; 17 | @Setter private LocalDateTime exitTime; 18 | @Setter private boolean isActive; 19 | @Setter private double charges; 20 | 21 | public Ticket(Vehicle v, ParkingSpace pSpace) 22 | { 23 | this.ticketId= UUID.randomUUID().toString(); 24 | this.entryTime= LocalDateTime.now(); 25 | this.isActive= true; 26 | this.vehicle= v; 27 | this.pSpaceAssigned= pSpace; 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/ExitGate.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import lombok.Getter; 4 | 5 | import java.time.LocalDateTime; 6 | import java.util.UUID; 7 | 8 | @Getter 9 | public class ExitGate { 10 | String gateId; 11 | 12 | public ExitGate(String gateId) 13 | { 14 | this.gateId= gateId; 15 | 16 | } 17 | 18 | 19 | public Payment makePayment(PaymentType pType, PaymentStrategy pStrategy, Ticket ticket){ 20 | 21 | ticket.setExitTime(LocalDateTime.now()); 22 | double cost= pStrategy.calculateCost(ticket); 23 | ticket.setCharges(cost); 24 | 25 | Payment p= new Payment(cost, ticket, pStrategy); 26 | p.makePayment(pType); 27 | ticket.setActive(false); 28 | 29 | freeParkingSpace(ticket.getPSpaceAssigned()); 30 | return p; 31 | } 32 | 33 | private void freeParkingSpace(ParkingSpace pSpace) 34 | { 35 | pSpace.removeVehicle(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /5_Logger/Logger/src/main/java/com/lowleveldesign/logger/LogConfig.java: -------------------------------------------------------------------------------- 1 | package com.lowleveldesign.logger; 2 | 3 | import com.lowleveldesign.logger.category.DebugLogger; 4 | import com.lowleveldesign.logger.category.ErrorLogger; 5 | import com.lowleveldesign.logger.category.InfoLogger; 6 | import com.lowleveldesign.logger.category.MainLogger; 7 | import com.lowleveldesign.logger.sink.*; 8 | 9 | public class LogConfig { 10 | public static MainLogger configLog() 11 | { 12 | //add sink for each log 13 | LogSubject info = new InfoLogSubject(); 14 | LogSubject err= new ErrorLogSubject(); 15 | LogSubject debug= new DebugLogSubject(); 16 | 17 | info.add(new ConsoleSink(info)); 18 | err.add(new FileSink(err)); 19 | debug.add(new ConsoleSink(debug)); 20 | debug.add(new DatabaseSink(debug)); 21 | 22 | //create chain 23 | MainLogger mainLogger= new InfoLogger(1, info, new ErrorLogger(2, err, new DebugLogger(3, debug, null))); 24 | 25 | return mainLogger; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Observable/StocksObservable.java: -------------------------------------------------------------------------------- 1 | package org.example.Observable; 2 | 3 | import org.example.Observer.UserObserver; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class StocksObservable { 9 | 10 | List observerList = new ArrayList<>(); 11 | int stockCount = 0; 12 | String stockName; 13 | 14 | StocksObservable(String name) 15 | { 16 | stockName= name; 17 | } 18 | 19 | public void add(UserObserver ob) { 20 | observerList.add(ob); 21 | } 22 | 23 | public void remove(UserObserver ob) { 24 | observerList.remove(ob); 25 | } 26 | 27 | public void notifyUsers() { 28 | for (UserObserver ob : observerList) 29 | ob.update(); 30 | } 31 | 32 | public void setCount(int count) { 33 | 34 | if (stockCount == 0) 35 | notifyUsers(); 36 | stockCount = count; 37 | } 38 | 39 | public String getStockName() { 40 | return stockName; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/VehicleRentalSystem.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class VehicleRentalSystem { 7 | List users= new ArrayList<>(); 8 | List stores = new ArrayList<>(); 9 | 10 | public void addUsers(User user) 11 | { 12 | users.add(user); 13 | } 14 | public void removeUsers(User user) 15 | { 16 | users.remove(user); 17 | } 18 | public void addStores(Store store) 19 | { 20 | stores.add(store); 21 | } 22 | public void removeStores(Store store) 23 | { 24 | stores.remove(store); 25 | } 26 | 27 | public List findStores(Location location) 28 | { 29 | List availableStores = new ArrayList<>(); 30 | 31 | //add logic to filter out all the available stores present in the location 32 | availableStores.add(stores.get(0)); 33 | availableStores.add(stores.get(1)); 34 | 35 | return availableStores; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/model/Vehicle.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Getter 10 | @Setter 11 | public class Vehicle { 12 | int vehicleId; 13 | int vehicleNo; 14 | String company; 15 | String modelName; 16 | int kmsDriven; 17 | LocalDateTime manufacturingDate; 18 | int average; 19 | int cc; 20 | int dailyRentalCost; 21 | int hourlyRentalCost; 22 | int noOfSeats; 23 | VehicleStatus status; 24 | VehicleType type; 25 | 26 | public Vehicle(int vehicleId, VehicleType vehicleType) 27 | { 28 | this.vehicleId= vehicleId; 29 | this.type = vehicleType; 30 | } 31 | 32 | 33 | 34 | void updateRentalCost(int dailyRentalCost, int hourlyRentalCost) 35 | { 36 | this.dailyRentalCost = dailyRentalCost; 37 | this.hourlyRentalCost = hourlyRentalCost; 38 | 39 | } 40 | 41 | void setVehicleStatus(VehicleStatus status) 42 | { 43 | this.status = status; 44 | } 45 | 46 | void updateDistanceTravelled(int distance) 47 | { 48 | kmsDriven = distance; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/ScanAlgorithm.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.ElevatorController; 4 | 5 | public class ScanAlgorithm extends ElevatorControlStrategy { 6 | public void moveElevator(ElevatorController elevatorController) 7 | { 8 | // In this algorithm, elevator starts from one end of the disk and moves 9 | // towards the other end, servicing requests in between one by one and reach the other end. 10 | // Then the direction of the elevator is reversed and the process continues. 11 | 12 | // Implemented using two array 13 | // All floors with UP requests are marked in the UP array 14 | // and all floors with DOWN request are marked in the DOWN array 15 | // and the elevator scans UP array while moving up and DOWN array while moving down 16 | // and it stops at the requested floors 17 | 18 | // Advantage: 19 | // 1. not frequent change of floor for every request 20 | // 2. no starvation 21 | 22 | // Disadvantage: If there are 100 floors, and last requested floor in current direction 23 | // is 15, then also the elevator will move till the 100th floor. 24 | // This is improved by LOOK Algorithm 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/booking/Reservation.java: -------------------------------------------------------------------------------- 1 | package booking; 2 | 3 | import lombok.Getter; 4 | import model.Location; 5 | import model.User; 6 | import model.Vehicle; 7 | 8 | import java.time.LocalDateTime; 9 | import java.util.UUID; 10 | 11 | @Getter 12 | public class Reservation { 13 | String rID; 14 | User user; 15 | Vehicle vehicle; 16 | LocalDateTime pickupTime; 17 | LocalDateTime dropTime; 18 | Location pickupLocation; 19 | Location dropLocation; 20 | ReservationStatus status; 21 | ReservationType reservationType; 22 | 23 | public Reservation(User user, Vehicle vehicle, LocalDateTime pickupTime, 24 | Location pickupLocation, LocalDateTime dropTime, Location dropLocation, ReservationType reservationType){ 25 | rID= UUID.randomUUID().toString(); 26 | this.user = user; 27 | this.vehicle = vehicle; 28 | this.pickupTime= pickupTime; 29 | this.pickupLocation = pickupLocation; 30 | this.dropTime= dropTime; 31 | this.dropLocation= dropLocation; 32 | this.status = ReservationStatus.SCHEDULED; 33 | 34 | } 35 | 36 | void setReservationStatus(ReservationStatus status) 37 | { 38 | this.status = status; 39 | } 40 | 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/admin/Admin.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.admin; 2 | 3 | import com.sj.parkinglot.parking.*; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.time.LocalDateTime; 8 | import java.util.List; 9 | import java.util.Optional; 10 | import java.util.UUID; 11 | 12 | @Getter 13 | @Setter 14 | public class Admin { 15 | private final String id; 16 | private LoginInfo login; 17 | private ContactInfo contact; 18 | 19 | public Admin() 20 | { 21 | id= UUID.randomUUID().toString(); 22 | 23 | } 24 | 25 | 26 | public void setParkingStrategy(ParkingStrategy pStrategy){ 27 | ParkingLot.INSTANCE.setPStrategy(pStrategy); 28 | } 29 | public void addFloor(Floor f) 30 | { 31 | 32 | ParkingLot.INSTANCE.getFloorList().add(f); 33 | 34 | } 35 | public void addParkingSpace(Floor f, ParkingSpace p) 36 | { 37 | 38 | f.addParkingSpace(p); 39 | 40 | 41 | } 42 | public void addEntryGate(EntryGate entry) 43 | { 44 | ParkingLot.INSTANCE.getEntries().add(entry); 45 | } 46 | public void addExitGate(ExitGate exit) 47 | { 48 | ParkingLot.INSTANCE.getExits().add(exit); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/OddEvenStrategy.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.Direction; 4 | import model.ElevatorController; 5 | 6 | import java.util.concurrent.ThreadLocalRandom; 7 | 8 | 9 | public class OddEvenStrategy extends ElevatorSelectionStrategy { 10 | 11 | 12 | @Override 13 | public int selectElevator(int floor, Direction dir) { 14 | for(ElevatorController eController: elevatorControllerList) 15 | { 16 | //old elevator for odd floors and even elevators for even floors 17 | //select elevator which is moving in same direction which is requested or IDLE elevator 18 | // if(floor%2 == eController.getId()%2) 19 | // { 20 | // int currFloor= eController.getElevatorCar().getCurrentFloor(); 21 | // Direction currDir= eController.getElevatorCar().getDir(); 22 | // if(floor>currFloor && currDir==Direction.UP) 23 | // return eController.getId(); 24 | // else if(floor floorList; 19 | private List entries; 20 | private List exits; 21 | private Address address; 22 | private ParkingStrategy pStrategy; 23 | 24 | 25 | public static ParkingLot INSTANCE = new ParkingLot(); 26 | 27 | private ParkingLot(){ 28 | pLotId= UUID.randomUUID().toString(); 29 | floorList = new ArrayList<>(); 30 | entries= new ArrayList<>(); 31 | exits= new ArrayList<>(); 32 | } 33 | 34 | public boolean isParkingSpaceAvailable(VehicleType vType) 35 | { 36 | for (Floor floor : floorList) { 37 | return floor.canParkVehicle(vType); 38 | } 39 | return false; 40 | } 41 | public ParkingSpace findParkingSpace(Vehicle v) 42 | { 43 | for (Floor floor : floorList) { 44 | return floor.getSpace(v); 45 | } 46 | return null; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/ElevatorSystem.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import algorithm.ElevatorControlStrategy; 4 | import algorithm.ElevatorSelectionStrategy; 5 | import lombok.Getter; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | @Getter 11 | public class ElevatorSystem { 12 | private List elevatorControllerList= new ArrayList(); 13 | public static ElevatorControlStrategy elevatorControlStrategy; 14 | public static ElevatorSelectionStrategy elevatorSelectionStrategy; 15 | public List floors= new ArrayList(); 16 | 17 | public static ElevatorSystem INSTANCE= new ElevatorSystem(); 18 | 19 | private ElevatorSystem() 20 | { 21 | 22 | } 23 | 24 | public void addElevator(ElevatorController e) 25 | { 26 | elevatorControllerList.add(e); 27 | } 28 | public void removeElevator(ElevatorController e) 29 | { 30 | elevatorControllerList.remove(e); 31 | } 32 | public void setElevatorControlStrategy(ElevatorControlStrategy elevatorControlStrategy) 33 | { 34 | this.elevatorControlStrategy= elevatorControlStrategy; 35 | } 36 | public void setElevatorSelectionStrategy(ElevatorSelectionStrategy elevatorSelectionStrategy) 37 | { 38 | this.elevatorSelectionStrategy= elevatorSelectionStrategy; 39 | } 40 | public void addFloor(Floor floor) 41 | { 42 | floors.add(floor); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/model/ElevatorCar.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | public class ElevatorCar { 8 | private int id; 9 | private Door door; 10 | private Display display; 11 | private Button button; 12 | @Setter 13 | private int currentFloor; //updated while elevator moves to each floor 14 | private Direction dir; //updated every time elevator hanges direction 15 | 16 | 17 | public ElevatorCar(int id) 18 | { 19 | this.id= id; 20 | door= new Door(); 21 | display= new Display(); 22 | currentFloor= 0; 23 | dir= Direction.NONE; 24 | button= new InternalButton(); 25 | 26 | } 27 | 28 | public void move(Direction dir, int floor) 29 | { 30 | System.out.println("Elevator " + id + "moving " + dir); 31 | System.out.println("Elevator " + id + "stops at floor " + floor); 32 | door.open(id); 33 | door.close(id); 34 | 35 | //called everytime when currFloor value changes 36 | setDisplay(); 37 | 38 | } 39 | 40 | public void pressButton(int floor) 41 | { 42 | Direction dir= Direction.NONE; 43 | if(floor>currentFloor) 44 | dir= Direction.UP; 45 | else if(floor reservations= new ArrayList<>(); 18 | 19 | public Store(int storeID, Location location, List vehicles) 20 | { 21 | this.StoreID= storeID; 22 | this.location= location; 23 | vehicleInventory = new VehicleInventory(vehicles); 24 | } 25 | 26 | 27 | public List getAllVehicles(VehicleType vehicleType) 28 | { 29 | 30 | return vehicleInventory.getAvailableVehicles(vehicleType); 31 | } 32 | 33 | public Reservation reserveVehicle(User user, Vehicle vehicle, LocalDateTime pickupTime, 34 | LocalDateTime dropTime, Location dropLocation) 35 | { 36 | Reservation myReservation = new Reservation(user, vehicle, pickupTime, location, dropTime, dropLocation, ReservationType.DAILY); 37 | reservations.add(myReservation); 38 | 39 | return myReservation; 40 | } 41 | 42 | public void completeReservation(Reservation reservation) 43 | { 44 | //take out the completed reservation from the list of reservations 45 | reservations.remove(reservation); 46 | reservation.getVehicle().setStatus(VehicleStatus.AVAILABLE); 47 | System.out.println("Vehicle is dropped at store"); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/algorithm/LookAlgorithm.java: -------------------------------------------------------------------------------- 1 | package algorithm; 2 | 3 | import model.ElevatorController; 4 | 5 | public class LookAlgorithm extends ElevatorControlStrategy { 6 | public void moveElevator(ElevatorController elevatorController) 7 | { 8 | // In this algorithm, the elevator moves in a specific direction, 9 | // but instead of going all the way to the end of the building before reversing direction 10 | // like the SCAN algorithm, it reverses direction as soon as it reaches the last 11 | // request in the current direction. 12 | 13 | // Implemented using a min heap, a max heap and a queue 14 | // Min heap: all requests that can be served in UP direction 15 | // (eg. Requested floor> currFloor, requested UP, elevator moving UP) 16 | // Max heap: all requests that can be served in DOWN direction (floor < currFloor) 17 | // (eg. Requested floor< currFloor, requested DOWN, elevator moving DOWN) 18 | // Queue: all requests that cannot be served in current direction 19 | // eg. elevator moving up and currFloor is 3, now someone at floor 1 requests up 20 | 21 | // While moving up, all requests from min heap will be taken one by one 22 | // when min heap is empty, elevator reverses direction and all UP requests from queue 23 | // will be put in min heap. 24 | 25 | // While moving down, all requests from max heap will be taken one by one 26 | // when max heap is empty, elevator reverses direction and all DOWN requests from queue 27 | // will be put in max heap. 28 | 29 | // Advantage: 30 | // 1. not frequent change of floor for every request 31 | // 2. no starvation of requests 32 | // 3. efficient in terms of usage because it moves only the areas of the requested floors. 33 | 34 | 35 | // Disadvantage: it does not prioritize requests based on their urgency or importance. 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /6_NotifyMe/NotifyMe/src/main/java/org/example/Application.java: -------------------------------------------------------------------------------- 1 | package org.example; 2 | 3 | import org.example.Observable.MobileStock; 4 | import org.example.Observable.StocksObservable; 5 | import org.example.Observable.WatchStock; 6 | import org.example.Observer.EmailObserver; 7 | import org.example.Observer.MessageObserver; 8 | import org.example.Observer.UserObserver; 9 | 10 | public class Application { 11 | public static void main(String[] args) { 12 | 13 | //Consider there are three items which are out of stock 14 | StocksObservable mobile1= new MobileStock("mobile1"); 15 | StocksObservable mobile2= new MobileStock("mobile2"); 16 | StocksObservable watch1= new WatchStock("watch1"); 17 | 18 | //Suppose user1 subscribe to get notified for mobile1 over email 19 | UserObserver user1= new EmailObserver("user1@gmail.com", mobile1); 20 | mobile1.add(user1); 21 | 22 | //Suppose user2 subscribe to get notified for mobile2 over message 23 | UserObserver user2= new MessageObserver("9876543210", mobile2); 24 | mobile2.add(user2); 25 | 26 | //Suppose user3 subscribes to get notified both for mobile2 and watch1 over email 27 | UserObserver user3= new EmailObserver("user3@gmail.com", mobile2); 28 | UserObserver user3_= new EmailObserver("user3@gmail.com", watch1); 29 | mobile2.add(user3); 30 | watch1.add(user3_); 31 | 32 | //Suppose user4 subscribe to get notified for watch1 both over email and message 33 | UserObserver user4= new EmailObserver("user4@gmail.com", watch1); 34 | UserObserver user4_= new MessageObserver("7654678320", watch1); 35 | watch1.add(user4); 36 | watch1.add(user4_); 37 | 38 | 39 | //Now watch1 is added to stocks 40 | watch1.setCount(10); 41 | watch1.setCount(15); //item is already available in stock so notification is not sent 42 | 43 | //Now mobile1 is added to stocks 44 | mobile1.setCount(5); 45 | } 46 | } -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/parking/Floor.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot.parking; 2 | 3 | import com.sj.parkinglot.vehicle.Vehicle; 4 | import com.sj.parkinglot.vehicle.VehicleType; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | import java.util.ArrayList; 9 | import java.util.HashMap; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | @Getter 14 | @Setter 15 | public class Floor 16 | { 17 | private final String floorId; 18 | private Map> pSpaces = new HashMap<>(); 19 | 20 | public Floor(String floorId) 21 | { 22 | this.floorId= floorId; 23 | pSpaces.put(ParkingSpaceType.BikeParking, new ArrayList<>()); 24 | pSpaces.put(ParkingSpaceType.CarParking, new ArrayList<>()); 25 | pSpaces.put(ParkingSpaceType.TruckParking, new ArrayList<>()); 26 | 27 | } 28 | 29 | public void addParkingSpace(ParkingSpace p){ 30 | pSpaces.get(p.getPType()).add(p); 31 | } 32 | public void removeParkingSpace(ParkingSpace p){ 33 | pSpaces.get(p.getPType()).remove(p); 34 | } 35 | public boolean canParkVehicle(VehicleType vType){ 36 | for(ParkingSpace p: pSpaces.get(getSpaceTypeForVehicle(vType))) 37 | { 38 | if(p.isEmpty) 39 | return true; 40 | } 41 | return false; 42 | } 43 | private ParkingSpaceType getSpaceTypeForVehicle(VehicleType vType) { 44 | switch (vType) { 45 | case CAR: 46 | return ParkingSpaceType.CarParking; 47 | case BIKE: 48 | return ParkingSpaceType.BikeParking; 49 | case TRUCK: 50 | return ParkingSpaceType.TruckParking; 51 | 52 | } 53 | return null; 54 | } 55 | public ParkingSpace getSpace(Vehicle v) 56 | { 57 | List availableSpaces= new ArrayList<>(); 58 | for(ParkingSpace p: pSpaces.get(getSpaceTypeForVehicle(v.getVType()))) 59 | if(p.isEmpty) 60 | availableSpaces.add(p); 61 | return ParkingLot.INSTANCE.getPStrategy().park(availableSpaces); 62 | 63 | 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Game.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.*; 7 | 8 | @Getter 9 | @Setter 10 | public class Game { 11 | private Queue players= new ArrayDeque(); 12 | private Board board; 13 | private Dice dice; 14 | 15 | public void addPlayers(int id, String name) 16 | { 17 | Player player= new Player(id, name); 18 | players.add(player); 19 | System.out.println("Player added: "+ name); 20 | } 21 | public void setBoard(int size, int snake, int ladder) 22 | { 23 | board= new Board(size, snake, ladder); 24 | System.out.println("Board set of size: "+ size); 25 | System.out.println("Snakes added:" + snake); 26 | System.out.println("Ladders added: "+ ladder); 27 | } 28 | public void setDice(int count) 29 | { 30 | dice= new Dice(count); 31 | System.out.println("No. of dice used: "+ count); 32 | } 33 | public void startGame() 34 | { 35 | List winners= new ArrayList<>(); 36 | while(players.size()>2) 37 | { 38 | Player player= players.poll(); 39 | System.out.println("Turn: " + player.getName()); 40 | System.out.println(player.getName() + " is at : " + player.getCurrentPosition()); 41 | int move= dice.rollDice(); 42 | System.out.println("Dice shows : " + move); 43 | int currentPosition= player.getCurrentPosition() + move; 44 | if(currentPosition>=board.getBoardSize()) 45 | { 46 | winners.add(player.getName()); 47 | System.out.println(player.getName() + " won"); 48 | continue; 49 | } 50 | if(currentPosition< board.getBoardSize()) 51 | { 52 | int finalPosition = board.getFinalPosition(currentPosition); 53 | player.setCurrentPosition(finalPosition); 54 | System.out.println(player.getName() + " moved to : " + finalPosition); 55 | } 56 | players.add(player); 57 | 58 | } 59 | System.out.println("Game Over"); 60 | displayResult(winners); 61 | } 62 | private void displayResult(List winners) 63 | { 64 | System.out.println("Results:"); 65 | int count=0; 66 | for(String playerName: winners) 67 | { 68 | count++; 69 | System.out.println("Rank " + count + ": " + playerName); 70 | 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /4_VehicleRentalSystem/VehicleRentalSystem/src/main/java/VehicleRentalSystemApplication.java: -------------------------------------------------------------------------------- 1 | import booking.Reservation; 2 | import model.*; 3 | import booking.Bill; 4 | import booking.Payment; 5 | import booking.PaymentMode; 6 | 7 | import java.time.LocalDateTime; 8 | import java.time.Month; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class VehicleRentalSystemApplication { 13 | public static void main(String[] args) { 14 | 15 | //create users 16 | User user1 = new User(1, "ABCD 20212365435"); 17 | User user2 = new User(2, "EDFE 54324567896"); 18 | 19 | 20 | //create vehicles 21 | List vehicleList1= new ArrayList<>(); 22 | List vehicleList2= new ArrayList<>(); 23 | Vehicle vehicle1= new Car(1); 24 | Vehicle vehicle2= new Car(2); 25 | Vehicle vehicle3= new Bike(3); 26 | Vehicle vehicle4= new Bike(4); 27 | vehicleList1.add(vehicle1); 28 | vehicleList1.add(vehicle2); 29 | vehicleList2.add(vehicle3); 30 | vehicleList2. add(vehicle4); 31 | 32 | //create locations 33 | Location location1 = new Location("Sector 135", "Noida", "UP", 34 | "India", 201304); 35 | 36 | //create stores 37 | Store store1= new Store(1, location1, vehicleList1); 38 | Store store2= new Store(2, location1, vehicleList2); 39 | 40 | //add users and stores in vehicleRentalsystem 41 | VehicleRentalSystem vehicleRentalSystem = new VehicleRentalSystem(); 42 | vehicleRentalSystem.addUsers(user1); 43 | vehicleRentalSystem.addUsers(user2); 44 | 45 | vehicleRentalSystem.addStores(store1); 46 | vehicleRentalSystem.addStores(store2); 47 | 48 | //user1 wants to rent Car in Noida location 49 | List allStores= vehicleRentalSystem.findStores(location1); 50 | //user selects store 1 in the displayed list 51 | Store store= allStores.get(0); 52 | List allVehicles = store.getAllVehicles(VehicleType.CAR); 53 | //user wants to reserve first car in the displayed list 54 | Vehicle reservedVehicle = allVehicles.get(0); 55 | Reservation reservation= allStores.get(0).reserveVehicle(user1, reservedVehicle, 56 | LocalDateTime.of(2023, Month.JUNE, 29, 05, 30, 00), 57 | LocalDateTime.of(2023, Month.JUNE, 30, 22, 30, 00), 58 | location1); 59 | 60 | //Bill is generated 61 | Bill bill = new Bill(reservation); 62 | 63 | //User does payment 64 | Payment payment = new Payment(); 65 | payment.makePayment(bill, PaymentMode.UPI); 66 | 67 | //Booking is confirmed 68 | //user comes to pickup vehicle 69 | reservedVehicle.setStatus(VehicleStatus.RENTED); 70 | 71 | //user drops the vehicle 72 | store.completeReservation(reservation); 73 | 74 | 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /3_ElevatorSystem/ElevatorSystem/src/main/java/ElevatorSystemApplication.java: -------------------------------------------------------------------------------- 1 | import algorithm.LookAlgorithm; 2 | import algorithm.OddEvenStrategy; 3 | import model.Direction; 4 | import model.ElevatorController; 5 | import model.ElevatorSystem; 6 | import model.Floor; 7 | 8 | public class ElevatorSystemApplication { 9 | public static void main(String args[]) 10 | { 11 | //ElevatorSystem is singleton class 12 | ElevatorSystem elevatorSystem= ElevatorSystem.INSTANCE; 13 | elevatorSystem.setElevatorSelectionStrategy(new OddEvenStrategy()); 14 | elevatorSystem.setElevatorControlStrategy(new LookAlgorithm()); 15 | 16 | //add Floors 17 | int totalFloors= 50; 18 | for(int i=0; i<=totalFloors; i++) 19 | { 20 | elevatorSystem.addFloor(new Floor(i)); 21 | } 22 | System.out.println("No. of floors added " + totalFloors); 23 | 24 | //add elevators 25 | int totalElevators = 4; 26 | for(int i=1; i<=totalElevators; i++) 27 | { 28 | elevatorSystem.addElevator(new ElevatorController(i)); 29 | } 30 | System.out.println("No. of elevators added " + totalElevators); 31 | 32 | //Working 33 | 34 | //Request 1 35 | System.out.println("Person at floor 1 presses UP Button"); 36 | for(Floor floor: ElevatorSystem.INSTANCE.floors) 37 | { 38 | if(floor.getId()==1) 39 | floor.pressButton(Direction.UP); 40 | } 41 | 42 | //Request 2 43 | System.out.println("Person at floor 5 presses UP Button"); 44 | for(Floor floor: ElevatorSystem.INSTANCE.floors) 45 | { 46 | if(floor.getId()==5) 47 | floor.pressButton(Direction.UP); 48 | } 49 | 50 | //Request 3 51 | System.out.println("Person presses 10 in elevator 2"); 52 | for(ElevatorController elevatorController: ElevatorSystem.INSTANCE.getElevatorControllerList()) 53 | { 54 | if(elevatorController.getId()==2) 55 | elevatorController.getElevatorCar().pressButton(10); 56 | 57 | } 58 | 59 | //Request 4 60 | System.out.println("Person presses 6 in elevator 2"); 61 | for(ElevatorController elevatorController: ElevatorSystem.INSTANCE.getElevatorControllerList()) 62 | { 63 | if(elevatorController.getId()==2) 64 | elevatorController.getElevatorCar().pressButton(6); 65 | } 66 | 67 | //Request 5 68 | System.out.println("Person at floor 7 presses DOWN Button"); 69 | for(Floor floor: ElevatorSystem.INSTANCE.floors) 70 | { 71 | if(floor.getId()==7) 72 | floor.pressButton(Direction.DOWN); 73 | } 74 | 75 | //Request 6 76 | System.out.println("Person presses 1 in elevator 3"); 77 | for(ElevatorController elevatorController: ElevatorSystem.INSTANCE.getElevatorControllerList()) 78 | { 79 | if(elevatorController.getId()==3) 80 | elevatorController.getElevatorCar().pressButton(1); 81 | } 82 | 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /2_SnakeAndLadder/SnakeAndLadder/src/main/java/model/Board.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import model.Snake; 6 | import model.Cell; 7 | 8 | import java.util.concurrent.ThreadLocalRandom; 9 | import java.util.random.RandomGenerator; 10 | 11 | @Getter 12 | public class Board { 13 | private int boardSize; 14 | private int noOfSnake; 15 | private int noOfLadder; 16 | @Setter 17 | private Cell[][] cell= new Cell[1000][1000]; 18 | 19 | public Board(int size, int snake, int ladder){ 20 | boardSize= size; 21 | noOfSnake= snake; 22 | noOfLadder= ladder; 23 | 24 | initializeBoard(); 25 | } 26 | 27 | private void initializeBoard() 28 | { 29 | for(int i=1; i<=boardSize; i++) 30 | { 31 | cell[generateRowNo(i)][generateColNo(i)]= new Cell(); 32 | } 33 | generateSnakes(); 34 | generateLadders(); 35 | } 36 | private void generateSnakes() 37 | { 38 | int snakeCount=0; 39 | while(snakeCount< noOfSnake) 40 | { 41 | int start= ThreadLocalRandom.current().nextInt(2, boardSize); 42 | int end= ThreadLocalRandom.current().nextInt(2, boardSize); 43 | if(start<=end) 44 | continue; 45 | if(cell[generateRowNo(start)][generateColNo(start)].getSnake()==null) 46 | { 47 | cell[generateRowNo(start)][generateColNo(start)].setSnake(new Snake(start, end)); 48 | snakeCount++; 49 | } 50 | 51 | } 52 | } 53 | private void generateLadders() 54 | { 55 | int ladderCount=0; 56 | while(ladderCount< getNoOfLadder()) 57 | { 58 | int start= ThreadLocalRandom.current().nextInt(2, getBoardSize()); 59 | int end= ThreadLocalRandom.current().nextInt(2, getBoardSize()); 60 | if(start>=end) 61 | continue; 62 | if(cell[generateRowNo(start)][generateColNo(start)].getLadder()==null && 63 | cell[generateRowNo(start)][generateColNo(start)].getSnake()==null) 64 | { 65 | cell[generateRowNo(start)][generateColNo(start)].setLadder(new Ladder(start, end)); 66 | ladderCount++; 67 | } 68 | 69 | } 70 | } 71 | private int generateRowNo(int num) 72 | { 73 | int row= (int) (num-1/Math.sqrt(getBoardSize())); 74 | return row; 75 | } 76 | private int generateColNo(int num) 77 | { 78 | int col= (int) (num-1%Math.sqrt(getBoardSize())); 79 | return col; 80 | } 81 | public int getFinalPosition(int position) 82 | { 83 | int row= generateRowNo(position); 84 | int col= generateColNo(position); 85 | int finalPosition= position; 86 | if(cell[row][col].getSnake()!=null) 87 | { 88 | System.out.println("Snake bit at: " + position); 89 | finalPosition= cell[row][col].getSnake().getEnd(); 90 | 91 | 92 | } 93 | else if (cell[row][col].getLadder()!=null) 94 | { 95 | System.out.println("Climbed ladder at: " + position); 96 | finalPosition= cell[row][col].getLadder().getEnd(); 97 | 98 | } 99 | 100 | 101 | return finalPosition; 102 | } 103 | 104 | 105 | } 106 | -------------------------------------------------------------------------------- /1_ParkingLot/ParkingLot/src/main/java/com/sj/parkinglot/ParkingLotApplication.java: -------------------------------------------------------------------------------- 1 | package com.sj.parkinglot; 2 | 3 | import com.sj.parkinglot.admin.Address; 4 | import com.sj.parkinglot.admin.Admin; 5 | import com.sj.parkinglot.admin.ContactInfo; 6 | import com.sj.parkinglot.parking.*; 7 | import com.sj.parkinglot.vehicle.*; 8 | 9 | public class ParkingLotApplication { 10 | public static void main(String[] args){ 11 | System.out.println("Welcome To Parking Lot"); 12 | ParkingLot parkingLot = ParkingLot.INSTANCE; 13 | 14 | Address address = new Address(); 15 | address.setAddressLine1("Mega Mart Parking Complex"); 16 | address.setCity("Noida"); 17 | address.setState("UttarPradesh"); 18 | address.setCountry("India"); 19 | address.setPinCode("201305"); 20 | 21 | parkingLot.setAddress(address); 22 | 23 | //Admin tests 24 | Admin admin= new Admin(); 25 | //Admin Case 1 - should be able to add parking floor 26 | Floor f1= new Floor("1"); 27 | admin.addFloor(f1); 28 | //Admin Case 2 - should be able to add parking floor 29 | Floor f2= new Floor("2"); 30 | admin.addFloor(f2); 31 | //Admin Case 3 - should be able to add entrance gate 32 | EntryGate entry1= new EntryGate("1"); 33 | admin.addEntryGate(entry1); 34 | //Admin Case 4 - should be able to add entrance gate 35 | EntryGate entry2= new EntryGate("1"); 36 | admin.addEntryGate(entry2); 37 | //Admin Case 5 - should be able to add exit gate 38 | ExitGate exit1= new ExitGate("1"); 39 | admin.addExitGate(exit1); 40 | //Admin Case 6 - should be able to add parking strategy 41 | admin.setParkingStrategy(new NaturalOrderParking()); 42 | //Admin Case 7 - should be able to add car parking space 43 | ParkingSpace carSpot1 = new CarParkingSpace("1"); 44 | admin.addParkingSpace(f1, carSpot1); 45 | //Admin Case 8 - should be able to add bike parking space 46 | ParkingSpace bikeSpot1 = new BikeParkingSpace("2"); 47 | admin.addParkingSpace(f1, bikeSpot1); 48 | //Admin Case 9 - should be able to add car parking space 49 | ParkingSpace carSpot2 = new CarParkingSpace("3"); 50 | admin.addParkingSpace(f1, carSpot2); 51 | 52 | //Parking Test Cases 53 | //Test Case 1 - check for availability of parking space for Car - TRUE 54 | System.out.println(ParkingLot.INSTANCE.isParkingSpaceAvailable(VehicleType.CAR)); 55 | //Test Case 2 - check for availability of parking space for Bike - TRUE 56 | System.out.println(ParkingLot.INSTANCE.isParkingSpaceAvailable(VehicleType.BIKE)); 57 | //Test Case 3 - check for availability of parking space for Truck - FALSE 58 | System.out.println(ParkingLot.INSTANCE.isParkingSpaceAvailable(VehicleType.TRUCK)); 59 | //Test Case 4 - Entry Gate 60 | System.out.println(ParkingLot.INSTANCE.getEntries().size()); 61 | 62 | // Test Case 5 - get parking space for bike "KA05MR2311" entering from entry gate entry1 63 | Vehicle vehicle1 = new BikeVehicle("KA05MR2311"); 64 | Ticket ticket1= entry1.generateTicket(vehicle1); 65 | System.out.println(null==ticket1); 66 | 67 | //Test Case 6 - Now we should not be able to park bike (only 1 parking space created for bike) 68 | System.out.println(ParkingLot.INSTANCE.isParkingSpaceAvailable(VehicleType.BIKE)); 69 | 70 | //Test Case 7 - make payment for ticket1 (vehicle exists from exit1) 71 | Payment p1= exit1.makePayment(PaymentType.UPI, new HourPaymentStrategy(), ticket1); 72 | System.out.println(p1.getAmount()); 73 | 74 | //Test Case 8 - Now we should be able to park bike "GHFD3452" entering from entry gate entry2 75 | Vehicle vehicle2 = new BikeVehicle("GHFD3452"); 76 | Ticket ticket2= entry2.generateTicket(vehicle2); 77 | System.out.println(null==ticket2); 78 | 79 | //Test Case 9 - check for total parking space created for car 80 | System.out.println(ParkingLot.INSTANCE.getFloorList() 81 | .get(0).getPSpaces().get(ParkingSpaceType.CarParking).size()); 82 | 83 | } 84 | } 85 | --------------------------------------------------------------------------------