From 1c0863db339807758b26129fba25ff7e0679ff6e Mon Sep 17 00:00:00 2001 From: VAMSI Date: Tue, 29 Oct 2024 23:59:30 +0530 Subject: [PATCH 01/15] snake and ladder --- Board.java | 35 ++++++++ Dice.java | 15 ++++ Game.java | 40 +++++++++ Main.java | 48 ++++++++++ Player.java | 21 +++++ .../machine-coding-feedback/.gitignore | 10 +++ .../machine-coding-feedback/README.md | 8 ++ .../machine-coding-feedback/docs/clone-1.png | Bin 0 -> 42366 bytes .../machine-coding-feedback/docs/clone.png | Bin 0 -> 25828 bytes .../machine-coding-feedback/docs/fork.png | Bin 0 -> 57503 bytes .../machine-coding-feedback/docs/git.md | 83 ++++++++++++++++++ .../machine-coding-feedback/docs/index.md | 45 ++++++++++ .../machine-coding-feedback/docs/pr-1.png | Bin 0 -> 116202 bytes .../machine-coding-feedback/docs/pr.png | Bin 0 -> 85261 bytes 14 files changed, 305 insertions(+) create mode 100644 Board.java create mode 100644 Dice.java create mode 100644 Game.java create mode 100644 Main.java create mode 100644 Player.java create mode 100644 out/production/machine-coding-feedback/.gitignore create mode 100644 out/production/machine-coding-feedback/README.md create mode 100644 out/production/machine-coding-feedback/docs/clone-1.png create mode 100644 out/production/machine-coding-feedback/docs/clone.png create mode 100644 out/production/machine-coding-feedback/docs/fork.png create mode 100644 out/production/machine-coding-feedback/docs/git.md create mode 100644 out/production/machine-coding-feedback/docs/index.md create mode 100644 out/production/machine-coding-feedback/docs/pr-1.png create mode 100644 out/production/machine-coding-feedback/docs/pr.png diff --git a/Board.java b/Board.java new file mode 100644 index 00000000..39a25fe2 --- /dev/null +++ b/Board.java @@ -0,0 +1,35 @@ +import java.util.HashMap; +import java.util.Map; + +public class Board { + private final int size; + private final Map snakes; + private final Map ladders; + + public Board(int size) { + this.size = size; + this.snakes = new HashMap<>(); + this.ladders = new HashMap<>(); + } + + public void addSnake(int head, int tail) { + snakes.put(head, tail); + } + + public void addLadder(int start, int end) { + ladders.put(start, end); + } + + public int getSize() { + return size; + } + + public int getNextPosition(int position) { + if (snakes.containsKey(position)) { + return snakes.get(position); + } else if (ladders.containsKey(position)) { + return ladders.get(position); + } + return position; + } +} diff --git a/Dice.java b/Dice.java new file mode 100644 index 00000000..1c13c1d1 --- /dev/null +++ b/Dice.java @@ -0,0 +1,15 @@ +import java.util.Random; + +public class Dice { + private static final int MIN = 1; + private static final int MAX = 6; + private final Random random; + + public Dice() { + this.random = new Random(); + } + + public int roll() { + return random.nextInt(MAX - MIN + 1) + MIN; + } +} diff --git a/Game.java b/Game.java new file mode 100644 index 00000000..93232e34 --- /dev/null +++ b/Game.java @@ -0,0 +1,40 @@ +import java.util.LinkedList; +import java.util.Queue; + +public class Game { + private final Board board; + private final Dice dice; + private final Queue players; + + public Game(Board board, Dice dice, Queue players) { + this.board = board; + this.dice = dice; + this.players = players; + } + + public void play() { + boolean gameWon = false; + while (!gameWon) { + Player currentPlayer = players.poll(); + int initialPosition = currentPlayer.getPosition(); + int diceValue = dice.roll(); + int newPosition = initialPosition + diceValue; + + // Check for board limits + if (newPosition <= board.getSize()) { + newPosition = board.getNextPosition(newPosition); + currentPlayer.setPosition(newPosition); + } + + System.out.printf("%s rolled a %d and moved from %d to %d%n", + currentPlayer.getName(), diceValue, initialPosition, currentPlayer.getPosition()); + + if (currentPlayer.getPosition() == board.getSize()) { + System.out.printf("%s wins the game%n", currentPlayer.getName()); + gameWon = true; + } else { + players.add(currentPlayer); + } + } + } +} diff --git a/Main.java b/Main.java new file mode 100644 index 00000000..b39f1ae0 --- /dev/null +++ b/Main.java @@ -0,0 +1,48 @@ +import java.util.LinkedList; +import java.util.Queue; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + // Board setup + Board board = new Board(100); + System.out.print("Enter the number of snakes: "); + int numSnakes = scanner.nextInt(); + System.out.println("Enter the snake heads and tails:"); + for (int i = 0; i < numSnakes; i++) { + int head = scanner.nextInt(); + int tail = scanner.nextInt(); + board.addSnake(head, tail); + } + + System.out.print("Enter the number of ladders: "); + int numLadders = scanner.nextInt(); + System.out.println("Enter the ladder starts and ends:"); + for (int i = 0; i < numLadders; i++) { + int start = scanner.nextInt(); + int end = scanner.nextInt(); + board.addLadder(start, end); + } + + // Player setup + Queue players = new LinkedList<>(); + System.out.print("Enter the number of players: "); + int numPlayers = scanner.nextInt(); + scanner.nextLine(); // Consume newline + System.out.println("Enter player names:"); + for (int i = 0; i < numPlayers; i++) { + String name = scanner.nextLine(); + players.add(new Player(name)); + } + + // Initialize game components + Dice dice = new Dice(); + Game game = new Game(board, dice, players); + + // Start game + System.out.println("\nGame started!"); + game.play(); + } +} diff --git a/Player.java b/Player.java new file mode 100644 index 00000000..eba13fc5 --- /dev/null +++ b/Player.java @@ -0,0 +1,21 @@ +public class Player { + private final String name; + private int position; + + public Player(String name) { + this.name = name; + this.position = 0; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } +} diff --git a/out/production/machine-coding-feedback/.gitignore b/out/production/machine-coding-feedback/.gitignore new file mode 100644 index 00000000..36b741e6 --- /dev/null +++ b/out/production/machine-coding-feedback/.gitignore @@ -0,0 +1,10 @@ +**/*.class +**/*.out +**/*.pyo +**/__pycache__ +tests/out + +.idea +.DS_Store +.* +!.gitignore diff --git a/out/production/machine-coding-feedback/README.md b/out/production/machine-coding-feedback/README.md new file mode 100644 index 00000000..86e402a6 --- /dev/null +++ b/out/production/machine-coding-feedback/README.md @@ -0,0 +1,8 @@ +# Machine Coding Review Repo +Get your [practice machine coding](https://workat.tech/machine-coding/practice) solutions reviewed by [Gaurav Chandak](https://www.linkedin.com/in/gcnit/) and get feedback before your machine coding round. + +Steps: +- [Fork this repo and clone it in your laptop/desktop](https://workattech.github.io/machine-coding-feedback/#setup) +- Start solving [one of the practice problems](https://workat.tech/machine-coding/practice) in a timed manner. Follow the [best practices](https://workat.tech/machine-coding/article/how-to-ace-machine-coding-round-hi8lnpp8tlmo). +- [Push the code](https://workattech.github.io/machine-coding-feedback/#submission) +- Wait for review. Message us on Whatsapp (9732130450) if you need to get it done urgently. diff --git a/out/production/machine-coding-feedback/docs/clone-1.png b/out/production/machine-coding-feedback/docs/clone-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e0df3b2fbb0e3210d0bcb7a69342ab696457cdd0 GIT binary patch literal 42366 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°9`F?|x}Cq(cPhK7BN*xc?4T_;ZiLOK4O1 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 O`I3`Xk}8)l3i>ZcljL#$ literal 0 HcmV?d00001 diff --git a/out/production/machine-coding-feedback/docs/clone.png b/out/production/machine-coding-feedback/docs/clone.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bde13262e0bc74ffc3cc529e17441e5dec52f9 GIT binary patch literal 25828 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 BC;I>Z literal 0 HcmV?d00001 diff --git a/out/production/machine-coding-feedback/docs/git.md b/out/production/machine-coding-feedback/docs/git.md new file mode 100644 index 00000000..bba78f4a --- /dev/null +++ b/out/production/machine-coding-feedback/docs/git.md @@ -0,0 +1,83 @@ +# Create Github Account +1. Create account at: https://github.com/join by choosing an unique username +2. Check your email for verification email and click on verification link + +# Install Git Locally + +## Windows +- Download git from https://gitforwindows.org/ +- When you've successfully started the installer, you should see the Git Setup wizard screen. Follow the Next and Finish prompts to complete the installation. The default options are pretty sensible for most users. +- Open a Command Prompt (or Git Bash if during installation you elected not to use Git from the Windows Command Prompt). +- Run the following commands to configure your Git username and email using the following commands, replacing Emma's name and email with your own. These details will be associated with any commits that you create: +``` +git config --global user.name "Emma Paris" +git config --global user.email "eparis@atlassian.com" +``` + +## Linux +- From your shell, install Git using apt-get: +``` +sudo apt-get update +sudo apt-get install git +``` +- Verify the installation was successful by typing git --version which should return the version number: +``` +git --version +``` +- Run the following commands to configure your Git username and email using the following commands, replacing Emma's name and email with your own. These details will be associated with any commits that you create: +``` +git config --global user.name "Emma Paris" +git config --global user.email "eparis@atlassian.com" +``` + +## Mac +- From your shell, install Git using Homebrew: +``` +brew install git +``` +- Verify the installation was successful by typing git --version which should return the version number: +``` +git --version +``` +- Run the following commands to configure your Git username and email using the following commands, replacing Emma's name and email with your own. These details will be associated with any commits that you create: +``` +git config --global user.name "Emma Paris" +git config --global user.email "eparis@atlassian.com" +``` + +These commands have been taken from Atlassian's website. + +# Fork +- In the repository page, click on "Fork" +![Fork](./fork.png) +- After clicking on Fork, you'll be redirected to a new page with a copy of the repository. +- This new repository is where you'll make your code changes. +- Then click on clone in this new page + +# Clone +- In the repository page, click on "Clone or download" + +![Clone](./clone.png) + +- Then click on copy link button + +![Clone-1](./clone-1.png) + +- Go to the terminal and clone the repository on your machine by typing: +```git clone``` followed by the link you copied in previous step and hit enter. + +# Push local changes to remote +Execute these commands on the terminal: +- ```cd machine-coding-feedback``` +- ```git add .``` +- ```git commit -m "solved the problem"``` +- ```git push``` + +# PR +- Open the repository in your profile. The URL would be of this format: ```https://github.com//machine-coding-feedback``` +- Click on "New Pull Request". +![pr](./pr.png) +- Then click on "Create pull request" in the page that opened. +![pr-1](./pr-1.png) +- Again click on the new button that says "Create pull request" +- After this step, a new page would load which would be your pull request. diff --git a/out/production/machine-coding-feedback/docs/index.md b/out/production/machine-coding-feedback/docs/index.md new file mode 100644 index 00000000..4f62c017 --- /dev/null +++ b/out/production/machine-coding-feedback/docs/index.md @@ -0,0 +1,45 @@ +# Please go through this document to get your machine coding code reviewed by workat.tech + +## Why Practice for Machine Coding Round? +- In companies like Flipkart, Uber, Swiggy, Ola, Cred, etc the first onsite round is the machine coding round. +- You're given a design problem (like design a parking lot) with a set of requirements. +- Then you need to create a clean, modular and extensible coding solution for the same. +- The code is supposed to be written in a matter of 90 mins. +- After the round, you sit with an interviewer who goes through your code and tries to understand your design decisions and also tries to see if your code works for all the requirements. +- The interviewer may ask you to extend your solution based on some new requirement. +- It is a pretty crucial round since most of the people get eliminated in this round and it is completely different from what everyone generally practices for. + +## How to prepare? +Please go through our article on 'How to prepare for machine coding round?'. + +## Setup +- Ensure that you've a github account. If you do not have one, check this page. +- Ensure that you've git set up locally on your Laptop/PC. If it is not set up, check this page. +- Go to machine-coding-feedback repository. +- Fork the repository. If you're new to git, follow the steps mentioned in the fork section here +- Clone the repository in your local machine.If you're new to git, follow the steps mentioned in the clone section here + +## Coding +- After the setup step, a new folder will be created in your laptop/PC with the name: machine-coding-feedback. +- Open that folder in an IDE of your choice and start coding. + +## Expectations +- Make sure that you have a working and demonstrable code +- Make sure that the code is functionally correct +- Code should be modular and readable +- Separation of concern should be addressed +- Please do not write everything in a single file +- Code should easily accommodate new requirements and minimal changes +- There should be a main method from where the code could be easily testable +- [Optional] Write unit tests, if possible +- No need to create a GUI + +## Submission +- After you're done with coding, you need to commit and push your changes to github. +- You should push your changes to the master branch of your forked repository. If you're new to git, follow the steps mentioned in the push local changes to remote section here +- Create a pull request to our master branch. If you're new to git, follow the steps mentioned in the PR section here + +## Evaluation +- We'll be reviewing everyone's submission and try to provide feedback on how to improve through code review comments on GitHub. +- We also have some volunteers who will help with the review. +- Anyone can volunteer to review. diff --git a/out/production/machine-coding-feedback/docs/pr-1.png b/out/production/machine-coding-feedback/docs/pr-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ade58aaca329b71e574a36fcc003c34e8aebd7c GIT binary patch literal 116202 zcmZ^~1z6P0*D#Etf+8gfk}IJgwbH#SQqmdH>IMz2CQU?OwApb7sz*bLRZ!#4kuiNrvzd)gv4n975Uml4>|O__H`TcT({m z+_t>`bfbcU^H|wb^Y)P@EQ?wt63Vs;-*sXCIYpzeUN{qd9)R z8Svjfv-V?(R54b-XK*Fgxj)6pkY2i77#LD|Ke8sX)J1h4lM&e8-=JNdar)~1wF2Yx$swgY$=C*T$Uu zeViM2=L7B^FFMs;4r{L6{(M+tjZ;*+i?^ze6KN@$%1(`QK%Q^$?6itL;zBWSf$46= zJseu@PH`_%WgLg6os4H^d2C$OxZytyk4>?@JWfAidIspacRzl3M?^M|;0PS%(CB$ltEWnnOduB4MU(DUWb3I~!s3A7Ts%8W#)npAMUX^q&I?gXb# zBRFKn0(XGyRK`4kj7;toTvXoX@q*t7xb)~hN7a2z%0AI&j}2h{B4}kcMz-p2A0OH= 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

_9$zQskHVBiqV@JdN1l_q-njc#fi} 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

R`l8p01A;lAuj!(N*v%|P1Bq_ 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 zⅇ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 Date: Sun, 24 Nov 2024 00:40:01 +0530 Subject: [PATCH 02/15] snake and ladder --- atm/ATM.java | 80 +++++ atm/ATMRoom.java | 56 ++++ atm/ATMState.java | 32 ++ atm/Card.java | 31 ++ atm/CashWithdrawProcessor.java | 19 ++ atm/CashWithdrawalState.java | 43 +++ atm/CheckBalanceState.java | 26 ++ atm/FiveHundredWithdrawProcessor.java | 27 ++ atm/HasCardState.java | 32 ++ atm/IdleState.java | 11 + atm/OneHundredWithdrawProcessor.java | 26 ++ atm/SelectOperationState.java | 44 +++ atm/TransactionType.java | 14 + atm/TwoThousandWithdrawProcessor.java | 27 ++ atm/User.java | 17 + atm/UserBankAccount.java | 11 + bookmyshow/BookMyShow.java | 198 ++++++++++++ bookmyshow/Booking.java | 100 ++++++ bookmyshow/BookingStatus.java | 5 + bookmyshow/City.java | 6 + bookmyshow/Location.java | 47 +++ bookmyshow/Movie.java | 78 +++++ bookmyshow/MovieController.java | 51 +++ bookmyshow/Payment.java | 55 ++++ bookmyshow/PaymentStatus.java | 5 + bookmyshow/PaymentType.java | 5 + bookmyshow/Screen.java | 58 ++++ bookmyshow/Seat.java | 44 +++ bookmyshow/SeatStatus.java | 5 + bookmyshow/SeatType.java | 5 + bookmyshow/Show.java | 67 ++++ bookmyshow/Theater.java | 66 ++++ bookmyshow/TheaterController.java | 55 ++++ bookmyshow/UserDetails.java | 52 +++ bookmyshow/UserProfile.java | 26 ++ cricbuzz/BallType.java | 7 + cricbuzz/Balls.java | 137 ++++++++ cricbuzz/BattingScoreCard.java | 12 + cricbuzz/BattingScoreUpdater.java | 27 ++ cricbuzz/BowlingScoreCard.java | 10 + cricbuzz/BowlingScoreUpdater.java | 34 ++ cricbuzz/Innings.java | 56 ++++ cricbuzz/Main.java | 70 ++++ cricbuzz/Match.java | 90 ++++++ cricbuzz/MatchType.java | 7 + cricbuzz/OneDayMatchType.java | 14 + cricbuzz/Overs.java | 82 +++++ cricbuzz/Person.java | 6 + cricbuzz/Player.java | 27 ++ cricbuzz/PlayerBattingController.java | 47 +++ cricbuzz/PlayerBowlingController.java | 39 +++ cricbuzz/PlayerType.java | 9 + cricbuzz/RunType.java | 11 + cricbuzz/ScoreUpdaterObserver.java | 6 + cricbuzz/T20MatchType.java | 14 + cricbuzz/Team.java | 82 +++++ cricbuzz/Wicket.java | 17 + cricbuzz/WicketType.java | 8 + flighbookingsystem/Airline.java | 30 ++ flighbookingsystem/Airport.java | 15 + flighbookingsystem/BookingDetail.java | 12 + flighbookingsystem/BookingSystem.java | 94 ++++++ flighbookingsystem/Flight.java | 61 ++++ flighbookingsystem/FlightSeat.java | 12 + flighbookingsystem/Main.java | 79 +++++ flighbookingsystem/Readme | 30 ++ flighbookingsystem/Schedule.java | 92 ++++++ flighbookingsystem/Seat.java | 15 + flighbookingsystem/Status.java | 9 + flighbookingsystem/User.java | 11 + librarymanagement/Book.java | 37 +++ librarymanagement/BookCopy.java | 48 +++ librarymanagement/Library.java | 115 +++++++ librarymanagement/Main.java | 88 +++++ librarymanagement/Rack.java | 30 ++ librarymanagement/User.java | 28 ++ meetingroom/Calender.java | 15 + meetingroom/Interval.java | 42 +++ meetingroom/Location.java | 28 ++ meetingroom/MeetingRoom.java | 96 ++++++ meetingroom/MeetingRoomManager.java | 70 ++++ meetingroom/MeetingScheduler.java | 25 ++ parkingLot/Account.java | 13 + parkingLot/AccountStatus.java | 9 + parkingLot/Address.java | 12 + parkingLot/Admin.java | 28 ++ parkingLot/Car.java | 7 + parkingLot/Cash.java | 8 + parkingLot/Compact.java | 8 + parkingLot/CreditCard.java | 8 + parkingLot/DisplayBoard.java | 26 ++ parkingLot/Entrance.java | 13 + parkingLot/Exit.java | 12 + parkingLot/Handicapped.java | 8 + parkingLot/Large.java | 8 + parkingLot/MotorVehicle.java | 7 + parkingLot/Motorcycle.java | 8 + parkingLot/ParkingAttendant.java | 13 + parkingLot/ParkingLot.java | 53 +++ parkingLot/ParkingRate.java | 13 + parkingLot/ParkingSpot.java | 22 ++ parkingLot/ParkingTicket.java | 19 ++ parkingLot/Payment.java | 14 + parkingLot/PaymentStatus.java | 9 + parkingLot/Person.java | 11 + parkingLot/Truck.java | 7 + parkingLot/Van.java | 7 + parkingLot/Vehicle.java | 10 + parkingLot/parkingLot.plantuml | 374 ++++++++++++++++++++++ Board.java => snakeandladder/Board.java | 2 + Dice.java => snakeandladder/Dice.java | 2 + Game.java => snakeandladder/Game.java | 6 +- Main.java => snakeandladder/Main.java | 4 + Player.java => snakeandladder/Player.java | 2 + splitwise/Balance.java | 23 ++ splitwise/BalanceSheetController.java | 81 +++++ splitwise/EqualExpenseSplit.java | 18 ++ splitwise/Expense.java | 29 ++ splitwise/ExpenseController.java | 25 ++ splitwise/ExpenseSplit.java | 9 + splitwise/ExpenseSplitType.java | 8 + splitwise/Group.java | 47 +++ splitwise/GroupController.java | 41 +++ splitwise/Main.java | 10 + splitwise/PercentageExpenseSplit.java | 12 + splitwise/SplitDetails.java | 31 ++ splitwise/SplitFactory.java | 18 ++ splitwise/SplitWise.java | 75 +++++ splitwise/UnequalExpenseSplit.java | 16 + splitwise/User.java | 21 ++ splitwise/UserController.java | 32 ++ splitwise/UserExpenseBalanceSheet.java | 59 ++++ 132 files changed, 4615 insertions(+), 1 deletion(-) create mode 100644 atm/ATM.java create mode 100644 atm/ATMRoom.java create mode 100644 atm/ATMState.java create mode 100644 atm/Card.java create mode 100644 atm/CashWithdrawProcessor.java create mode 100644 atm/CashWithdrawalState.java create mode 100644 atm/CheckBalanceState.java create mode 100644 atm/FiveHundredWithdrawProcessor.java create mode 100644 atm/HasCardState.java create mode 100644 atm/IdleState.java create mode 100644 atm/OneHundredWithdrawProcessor.java create mode 100644 atm/SelectOperationState.java create mode 100644 atm/TransactionType.java create mode 100644 atm/TwoThousandWithdrawProcessor.java create mode 100644 atm/User.java create mode 100644 atm/UserBankAccount.java create mode 100644 bookmyshow/BookMyShow.java create mode 100644 bookmyshow/Booking.java create mode 100644 bookmyshow/BookingStatus.java create mode 100644 bookmyshow/City.java create mode 100644 bookmyshow/Location.java create mode 100644 bookmyshow/Movie.java create mode 100644 bookmyshow/MovieController.java create mode 100644 bookmyshow/Payment.java create mode 100644 bookmyshow/PaymentStatus.java create mode 100644 bookmyshow/PaymentType.java create mode 100644 bookmyshow/Screen.java create mode 100644 bookmyshow/Seat.java create mode 100644 bookmyshow/SeatStatus.java create mode 100644 bookmyshow/SeatType.java create mode 100644 bookmyshow/Show.java create mode 100644 bookmyshow/Theater.java create mode 100644 bookmyshow/TheaterController.java create mode 100644 bookmyshow/UserDetails.java create mode 100644 bookmyshow/UserProfile.java create mode 100644 cricbuzz/BallType.java create mode 100644 cricbuzz/Balls.java create mode 100644 cricbuzz/BattingScoreCard.java create mode 100644 cricbuzz/BattingScoreUpdater.java create mode 100644 cricbuzz/BowlingScoreCard.java create mode 100644 cricbuzz/BowlingScoreUpdater.java create mode 100644 cricbuzz/Innings.java create mode 100644 cricbuzz/Main.java create mode 100644 cricbuzz/Match.java create mode 100644 cricbuzz/MatchType.java create mode 100644 cricbuzz/OneDayMatchType.java create mode 100644 cricbuzz/Overs.java create mode 100644 cricbuzz/Person.java create mode 100644 cricbuzz/Player.java create mode 100644 cricbuzz/PlayerBattingController.java create mode 100644 cricbuzz/PlayerBowlingController.java create mode 100644 cricbuzz/PlayerType.java create mode 100644 cricbuzz/RunType.java create mode 100644 cricbuzz/ScoreUpdaterObserver.java create mode 100644 cricbuzz/T20MatchType.java create mode 100644 cricbuzz/Team.java create mode 100644 cricbuzz/Wicket.java create mode 100644 cricbuzz/WicketType.java create mode 100644 flighbookingsystem/Airline.java create mode 100644 flighbookingsystem/Airport.java create mode 100644 flighbookingsystem/BookingDetail.java create mode 100644 flighbookingsystem/BookingSystem.java create mode 100644 flighbookingsystem/Flight.java create mode 100644 flighbookingsystem/FlightSeat.java create mode 100644 flighbookingsystem/Main.java create mode 100644 flighbookingsystem/Readme create mode 100644 flighbookingsystem/Schedule.java create mode 100644 flighbookingsystem/Seat.java create mode 100644 flighbookingsystem/Status.java create mode 100644 flighbookingsystem/User.java create mode 100644 librarymanagement/Book.java create mode 100644 librarymanagement/BookCopy.java create mode 100644 librarymanagement/Library.java create mode 100644 librarymanagement/Main.java create mode 100644 librarymanagement/Rack.java create mode 100644 librarymanagement/User.java create mode 100644 meetingroom/Calender.java create mode 100644 meetingroom/Interval.java create mode 100644 meetingroom/Location.java create mode 100644 meetingroom/MeetingRoom.java create mode 100644 meetingroom/MeetingRoomManager.java create mode 100644 meetingroom/MeetingScheduler.java create mode 100644 parkingLot/Account.java create mode 100644 parkingLot/AccountStatus.java create mode 100644 parkingLot/Address.java create mode 100644 parkingLot/Admin.java create mode 100644 parkingLot/Car.java create mode 100644 parkingLot/Cash.java create mode 100644 parkingLot/Compact.java create mode 100644 parkingLot/CreditCard.java create mode 100644 parkingLot/DisplayBoard.java create mode 100644 parkingLot/Entrance.java create mode 100644 parkingLot/Exit.java create mode 100644 parkingLot/Handicapped.java create mode 100644 parkingLot/Large.java create mode 100644 parkingLot/MotorVehicle.java create mode 100644 parkingLot/Motorcycle.java create mode 100644 parkingLot/ParkingAttendant.java create mode 100644 parkingLot/ParkingLot.java create mode 100644 parkingLot/ParkingRate.java create mode 100644 parkingLot/ParkingSpot.java create mode 100644 parkingLot/ParkingTicket.java create mode 100644 parkingLot/Payment.java create mode 100644 parkingLot/PaymentStatus.java create mode 100644 parkingLot/Person.java create mode 100644 parkingLot/Truck.java create mode 100644 parkingLot/Van.java create mode 100644 parkingLot/Vehicle.java create mode 100644 parkingLot/parkingLot.plantuml rename Board.java => snakeandladder/Board.java (97%) rename Dice.java => snakeandladder/Dice.java (92%) rename Game.java => snakeandladder/Game.java (92%) rename Main.java => snakeandladder/Main.java (98%) rename Player.java => snakeandladder/Player.java (93%) create mode 100644 splitwise/Balance.java create mode 100644 splitwise/BalanceSheetController.java create mode 100644 splitwise/EqualExpenseSplit.java create mode 100644 splitwise/Expense.java create mode 100644 splitwise/ExpenseController.java create mode 100644 splitwise/ExpenseSplit.java create mode 100644 splitwise/ExpenseSplitType.java create mode 100644 splitwise/Group.java create mode 100644 splitwise/GroupController.java create mode 100644 splitwise/Main.java create mode 100644 splitwise/PercentageExpenseSplit.java create mode 100644 splitwise/SplitDetails.java create mode 100644 splitwise/SplitFactory.java create mode 100644 splitwise/SplitWise.java create mode 100644 splitwise/UnequalExpenseSplit.java create mode 100644 splitwise/User.java create mode 100644 splitwise/UserController.java create mode 100644 splitwise/UserExpenseBalanceSheet.java diff --git a/atm/ATM.java b/atm/ATM.java new file mode 100644 index 00000000..e362c115 --- /dev/null +++ b/atm/ATM.java @@ -0,0 +1,80 @@ +package atm; + + + +public class ATM { + + private static ATM atmObject = new ATM(); //Singleton: eager initialization + + ATMState currentATMState; + + private int atmBalance; + int noOfTwoThousandNotes; + int noOfFiveHundredNotes; + int noOfOneHundredNotes; + + + private ATM() { + } + + public void setCurrentATMState(ATMState currentATMState) { + this.currentATMState = currentATMState; + } + + public ATMState getCurrentATMState() { + return currentATMState; + } + + public static ATM getATMObject() { + atmObject.setCurrentATMState(new IdleState()); + return atmObject; + } + + public int getAtmBalance() { + return atmBalance; + } + + public void setAtmBalance(int atmBalance, int noOfTwoThousandNotes, int noOfFiveHundredNotes, int noOfOneHundredNotes) { + this.atmBalance = atmBalance; + this.noOfTwoThousandNotes = noOfTwoThousandNotes; + this.noOfFiveHundredNotes = noOfFiveHundredNotes; + this.noOfOneHundredNotes = noOfOneHundredNotes; + } + + public int getNoOfTwoThousandNotes() { + return noOfTwoThousandNotes; + } + + public int getNoOfFiveHundredNotes() { + return noOfFiveHundredNotes; + } + + public int getNoOfOneHundredNotes() { + return noOfOneHundredNotes; + } + + public void deductATMBalance(int amount) { + atmBalance = atmBalance - amount; + } + + public void deductTwoThousandNotes(int number) { + noOfTwoThousandNotes = noOfTwoThousandNotes - number; + } + + public void deductFiveHundredNotes(int number) { + noOfFiveHundredNotes = noOfFiveHundredNotes - number; + } + + public void deductOneHundredNotes(int number) { + noOfOneHundredNotes = noOfOneHundredNotes - number; + } + + public void printCurrentATMStatus(){ + System.out.println("Balance: " + atmBalance); + System.out.println("2kNotes: " + noOfTwoThousandNotes); + System.out.println("500Notes: " + noOfFiveHundredNotes); + System.out.println("100Notes: " + noOfOneHundredNotes); + + } +} + diff --git a/atm/ATMRoom.java b/atm/ATMRoom.java new file mode 100644 index 00000000..9702f23b --- /dev/null +++ b/atm/ATMRoom.java @@ -0,0 +1,56 @@ +package atm; + +public class ATMRoom { + ATM atm; + User user; + + public static void main(String args[]) { + + ATMRoom atmRoom = new ATMRoom(); + atmRoom.initialize(); + + atmRoom.atm.printCurrentATMStatus(); + atmRoom.atm.getCurrentATMState().insertCard(atmRoom.atm, atmRoom.user.card); + atmRoom.atm.getCurrentATMState().authenticatePin(atmRoom.atm, atmRoom.user.card, 112211); + atmRoom.atm.getCurrentATMState().selectOperation(atmRoom.atm, atmRoom.user.card, TransactionType.CASH_WITHDRAWAL); + atmRoom.atm.getCurrentATMState().cashWithdrawal(atmRoom.atm, atmRoom.user.card, 2700); + atmRoom.atm.printCurrentATMStatus(); + + + } + + private void initialize() { + + //create ATM + atm = ATM.getATMObject(); + atm.setAtmBalance(3500, 1,2,5); + + //create User + this.user = createUser(); + } + + private User createUser(){ + + User user = new User(); + user.setCard(createCard()); + return user; + } + + private Card createCard(){ + + Card card = new Card(); + card.setBankAccount(createBankAccount()); + return card; + } + + private UserBankAccount createBankAccount() { + + UserBankAccount bankAccount = new UserBankAccount(); + bankAccount.balance = 3000; + + return bankAccount; + + } + +} + diff --git a/atm/ATMState.java b/atm/ATMState.java new file mode 100644 index 00000000..11f23a4b --- /dev/null +++ b/atm/ATMState.java @@ -0,0 +1,32 @@ +package atm; + +public abstract class ATMState { + + public void insertCard(ATM atm, Card card) { + System.out.println("OOPS!! Something went wrong"); + } + + public void authenticatePin(ATM atm, Card card, int pin){ + System.out.println("OOPS!! Something went wrong"); + } + + public void selectOperation(ATM atm, Card card, TransactionType txnType){ + System.out.println("OOPS!! Something went wrong"); + } + + public void cashWithdrawal(ATM atm, Card card, int withdrawAmount){ + System.out.println("OOPS!! Something went wrong"); + } + + public void displayBalance(ATM atm, Card card){ + System.out.println("OOPS!! Something went wrong"); + } + + public void returnCard(){ + System.out.println("OOPS!! Something went wrong"); + } + + public void exit(ATM atm){ + System.out.println("OOPS!! Something went wrong"); + } +} diff --git a/atm/Card.java b/atm/Card.java new file mode 100644 index 00000000..39405a9b --- /dev/null +++ b/atm/Card.java @@ -0,0 +1,31 @@ +package atm; + +public class Card { + + private int cardNumber; + private int cvv; + private int expiryDate; + private int holderName; + static int PIN_NUMBER = 112211; + private UserBankAccount bankAccount; + + public boolean isCorrectPINEntered(int pin) { + + if (pin == PIN_NUMBER) { + return true; + } + return false; + } + + public int getBankBalance(){ + return bankAccount.balance; + } + + public void deductBankBalance(int amount){ + bankAccount.withdrawalBalance(amount); + } + + public void setBankAccount(UserBankAccount bankAccount) { + this.bankAccount = bankAccount; + } +} diff --git a/atm/CashWithdrawProcessor.java b/atm/CashWithdrawProcessor.java new file mode 100644 index 00000000..9daaf555 --- /dev/null +++ b/atm/CashWithdrawProcessor.java @@ -0,0 +1,19 @@ +package atm; + +public abstract class CashWithdrawProcessor { + + CashWithdrawProcessor nextCashWithdrawalProcessor; + + CashWithdrawProcessor(CashWithdrawProcessor cashWithdrawalProcessor) { + + this.nextCashWithdrawalProcessor = cashWithdrawalProcessor; + + } + + public void withdraw(ATM atm, int remainingAmount) { + + if (nextCashWithdrawalProcessor != null) { + nextCashWithdrawalProcessor.withdraw(atm, remainingAmount); + } + } +} diff --git a/atm/CashWithdrawalState.java b/atm/CashWithdrawalState.java new file mode 100644 index 00000000..c071a2bc --- /dev/null +++ b/atm/CashWithdrawalState.java @@ -0,0 +1,43 @@ +package atm; + + +public class CashWithdrawalState extends ATMState { + + public CashWithdrawalState() { + System.out.println("Please enter the Withdrawal Amount"); + } + + public void cashWithdrawal(ATM atmObject, Card card, int withdrawalAmountRequest) { + + if (atmObject.getAtmBalance() < withdrawalAmountRequest) { + System.out.println("Insufficient fund in the ATM Machine"); + exit(atmObject); + } else if (card.getBankBalance() < withdrawalAmountRequest) { + System.out.println("Insufficient fund in the your Bank Account"); + exit(atmObject); + } else { + + card.deductBankBalance(withdrawalAmountRequest); + atmObject.deductATMBalance(withdrawalAmountRequest); + + //using chain of responsibility for this logic, how many 2k Rs notes, how many 500 Rs notes etc, has to be withdrawal + CashWithdrawProcessor withdrawProcessor = + new TwoThousandWithdrawProcessor(new FiveHundredWithdrawProcessor(new OneHundredWithdrawProcessor(null))); + + withdrawProcessor.withdraw(atmObject, withdrawalAmountRequest); + exit(atmObject); + } + } + + @Override + public void exit(ATM atmObject) { + returnCard(); + atmObject.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard() { + System.out.println("Please collect your card"); + } +} diff --git a/atm/CheckBalanceState.java b/atm/CheckBalanceState.java new file mode 100644 index 00000000..9b04e090 --- /dev/null +++ b/atm/CheckBalanceState.java @@ -0,0 +1,26 @@ +package atm; + +public class CheckBalanceState extends ATMState { + + public CheckBalanceState() { + } + + @Override + public void displayBalance(ATM atm, Card card){ + System.out.println("Your Balance is: " + card.getBankBalance()); + exit(atm); + } + + @Override + public void exit(ATM atmObject){ + returnCard(); + atmObject.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard(){ + System.out.println("Please collect your card"); + } +} + diff --git a/atm/FiveHundredWithdrawProcessor.java b/atm/FiveHundredWithdrawProcessor.java new file mode 100644 index 00000000..bbff056a --- /dev/null +++ b/atm/FiveHundredWithdrawProcessor.java @@ -0,0 +1,27 @@ +package atm; + +public class FiveHundredWithdrawProcessor extends CashWithdrawProcessor { + + public FiveHundredWithdrawProcessor(CashWithdrawProcessor nextCashWithdrawProcessor){ + super(nextCashWithdrawProcessor); + } + + public void withdraw(ATM atm, int remainingAmount){ + + int required = remainingAmount/500; + int balance = remainingAmount%500; + + if(required <= atm.getNoOfFiveHundredNotes()) { + atm.deductFiveHundredNotes(required); + } + else if(required > atm.getNoOfFiveHundredNotes()) { + atm.deductFiveHundredNotes(atm.getNoOfFiveHundredNotes()); + balance = balance + (required-atm.getNoOfFiveHundredNotes()) * 500; + } + + if(balance != 0){ + super.withdraw(atm, balance); + } + } +} + diff --git a/atm/HasCardState.java b/atm/HasCardState.java new file mode 100644 index 00000000..b184bd76 --- /dev/null +++ b/atm/HasCardState.java @@ -0,0 +1,32 @@ +package atm; + +public class HasCardState extends ATMState { + + public HasCardState(){ + System.out.println("enter your card pin number"); + } + + @Override + public void authenticatePin(ATM atm, Card card, int pin){ + boolean isCorrectPinEntered = card.isCorrectPINEntered(pin); + + if(isCorrectPinEntered) { + atm.setCurrentATMState(new SelectOperationState()); + } else { + System.out.println("Invalid PIN Number"); + exit(atm); + } + } + + @Override + public void exit(ATM atm){ + returnCard(); + atm.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard(){ + System.out.println("Please collect your card"); + } +} diff --git a/atm/IdleState.java b/atm/IdleState.java new file mode 100644 index 00000000..0ccf40f9 --- /dev/null +++ b/atm/IdleState.java @@ -0,0 +1,11 @@ +package atm; + +public class IdleState extends ATMState { + + @Override + public void insertCard(ATM atm, Card card) { + System.out.println("Card is inserted"); + atm.setCurrentATMState(new HasCardState()); + } +} + diff --git a/atm/OneHundredWithdrawProcessor.java b/atm/OneHundredWithdrawProcessor.java new file mode 100644 index 00000000..1a373a36 --- /dev/null +++ b/atm/OneHundredWithdrawProcessor.java @@ -0,0 +1,26 @@ +package atm; + +public class OneHundredWithdrawProcessor extends CashWithdrawProcessor { + + public OneHundredWithdrawProcessor(CashWithdrawProcessor nextCashWithdrawProcessor){ + super(nextCashWithdrawProcessor); + } + + public void withdraw(ATM atm, int remainingAmount){ + + int required = remainingAmount/100; + int balance = remainingAmount%100; + + if(required <= atm.getNoOfOneHundredNotes()) { + atm.deductOneHundredNotes(required); + } + else if(required > atm.getNoOfOneHundredNotes()) { + atm.deductOneHundredNotes(atm.getNoOfOneHundredNotes()); + balance = balance + (required-atm.getNoOfOneHundredNotes()) * 100; + } + + if(balance != 0){ + System.out.println("Something went wrong"); + } + } +} diff --git a/atm/SelectOperationState.java b/atm/SelectOperationState.java new file mode 100644 index 00000000..803b4924 --- /dev/null +++ b/atm/SelectOperationState.java @@ -0,0 +1,44 @@ +package atm; + +public class SelectOperationState extends ATMState { + + public SelectOperationState(){ + showOperations(); + } + + @Override + public void selectOperation(ATM atmObject, Card card, TransactionType txnType){ + + switch (txnType) { + + case CASH_WITHDRAWAL: + atmObject.setCurrentATMState(new CashWithdrawalState()); + break; + case BALANCE_CHECK: + atmObject.setCurrentATMState(new CheckBalanceState()); + break; + default: { + System.out.println("Invalid Option"); + exit(atmObject); + } + + } + } + + @Override + public void exit(ATM atmObject){ + returnCard(); + atmObject.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard(){ + System.out.println("Please collect your card"); + } + + private void showOperations(){ + System.out.println("Please select the Operation"); + TransactionType.showAllTransactionTypes(); + } +} diff --git a/atm/TransactionType.java b/atm/TransactionType.java new file mode 100644 index 00000000..e88c0373 --- /dev/null +++ b/atm/TransactionType.java @@ -0,0 +1,14 @@ +package atm; + +public enum TransactionType { + + CASH_WITHDRAWAL, + BALANCE_CHECK; + + public static void showAllTransactionTypes(){ + + for(TransactionType type: TransactionType.values()){ + System.out.println(type.name()); + } + } +} diff --git a/atm/TwoThousandWithdrawProcessor.java b/atm/TwoThousandWithdrawProcessor.java new file mode 100644 index 00000000..6fa00dde --- /dev/null +++ b/atm/TwoThousandWithdrawProcessor.java @@ -0,0 +1,27 @@ +package atm; + +public class TwoThousandWithdrawProcessor extends CashWithdrawProcessor { + + public TwoThousandWithdrawProcessor(CashWithdrawProcessor nextCashWithdrawProcessor) { + super(nextCashWithdrawProcessor); + } + + public void withdraw(ATM atm, int remainingAmount) { + + int required = remainingAmount/2000; + int balance = remainingAmount%2000; + + if(required <= atm.getNoOfTwoThousandNotes()) { + atm.deductTwoThousandNotes(required); + } + else if(required > atm.getNoOfTwoThousandNotes()) { + atm.deductTwoThousandNotes(atm.getNoOfTwoThousandNotes()); + balance = balance + (required-atm.getNoOfTwoThousandNotes()) * 2000; + } + + if(balance != 0){ + super.withdraw(atm, balance); + } + } +} + diff --git a/atm/User.java b/atm/User.java new file mode 100644 index 00000000..dca502bb --- /dev/null +++ b/atm/User.java @@ -0,0 +1,17 @@ +package atm; + + +public class User { + + public Card card; + public UserBankAccount bankAccount; + + public Card getCard() { + return card; + } + + public void setCard(Card card) { + this.card = card; + } +} + diff --git a/atm/UserBankAccount.java b/atm/UserBankAccount.java new file mode 100644 index 00000000..2a77b7fc --- /dev/null +++ b/atm/UserBankAccount.java @@ -0,0 +1,11 @@ +package atm; + +public class UserBankAccount { + + int balance; + + public void withdrawalBalance(int amount) { + balance = balance - amount; + } +} + diff --git a/bookmyshow/BookMyShow.java b/bookmyshow/BookMyShow.java new file mode 100644 index 00000000..e7009deb --- /dev/null +++ b/bookmyshow/BookMyShow.java @@ -0,0 +1,198 @@ +package bookmyshow; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BookMyShow { + + MovieController movieController; + TheaterController TheaterController; + + BookMyShow() { + movieController = new MovieController(); + TheaterController = new TheaterController(); + } + + + public static void main(String args[]) { + + BookMyShow bookMyShow = new BookMyShow(); + + bookMyShow.initialize(); + + //user1 + bookMyShow.createBooking(City.Bangalore, "BAAHUBALI"); + //user2 + bookMyShow.createBooking(City.Bangalore, "BAAHUBALI"); + + } + + private void createBooking(City userCity, String movieName) { + + + //1. search movie by my location + List movies = movieController.getMoviesByCity(userCity); + + //2. select the movie which you want to see. i want to see Baahubali + Movie interestedMovie = null; + for (Movie movie : movies) { + + if ((movie.getMovieName()).equals(movieName)) { + interestedMovie = movie; + } + } + + //3. get all show of this movie in Bangalore location + Map> showsTheaterWise = TheaterController.getAllShow(interestedMovie, userCity); + + //4. select the particular show user is interested in + Map.Entry> entry = showsTheaterWise.entrySet().iterator().next(); + List runningShows = entry.getValue(); + Show interestedShow = runningShows.get(0); + + //5. select the seat + int seatNumber = 30; + List bookedSeats = interestedShow.getBookedSeats() == null ? new ArrayList<>() : interestedShow.getBookedSeats(); + if(!bookedSeats.contains(seatNumber)){ + bookedSeats.add(seatNumber); + //startPayment + Booking booking = new Booking(); + List myBookedSeats = new ArrayList<>(); + for(Seat screenSeat : interestedShow.getScreen().getSeats()) { + if(screenSeat.getSeatId() == seatNumber) { + myBookedSeats.add(screenSeat); + } + } + booking.setBookedSeats(myBookedSeats); + booking.setShow(interestedShow); + } else { + //throw exception + System.out.println("seat already booked, try again"); + return; + } + + System.out.println("BOOKING SUCCESSFUL"); + } + + private void initialize() { + + //create movies + createMovies(); + + //create theater with screens, seats and shows + createTheater(); + } + + //creating 2 Theater + private void createTheater() { + + Movie avengerMovie = movieController.getMovieByName("AVENGERS"); + Movie baahubali = movieController.getMovieByName("BAAHUBALI"); + + Theater inoxTheater = new Theater(); + inoxTheater.setTheaterId(1); + inoxTheater.setScreens(createScreen()); + inoxTheater.setCity(City.Bangalore); + List inoxShows = new ArrayList<>(); + Show inoxMorningShow = createShows(1, inoxTheater.getScreens().get(0), avengerMovie, 8); + Show inoxEveningShow = createShows(2, inoxTheater.getScreens().get(0), baahubali, 16); + inoxShows.add(inoxMorningShow); + inoxShows.add(inoxEveningShow); + inoxTheater.setShows(inoxShows); + + + Theater pvrTheater = new Theater(); + pvrTheater.setTheaterId(2); + pvrTheater.setScreens(createScreen()); + pvrTheater.setCity(City.Delhi); + List pvrShows = new ArrayList<>(); + Show pvrMorningShow = createShows(3, pvrTheater.getScreens().get(0), avengerMovie, 13); + Show pvrEveningShow = createShows(4, pvrTheater.getScreens().get(0), baahubali, 20); + pvrShows.add(pvrMorningShow); + pvrShows.add(pvrEveningShow); + pvrTheater.setShows(pvrShows); + + TheaterController.addTheater(inoxTheater, City.Bangalore); + TheaterController.addTheater(pvrTheater, City.Delhi); + + } + + private List createScreen() { + + List screens = new ArrayList<>(); + Screen screen1 = new Screen(); + screen1.setScreenId(1); + screen1.setSeats(createSeats()); + screens.add(screen1); + + return screens; + } + + private Show createShows(int showId, Screen screen, Movie movie, int showStartTime) { + + Show show = new Show(); + show.setShowId(showId); + show.setScreen(screen); + show.setMovie(movie); + show.setShowTime(showStartTime); //24 hrs time ex: 14 means 2pm and 8 means 8AM + return show; + } + + //creating 100 seats + private List createSeats() { + + //creating 100 seats for testing purpose, this can be generalised + List seats = new ArrayList<>(); + + //1 to 40 : SILVER + for (int i = 0; i < 40; i++) { + Seat seat = new Seat(); + seat.setSeatId(i); + seat.setSeatType(SeatType.REGULAR); + seats.add(seat); + } + + //41 to 70 : SILVER + for (int i = 40; i < 70; i++) { + Seat seat = new Seat(); + seat.setSeatId(i); + seat.setSeatType(SeatType.REGULAR); + seats.add(seat); + } + + //1 to 40 : SILVER + for (int i = 70; i < 100; i++) { + Seat seat = new Seat(); + seat.setSeatId(i); + seat.setSeatType(SeatType.REGULAR); + seats.add(seat); + } + + return seats; + } + + private void createMovies() { + + //create Movies1 + Movie avengers = new Movie(); + avengers.setMovieId(1); + avengers.setMovieName("AVENGERS"); + avengers.setDuration(128); + + //create Movies2 + Movie baahubali = new Movie(); + baahubali.setMovieId(2); + baahubali.setMovieName("BAAHUBALI"); + baahubali.setDuration(180); + + + //add movies against the cities + movieController.addMovie(avengers, City.Bangalore); + movieController.addMovie(avengers, City.Delhi); + movieController.addMovie(baahubali, City.Bangalore); + movieController.addMovie(baahubali, City.Delhi); + } +} + diff --git a/bookmyshow/Booking.java b/bookmyshow/Booking.java new file mode 100644 index 00000000..69de8932 --- /dev/null +++ b/bookmyshow/Booking.java @@ -0,0 +1,100 @@ +package bookmyshow; + + + +import java.util.Date; +import java.util.List; + + +class Booking { + private String bookingId; + private UserDetails user; + private Show show; + private List seats; + private Payment payment; + private BookingStatus status; + private Date bookingDate; + private ListbookedSeats; + + + // Constructors, getters, and setters + + + public Booking() { + } + + public Booking(List bookedSeats, Date bookingDate, String bookingId, Payment payment, List seats, Show show, BookingStatus status, UserDetails user) { + this.bookedSeats = bookedSeats; + this.bookingDate = bookingDate; + this.bookingId = bookingId; + this.payment = payment; + this.seats = seats; + this.show = show; + this.status = status; + this.user = user; + } + + public List getBookedSeats() { + return bookedSeats; + } + + public Date getBookingDate() { + return bookingDate; + } + + public String getBookingId() { + return bookingId; + } + + public Payment getPayment() { + return payment; + } + + public List getSeats() { + return seats; + } + + public Show getShow() { + return show; + } + + public BookingStatus getStatus() { + return status; + } + + public UserDetails getUser() { + return user; + } + + public void setBookedSeats(List bookedSeats) { + this.bookedSeats = bookedSeats; + } + + public void setBookingDate(Date bookingDate) { + this.bookingDate = bookingDate; + } + + public void setBookingId(String bookingId) { + this.bookingId = bookingId; + } + + public void setPayment(Payment payment) { + this.payment = payment; + } + + public void setSeats(List seats) { + this.seats = seats; + } + + public void setShow(Show show) { + this.show = show; + } + + public void setStatus(BookingStatus status) { + this.status = status; + } + + public void setUser(UserDetails user) { + this.user = user; + } +} \ No newline at end of file diff --git a/bookmyshow/BookingStatus.java b/bookmyshow/BookingStatus.java new file mode 100644 index 00000000..c1ef96ca --- /dev/null +++ b/bookmyshow/BookingStatus.java @@ -0,0 +1,5 @@ +package bookmyshow; + +enum BookingStatus { + CONFIRMED, CANCELLED, PENDING +} \ No newline at end of file diff --git a/bookmyshow/City.java b/bookmyshow/City.java new file mode 100644 index 00000000..57863f30 --- /dev/null +++ b/bookmyshow/City.java @@ -0,0 +1,6 @@ +package bookmyshow; + +public enum City { + Bangalore, + Delhi; +} diff --git a/bookmyshow/Location.java b/bookmyshow/Location.java new file mode 100644 index 00000000..49ba8ad8 --- /dev/null +++ b/bookmyshow/Location.java @@ -0,0 +1,47 @@ +package bookmyshow; + + + +import java.util.List; + + +class Location { + private String cityId; + private String cityName; + private List theaters; + + // Constructors, getters, and setters + + public Location() { + } + + public Location(String cityId, String cityName, List theaters) { + this.cityId = cityId; + this.cityName = cityName; + this.theaters = theaters; + } + + public String getCityId() { + return cityId; + } + + public String getCityName() { + return cityName; + } + + public List getTheaters() { + return theaters; + } + + public void setCityId(String cityId) { + this.cityId = cityId; + } + + public void setCityName(String cityName) { + this.cityName = cityName; + } + + public void setTheaters(List theaters) { + this.theaters = theaters; + } +} diff --git a/bookmyshow/Movie.java b/bookmyshow/Movie.java new file mode 100644 index 00000000..73b68141 --- /dev/null +++ b/bookmyshow/Movie.java @@ -0,0 +1,78 @@ +package bookmyshow; + + +import java.util.Date; + + +class Movie { + private Integer movieId; + private String movieName; + private String title; + private String genre; + private int duration; // Duration in minutes + private Date releaseDate; + + + // Constructors, getters, and setters + + + public Movie() { + } + + public Movie(int duration, String genre, Integer movieId, String movieName, Date releaseDate, String title) { + this.duration = duration; + this.genre = genre; + this.movieId = movieId; + this.movieName = movieName; + this.releaseDate = releaseDate; + this.title = title; + } + + public int getDuration() { + return duration; + } + + public String getGenre() { + return genre; + } + + public Integer getMovieId() { + return movieId; + } + + public String getMovieName() { + return movieName; + } + + public Date getReleaseDate() { + return releaseDate; + } + + public String getTitle() { + return title; + } + + public void setDuration(int duration) { + this.duration = duration; + } + + public void setGenre(String genre) { + this.genre = genre; + } + + public void setMovieId(Integer movieId) { + this.movieId = movieId; + } + + public void setMovieName(String movieName) { + this.movieName = movieName; + } + + public void setReleaseDate(Date releaseDate) { + this.releaseDate = releaseDate; + } + + public void setTitle(String title) { + this.title = title; + } +} \ No newline at end of file diff --git a/bookmyshow/MovieController.java b/bookmyshow/MovieController.java new file mode 100644 index 00000000..f4da6080 --- /dev/null +++ b/bookmyshow/MovieController.java @@ -0,0 +1,51 @@ +package bookmyshow; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MovieController { + + Map> cityVsMovies; + List allMovies; + + MovieController(){ + cityVsMovies = new HashMap<>(); + allMovies = new ArrayList<>(); + } + + + //ADD movie to a particular city, make use of cityVsMovies map + void addMovie(Movie movie, City city) { + + allMovies.add(movie); + + List movies = cityVsMovies.getOrDefault(city, new ArrayList<>()); + movies.add(movie); + cityVsMovies.put(city, movies); + } + + + Movie getMovieByName(String name) { + + for(Movie movie : allMovies) { + if((movie.getMovieName()).equals(name)) { + return movie; + } + } + return null; + } + + + List getMoviesByCity(City city) { + return cityVsMovies.get(city); + } + //REMOVE movie from a particular city, make use of cityVsMovies map + + //UPDATE movie of a particular city, make use of cityVsMovies map + + //CRUD operation based on Movie ID, make use of allMovies list + + +} diff --git a/bookmyshow/Payment.java b/bookmyshow/Payment.java new file mode 100644 index 00000000..8e793f8c --- /dev/null +++ b/bookmyshow/Payment.java @@ -0,0 +1,55 @@ +package bookmyshow; + + +import java.util.Date; + + +class Payment { + private String paymentId; + private PaymentType type; + private double amount; + private PaymentStatus status; + private Date paymentDate; + + // Constructors, getters, and setters + + public double getAmount() { + return amount; + } + + public Date getPaymentDate() { + return paymentDate; + } + + public String getPaymentId() { + return paymentId; + } + + public PaymentStatus getStatus() { + return status; + } + + public PaymentType getType() { + return type; + } + + public void setAmount(double amount) { + this.amount = amount; + } + + public void setPaymentDate(Date paymentDate) { + this.paymentDate = paymentDate; + } + + public void setPaymentId(String paymentId) { + this.paymentId = paymentId; + } + + public void setStatus(PaymentStatus status) { + this.status = status; + } + + public void setType(PaymentType type) { + this.type = type; + } +} \ No newline at end of file diff --git a/bookmyshow/PaymentStatus.java b/bookmyshow/PaymentStatus.java new file mode 100644 index 00000000..61d09f71 --- /dev/null +++ b/bookmyshow/PaymentStatus.java @@ -0,0 +1,5 @@ +package bookmyshow; + +enum PaymentStatus { + SUCCESS, FAILURE, PENDING +} \ No newline at end of file diff --git a/bookmyshow/PaymentType.java b/bookmyshow/PaymentType.java new file mode 100644 index 00000000..6cd0db6c --- /dev/null +++ b/bookmyshow/PaymentType.java @@ -0,0 +1,5 @@ +package bookmyshow; + +enum PaymentType { + CREDIT_CARD, DEBIT_CARD, NET_BANKING, UPI, WALLET +} \ No newline at end of file diff --git a/bookmyshow/Screen.java b/bookmyshow/Screen.java new file mode 100644 index 00000000..9cfac607 --- /dev/null +++ b/bookmyshow/Screen.java @@ -0,0 +1,58 @@ +package bookmyshow; + + +import java.util.List; + +class Screen { + private Integer screenId; + private String name; + private Theater theater; + private List seats; + private List shows; + + // Constructors, getters, and setters + + public Screen() { + } + + public String getName() { + return name; + } + + public Integer getScreenId() { + return screenId; + } + + public List getSeats() { + return seats; + } + + public List getShows() { + return shows; + } + + public Theater getTheater() { + return theater; + } + + public void setName(String name) { + this.name = name; + } + + public void setScreenId(Integer screenId) { + this.screenId = screenId; + } + + public void setSeats(List seats) { + this.seats = seats; + } + + public void setShows(List shows) { + this.shows = shows; + } + + public void setTheater(Theater theater) { + this.theater = theater; + } +} + diff --git a/bookmyshow/Seat.java b/bookmyshow/Seat.java new file mode 100644 index 00000000..d509ac21 --- /dev/null +++ b/bookmyshow/Seat.java @@ -0,0 +1,44 @@ +package bookmyshow; + + + +class Seat { + private Integer seatId; + private String seatNumber; + private SeatType seatType; + private SeatStatus seatStatus; + + // Constructors, getters, and setters + + public Integer getSeatId() { + return seatId; + } + + public String getSeatNumber() { + return seatNumber; + } + + public SeatStatus getSeatStatus() { + return seatStatus; + } + + public SeatType getSeatType() { + return seatType; + } + + public void setSeatId(Integer seatId) { + this.seatId = seatId; + } + + public void setSeatNumber(String seatNumber) { + this.seatNumber = seatNumber; + } + + public void setSeatStatus(SeatStatus seatStatus) { + this.seatStatus = seatStatus; + } + + public void setSeatType(SeatType seatType) { + this.seatType = seatType; + } +} \ No newline at end of file diff --git a/bookmyshow/SeatStatus.java b/bookmyshow/SeatStatus.java new file mode 100644 index 00000000..13ed5450 --- /dev/null +++ b/bookmyshow/SeatStatus.java @@ -0,0 +1,5 @@ +package bookmyshow; + +enum SeatStatus { + AVAILABLE, BOOKED, RESERVED +} \ No newline at end of file diff --git a/bookmyshow/SeatType.java b/bookmyshow/SeatType.java new file mode 100644 index 00000000..8c1c2997 --- /dev/null +++ b/bookmyshow/SeatType.java @@ -0,0 +1,5 @@ +package bookmyshow; + +enum SeatType { + REGULAR, PREMIUM, VIP +} \ No newline at end of file diff --git a/bookmyshow/Show.java b/bookmyshow/Show.java new file mode 100644 index 00000000..2d4be2d5 --- /dev/null +++ b/bookmyshow/Show.java @@ -0,0 +1,67 @@ +package bookmyshow; + + + +import java.util.List; + + +class Show { + private Integer showId; + private Movie movie; + private Screen screen; + private Integer showTime; + private List bookedSeats; + + // Constructors, getters, and setters + + public Show() { + } + + public Show(List bookedSeats, Movie movie, Screen screen, Integer showId, Integer showTime) { + this.bookedSeats = bookedSeats; + this.movie = movie; + this.screen = screen; + this.showId = showId; + this.showTime = showTime; + } + + public List getBookedSeats() { + return bookedSeats; + } + + public Movie getMovie() { + return movie; + } + + public Screen getScreen() { + return screen; + } + + public Integer getShowId() { + return showId; + } + + public Integer getShowTime() { + return showTime; + } + + public void setBookedSeats(List bookedSeats) { + this.bookedSeats = bookedSeats; + } + + public void setMovie(Movie movie) { + this.movie = movie; + } + + public void setScreen(Screen screen) { + this.screen = screen; + } + + public void setShowId(Integer showId) { + this.showId = showId; + } + + public void setShowTime(Integer showTime) { + this.showTime = showTime; + } +} \ No newline at end of file diff --git a/bookmyshow/Theater.java b/bookmyshow/Theater.java new file mode 100644 index 00000000..ad5ad818 --- /dev/null +++ b/bookmyshow/Theater.java @@ -0,0 +1,66 @@ +package bookmyshow; + + +import java.util.List; + + +class Theater { + private Integer theaterId; + private String name; + private City city; + private List screens; + private List shows; + + // Constructors, getters, and setters + + public Theater() { + } + + public Theater(City city, String name, List screens, List shows, Integer theaterId) { + this.city = city; + this.name = name; + this.screens = screens; + this.shows = shows; + this.theaterId = theaterId; + } + + public City getCity() { + return city; + } + + public String getName() { + return name; + } + + public List getScreens() { + return screens; + } + + public List getShows() { + return shows; + } + + public Integer getTheaterId() { + return theaterId; + } + + public void setCity(City city) { + this.city = city; + } + + public void setName(String name) { + this.name = name; + } + + public void setScreens(List screens) { + this.screens = screens; + } + + public void setShows(List shows) { + this.shows = shows; + } + + public void setTheaterId(Integer theaterId) { + this.theaterId = theaterId; + } +} diff --git a/bookmyshow/TheaterController.java b/bookmyshow/TheaterController.java new file mode 100644 index 00000000..7fa6a836 --- /dev/null +++ b/bookmyshow/TheaterController.java @@ -0,0 +1,55 @@ +package bookmyshow; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TheaterController { + + Map> cityVsTheater; + List allTheater; + + TheaterController() { + cityVsTheater = new HashMap<>(); + allTheater = new ArrayList<>(); + } + + void addTheater(Theater Theater, City city) { + + allTheater.add(Theater); + + List Theaters = cityVsTheater.getOrDefault(city, new ArrayList<>()); + Theaters.add(Theater); + cityVsTheater.put(city, Theaters); + } + + + Map> getAllShow(Movie movie, City city) { + + //get all the theater of this city + + Map> TheaterVsShows = new HashMap<>(); + + List Theaters = cityVsTheater.get(city); + + //filter the Theaters which run this movie + + for(Theater Theater : Theaters) { + + List givenMovieShows = new ArrayList<>(); + List shows = Theater.getShows(); + + for(Show show : shows) { + if(show.getMovie().getMovieId() == movie.getMovieId()) { + givenMovieShows.add(show); + } + } + if(!givenMovieShows.isEmpty()) { + TheaterVsShows.put(Theater, givenMovieShows); + } + } + + return TheaterVsShows; + } +} diff --git a/bookmyshow/UserDetails.java b/bookmyshow/UserDetails.java new file mode 100644 index 00000000..4aeb165e --- /dev/null +++ b/bookmyshow/UserDetails.java @@ -0,0 +1,52 @@ +package bookmyshow; + + +class UserDetails { + private String userId; + private String name; + private String email; + private String phoneNumber; + private UserProfile profile; + + // Constructors, getters, and setters + + public String getEmail() { + return email; + } + + public String getName() { + return name; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public UserProfile getProfile() { + return profile; + } + + public String getUserId() { + return userId; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setName(String name) { + this.name = name; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public void setProfile(UserProfile profile) { + this.profile = profile; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/bookmyshow/UserProfile.java b/bookmyshow/UserProfile.java new file mode 100644 index 00000000..72af1e2d --- /dev/null +++ b/bookmyshow/UserProfile.java @@ -0,0 +1,26 @@ +package bookmyshow; + + +import java.util.List; +class UserProfile { + private String address; + private List bookings; + + // Constructors, getters, and setters + + public String getAddress() { + return address; + } + + public List getBookings() { + return bookings; + } + + public void setAddress(String address) { + this.address = address; + } + + public void setBookings(List bookings) { + this.bookings = bookings; + } +} \ No newline at end of file diff --git a/cricbuzz/BallType.java b/cricbuzz/BallType.java new file mode 100644 index 00000000..17b7c0aa --- /dev/null +++ b/cricbuzz/BallType.java @@ -0,0 +1,7 @@ +package cricbuzz; + +public enum BallType { + NORMAL, + NO_BALL, + WIDE_BALL +} diff --git a/cricbuzz/Balls.java b/cricbuzz/Balls.java new file mode 100644 index 00000000..3d00461b --- /dev/null +++ b/cricbuzz/Balls.java @@ -0,0 +1,137 @@ +package cricbuzz; + + + +import java.util.ArrayList; +import java.util.List; + + +public class Balls { + + int ballNumber; + BallType type; + RunType runType; + Player playedBy; + Player bowledBy; + public Wicket wicket; + List scoreUpdaterObserverList = new ArrayList<>(); + + public Balls(int ballNumber) { + this.ballNumber = ballNumber; + scoreUpdaterObserverList.add(new BowlingScoreUpdater()); + scoreUpdaterObserverList.add(new BattingScoreUpdater()); + } + + public int getBallNumber() { + return ballNumber; + } + + public Player getBowledBy() { + return bowledBy; + } + + public Player getPlayedBy() { + return playedBy; + } + + public List getScoreUpdaterObserverList() { + return scoreUpdaterObserverList; + } + + public BallType getType() { + return type; + } + + public Wicket getWicket() { + return wicket; + } + + public void setBallNumber(int ballNumber) { + this.ballNumber = ballNumber; + } + + public void setBowledBy(Player bowledBy) { + this.bowledBy = bowledBy; + } + + public void setPlayedBy(Player playedBy) { + this.playedBy = playedBy; + } + + public void setRunType(RunType runType) { + this.runType = runType; + } + + public void setScoreUpdaterObserverList(List scoreUpdaterObserverList) { + this.scoreUpdaterObserverList = scoreUpdaterObserverList; + } + + public void setType(BallType type) { + this.type = type; + } + + public void setWicket(Wicket wicket) { + this.wicket = wicket; + } + + public void startBallDelivery(Team battingTeam, Team bowlingTeam, Overs over) { + + playedBy = battingTeam.getStriker(); + this.bowledBy = over.bowledBy; + //THROW BALL AND GET THE BALL TYPE, assuming here that ball type is always NORMAL + type = BallType.NORMAL; + + //wicket or no wicket + if (isWicketTaken()) { + runType = RunType.ZERO; + //considering only BOLD + wicket = new Wicket(WicketType.BOLD, bowlingTeam.getCurrentBowler(), over,this); + //making only striker out for now + battingTeam.setStriker(null); + } else { + runType = getRunType(); + + if(runType == RunType.ONE || runType == RunType.THREE) { + //swap striket and non striker + Player temp = battingTeam.getStriker(); + battingTeam.setStriker(battingTeam.getNonStriker()); + battingTeam.setNonStriker(temp); + } + } + + //update player scoreboard + notifyUpdaters(this); + } + + private void notifyUpdaters(Balls Balls){ + + for(ScoreUpdaterObserver observer : scoreUpdaterObserverList) { + observer.update(Balls); + } + } + + private RunType getRunType() { + + double val = Math.random(); + if (val <= 0.2) { + return RunType.ONE; + } else if (val >= 0.3 && val <= 0.5) { + return RunType.TWO; + } else if (val >= 0.6 && val <= 0.8) { + return RunType.FOUR; + } else { + return RunType.SIX; + } + } + + private boolean isWicketTaken() { + //random function return value between 0 and 1 + if (Math.random() < 0.2) { + return true; + } else { + return false; + } + } + + +} diff --git a/cricbuzz/BattingScoreCard.java b/cricbuzz/BattingScoreCard.java new file mode 100644 index 00000000..7d69c9da --- /dev/null +++ b/cricbuzz/BattingScoreCard.java @@ -0,0 +1,12 @@ +package cricbuzz; + +public class BattingScoreCard { + int totalRuns; + int totalBallsPlayed; + int totalFours; + int totalSixes; + int strikeRate; + public Wicket wicketDetails; + +} + diff --git a/cricbuzz/BattingScoreUpdater.java b/cricbuzz/BattingScoreUpdater.java new file mode 100644 index 00000000..23d8d8e9 --- /dev/null +++ b/cricbuzz/BattingScoreUpdater.java @@ -0,0 +1,27 @@ +package cricbuzz; + +public class BattingScoreUpdater implements ScoreUpdaterObserver { + @Override + public void update(Balls ballDetails) { + int run = 0; + + if (RunType.ONE == ballDetails.runType) { + run = 1; + } else if (RunType.TWO == ballDetails.runType) { + run = 2; + } else if (RunType.FOUR == ballDetails.runType) { + run = 4; + ballDetails.playedBy.battingScoreCard.totalFours++; + } else if (RunType.SIX == ballDetails.runType) { + run = 6; + ballDetails.playedBy.battingScoreCard.totalSixes++; + } + ballDetails.playedBy.battingScoreCard.totalRuns += run; + + ballDetails.playedBy.battingScoreCard.totalBallsPlayed++; + + if (ballDetails.wicket != null) { + ballDetails.playedBy.battingScoreCard.wicketDetails = ballDetails.wicket; + } + } +} diff --git a/cricbuzz/BowlingScoreCard.java b/cricbuzz/BowlingScoreCard.java new file mode 100644 index 00000000..69790509 --- /dev/null +++ b/cricbuzz/BowlingScoreCard.java @@ -0,0 +1,10 @@ +package cricbuzz; + +public class BowlingScoreCard { + int totalOversDelivered; + int runsGiven; + int wicketsTaken; + int noBallCount; + int wideBalls; + double economyRate; +} diff --git a/cricbuzz/BowlingScoreUpdater.java b/cricbuzz/BowlingScoreUpdater.java new file mode 100644 index 00000000..18b4e246 --- /dev/null +++ b/cricbuzz/BowlingScoreUpdater.java @@ -0,0 +1,34 @@ +package cricbuzz; + +public class BowlingScoreUpdater implements ScoreUpdaterObserver { + @Override + public void update(Balls Balls) { + + if (Balls.ballNumber == 6 && Balls.type == BallType.NORMAL) { + Balls.bowledBy.bowlingScoreCard.totalOversDelivered++; + } + + if (RunType.ONE == Balls.runType) { + Balls.bowledBy.bowlingScoreCard.runsGiven += 1; + } else if (RunType.TWO == Balls.runType) { + Balls.bowledBy.bowlingScoreCard.runsGiven += 2; + } else if (RunType.FOUR == Balls.runType) { + Balls.bowledBy.bowlingScoreCard.runsGiven += 4; + } else if (RunType.SIX == Balls.runType) { + Balls.bowledBy.bowlingScoreCard.runsGiven += 6; + } + + if (Balls.wicket != null) { + Balls.bowledBy.bowlingScoreCard.wicketsTaken++; + } + + if (Balls.type == BallType.NO_BALL) { + Balls.bowledBy.bowlingScoreCard.noBallCount++; + } + + if (Balls.type == BallType.WIDE_BALL) { + Balls.bowledBy.bowlingScoreCard.wideBalls++; + } + } + +} diff --git a/cricbuzz/Innings.java b/cricbuzz/Innings.java new file mode 100644 index 00000000..b702a4f7 --- /dev/null +++ b/cricbuzz/Innings.java @@ -0,0 +1,56 @@ +package cricbuzz; + +import java.util.ArrayList; +import java.util.List; + +public class Innings { + + Team battingTeam; + Team bowlingTeam; + MatchType matchType; + List Overss; + public Innings(Team battingTeam, Team bowlingTeam, MatchType matchType) { + this.battingTeam = battingTeam; + this.bowlingTeam = bowlingTeam; + this.matchType = matchType; + Overss = new ArrayList<>(); + } + + public void start(int runsToWin){ + + //set batting players + try { + battingTeam.chooseNextBatsMan(); + }catch (Exception e) { + + } + + int noOfOverss = matchType.noOfOvers(); + for (int OversNumber = 1; OversNumber <= noOfOverss; OversNumber++) { + + //chooseBowler + bowlingTeam.chooseNextBowler(matchType.maxOverCountBowlers()); + + Overs Overs = new Overs(OversNumber, bowlingTeam.getCurrentBowler()); + Overss.add(Overs); + try { + boolean won = Overs.startOver(battingTeam, bowlingTeam, runsToWin); + if(won == true) { + break; + } + }catch (Exception e) { + break; + } + + //swap striket and non striker + Player temp = battingTeam.getStriker(); + battingTeam.setStriker(battingTeam.getNonStriker()); + battingTeam.setNonStriker(temp); + } + } + + public int getTotalRuns(){ + return battingTeam.getTotalRuns(); + } + +} diff --git a/cricbuzz/Main.java b/cricbuzz/Main.java new file mode 100644 index 00000000..5087ce65 --- /dev/null +++ b/cricbuzz/Main.java @@ -0,0 +1,70 @@ +package cricbuzz; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +public class Main { + + public static void main(String args[]) { + + Main ob = new Main(); + + Team teamA = ob.addTeam("India"); + Team teamB = ob.addTeam("SriLanka"); + + MatchType matchType = new T20MatchType(); + Match match = new Match(teamA, teamB, null, "SMS STADIUM", matchType); + match.startMatch(); + + } + + + private Team addTeam(String name) { + + Queue Player = new LinkedList<>(); + + Player p1 = addPlayer(name + "1", PlayerType.ALLROUNDER); + Player p2 = addPlayer(name + "2", PlayerType.ALLROUNDER); + Player p3 = addPlayer(name + "3", PlayerType.ALLROUNDER); + Player p4 = addPlayer(name + "4", PlayerType.ALLROUNDER); + Player p5 = addPlayer(name + "5", PlayerType.ALLROUNDER); + Player p6 = addPlayer(name + "6", PlayerType.ALLROUNDER); + Player p7 = addPlayer(name + "7", PlayerType.ALLROUNDER); + Player p8 = addPlayer(name + "8", PlayerType.ALLROUNDER); + Player p9 = addPlayer(name + "9", PlayerType.ALLROUNDER); + Player p10 = addPlayer(name + "10", PlayerType.ALLROUNDER); + Player p11 = addPlayer(name + "11", PlayerType.ALLROUNDER); + + Player.add(p1); + Player.add(p2); + Player.add(p3); + Player.add(p4); + Player.add(p5); + Player.add(p6); + Player.add(p7); + Player.add(p8); + Player.add(p9); + Player.add(p10); + Player.add(p11); + + List bowlers = new ArrayList<>(); + bowlers.add(p8); + bowlers.add(p9); + bowlers.add(p10); + bowlers.add(p11); + + Team team = new Team(name, Player, new ArrayList<>(), bowlers); + return team; + + } + + private Player addPlayer(String name, PlayerType playerType) { + + Person person = new Person(); + person.name = name; + Player Player = new Player(person, playerType); + return Player; + } +} diff --git a/cricbuzz/Match.java b/cricbuzz/Match.java new file mode 100644 index 00000000..955f5d4c --- /dev/null +++ b/cricbuzz/Match.java @@ -0,0 +1,90 @@ +package cricbuzz; + +import java.util.Date; + +public class Match { + Team teamA; + Team teamB; + Date date; + String location; + Innings[] innings; + MatchType type; + Team tossWon; + + public Match(Team teamA, Team teamB, Date matchDate, String venue, MatchType matchType) { + + this.teamA = teamA; + this.teamB = teamB; + this.date = matchDate; + this.location = venue; + this.type = matchType; + innings = new Innings[2]; + } + + public void startMatch() { + + //1. Toss + tossWon = toss(teamA, teamB); + + //start The Inning, there are 2 innings in a match + for(int inning=1; inning<=2; inning++){ + + Innings inningDetails; + Team bowlingTeam; + Team battingTeam; + + //assuming here that tossWon batFirst + boolean isChasing = false; + if(inning == 1){ + battingTeam = tossWon; + bowlingTeam = tossWon.getTeamName().equals(teamA.getTeamName()) ? teamB : teamA; + inningDetails = new Innings(battingTeam, bowlingTeam, type); + inningDetails.start( -1); + + }else { + bowlingTeam = tossWon; + battingTeam = tossWon.getTeamName().equals(teamA.getTeamName()) ? teamB : teamA; + inningDetails = new Innings(battingTeam, bowlingTeam, type); + inningDetails.start(innings[0].getTotalRuns()); + if(bowlingTeam.getTotalRuns() > battingTeam.getTotalRuns()) { + bowlingTeam.isWinner = true; + } + } + + + innings[inning-1] = inningDetails; + + //print inning details + System.out.println(); + System.out.println("INNING " + inning + " -- total Run: " + battingTeam.getTotalRuns()); + System.out.println("---Batting ScoreCard : " + battingTeam.name + "---"); + + battingTeam.printBattingScoreCard(); + + System.out.println(); + System.out.println("---Bowling ScoreCard : " + bowlingTeam.name + "---"); + bowlingTeam.printBowlingScoreCard(); + + } + + System.out.println(); + if(teamA.isWinner){ + System.out.println("---WINNER---" + teamA.name); + + }else { + System.out.println("---WINNER---" + teamB.name); + + } + + } + + private Team toss(Team teamA, Team teamB){ + //random function return value between 0 and 1 + if(Math.random() < 0.5) { + return teamA; + } else { + return teamB; + } + } + +} diff --git a/cricbuzz/MatchType.java b/cricbuzz/MatchType.java new file mode 100644 index 00000000..aed6d25b --- /dev/null +++ b/cricbuzz/MatchType.java @@ -0,0 +1,7 @@ +package cricbuzz; + +public interface MatchType { + public int noOfOvers(); + public int maxOverCountBowlers(); + +} diff --git a/cricbuzz/OneDayMatchType.java b/cricbuzz/OneDayMatchType.java new file mode 100644 index 00000000..ff0dde6a --- /dev/null +++ b/cricbuzz/OneDayMatchType.java @@ -0,0 +1,14 @@ +package cricbuzz; + +public class OneDayMatchType implements MatchType { + @Override + public int noOfOvers() { + return 50; + } + + @Override + public int maxOverCountBowlers() { + return 10; + } + +} diff --git a/cricbuzz/Overs.java b/cricbuzz/Overs.java new file mode 100644 index 00000000..8edc099c --- /dev/null +++ b/cricbuzz/Overs.java @@ -0,0 +1,82 @@ +package cricbuzz; + + + +import java.util.ArrayList; +import java.util.List; + + +public class Overs { + int overNumber; + List balls; + int extraBallsCount; + Player bowledBy; + + + Overs(int overNumber, Player bowledBy){ + this.overNumber = overNumber; + balls = new ArrayList<>(); + this.bowledBy = bowledBy; + } + + public List getBalls() { + return balls; + } + + public Player getBowledBy() { + return bowledBy; + } + + public int getExtraBallsCount() { + return extraBallsCount; + } + + public int getOverNumber() { + return overNumber; + } + + public void setBalls(List balls) { + this.balls = balls; + } + + public void setBowledBy(Player bowledBy) { + this.bowledBy = bowledBy; + } + + public void setExtraBallsCount(int extraBallsCount) { + this.extraBallsCount = extraBallsCount; + } + + public void setOverNumber(int overNumber) { + this.overNumber = overNumber; + } + + public boolean startOver(Team battingTeam, Team bowlingTeam, int runsToWin) throws Exception{ + + int ballCount = 1; + while(ballCount<=6){ + + Balls ball = new Balls(ballCount); + ball.startBallDelivery(battingTeam, bowlingTeam, this); + if(ball.type == BallType.NORMAL) { + balls.add(ball); + ballCount++; + if(ball.wicket != null) { + battingTeam.chooseNextBatsMan(); + } + + if( runsToWin != -1 && battingTeam.getTotalRuns() >= runsToWin){ + battingTeam.isWinner = true; + return true; + } + } + else { + extraBallsCount++; + } + } + + return false; + } + + +} diff --git a/cricbuzz/Person.java b/cricbuzz/Person.java new file mode 100644 index 00000000..a3257b3c --- /dev/null +++ b/cricbuzz/Person.java @@ -0,0 +1,6 @@ +package cricbuzz; + +public class Person { + String name; + int age; +} diff --git a/cricbuzz/Player.java b/cricbuzz/Player.java new file mode 100644 index 00000000..769a3714 --- /dev/null +++ b/cricbuzz/Player.java @@ -0,0 +1,27 @@ +package cricbuzz; + +public class Player { + Person person; + PlayerType type; + BattingScoreCard battingScoreCard; + BowlingScoreCard bowlingScoreCard; + public Player(Person person, PlayerType playerType){ + this.person = person; + this.type = playerType; + battingScoreCard = new BattingScoreCard(); + bowlingScoreCard = new BowlingScoreCard(); + } + + public void printBattingScoreCard(){ + + System.out.println("PlayerName: " + person.name + " -- totalRuns: " + battingScoreCard.totalRuns + + " -- totalBallsPlayed: " + battingScoreCard.totalBallsPlayed + " -- 4s: " + battingScoreCard.totalFours + + " -- 6s: " + battingScoreCard.totalSixes + " -- outby: " + ((battingScoreCard.wicketDetails != null) ? battingScoreCard.wicketDetails.takenBy.person.name : "notout")); + } + + public void printBowlingScoreCard(){ + System.out.println("PlayerName: " + person.name + " -- totalOversThrown: " + bowlingScoreCard.totalOversDelivered + + " -- totalRunsGiven: " + bowlingScoreCard.runsGiven + " -- WicketsTaken: " + bowlingScoreCard.wicketsTaken); + } + +} diff --git a/cricbuzz/PlayerBattingController.java b/cricbuzz/PlayerBattingController.java new file mode 100644 index 00000000..ff602e2b --- /dev/null +++ b/cricbuzz/PlayerBattingController.java @@ -0,0 +1,47 @@ +package cricbuzz; + +import java.util.LinkedList; +import java.util.Queue; + +public class PlayerBattingController { + Queue yetToPlay; + Player striker; + Player nonStriker; + public PlayerBattingController(Queue playing11) { + this.yetToPlay = new LinkedList<>(); + this.yetToPlay.addAll(playing11); + } + + public void getNextPlayer() throws Exception { + + if (yetToPlay.isEmpty()) { + throw new Exception(); + } + + if (striker == null) { + striker = yetToPlay.poll(); + } + + if (nonStriker == null) { + nonStriker = yetToPlay.poll(); + } + } + + public Player getStriker() { + return striker; + } + + public Player getNonStriker() { + return nonStriker; + } + + public void setStriker(Player Player) { + striker = Player; + } + + public void setNonStriker(Player Player) { + nonStriker = Player; + } + + +} diff --git a/cricbuzz/PlayerBowlingController.java b/cricbuzz/PlayerBowlingController.java new file mode 100644 index 00000000..31bbeb64 --- /dev/null +++ b/cricbuzz/PlayerBowlingController.java @@ -0,0 +1,39 @@ +package cricbuzz; + +import java.util.*; + +public class PlayerBowlingController { + Deque bowler; + Map blowerOverCount; + Player currentBowler; + public PlayerBowlingController(List bowlers) { + setBowlersList(bowlers); + } + + private void setBowlersList(List bowlersList) { + this.bowler = new LinkedList<>(); + blowerOverCount = new HashMap<>(); + for (Player bowler : bowlersList) { + this.bowler.addLast(bowler); + blowerOverCount.put(bowler, 0); + } + } + + public void getNextBowler(int maxOverCountPerBowler) { + + Player Player = bowler.poll(); + if(blowerOverCount.get(Player)+1 == maxOverCountPerBowler) { + currentBowler = Player; + } + else { + currentBowler = Player; + bowler.addLast(Player); + blowerOverCount.put(Player, blowerOverCount.get(Player)+1); + } + } + + public Player getCurrentBowler(){ + return currentBowler; + } + +} diff --git a/cricbuzz/PlayerType.java b/cricbuzz/PlayerType.java new file mode 100644 index 00000000..d7f407e0 --- /dev/null +++ b/cricbuzz/PlayerType.java @@ -0,0 +1,9 @@ +package cricbuzz; + +public enum PlayerType { + BOWLER, + BATSMAN, + WICKET_KEEPER, + ALLROUNDER, + CAPTAIN +} diff --git a/cricbuzz/RunType.java b/cricbuzz/RunType.java new file mode 100644 index 00000000..dfeb65c5 --- /dev/null +++ b/cricbuzz/RunType.java @@ -0,0 +1,11 @@ +package cricbuzz; + +public enum RunType { + ZERO, + ONE, + TWO, + THREE, + FOUR, + SIX, + WIDE_RUN +} diff --git a/cricbuzz/ScoreUpdaterObserver.java b/cricbuzz/ScoreUpdaterObserver.java new file mode 100644 index 00000000..b9434086 --- /dev/null +++ b/cricbuzz/ScoreUpdaterObserver.java @@ -0,0 +1,6 @@ +package cricbuzz; + +public interface ScoreUpdaterObserver { + + public void update(Balls ballDetails); +} diff --git a/cricbuzz/T20MatchType.java b/cricbuzz/T20MatchType.java new file mode 100644 index 00000000..c243c2e9 --- /dev/null +++ b/cricbuzz/T20MatchType.java @@ -0,0 +1,14 @@ +package cricbuzz; + +public class T20MatchType implements MatchType{ + @Override + public int noOfOvers() { + return 20; + } + + @Override + public int maxOverCountBowlers() { + return 5; + } + +} diff --git a/cricbuzz/Team.java b/cricbuzz/Team.java new file mode 100644 index 00000000..3e7ed0fa --- /dev/null +++ b/cricbuzz/Team.java @@ -0,0 +1,82 @@ +package cricbuzz; + + +import java.util.List; +import java.util.Queue; + + + +public class Team { + + String name; + Queue players; + List extraPlayers; + PlayerBattingController battingController; + PlayerBowlingController bowlingController; + public boolean isWinner; + public Team(String teamName, Queue playing11, List bench, List bowlers){ + this.name = teamName; + this.players = playing11; + this.extraPlayers = bench; + battingController = new PlayerBattingController(playing11); + bowlingController = new PlayerBowlingController(bowlers); + } + + public String getTeamName() { + return name; + } + + public void chooseNextBatsMan() throws Exception{ + battingController.getNextPlayer(); + } + + public void chooseNextBowler(int maxOverCountPerBowler){ + bowlingController.getNextBowler(maxOverCountPerBowler); + } + + public Player getStriker() { + return battingController.getStriker(); + } + + public Player getNonStriker() { + return battingController.getNonStriker(); + } + + public void setStriker(Player player) { + battingController.setStriker(player); + } + + public void setNonStriker(Player player) { + battingController.setNonStriker(player); + } + + public Player getCurrentBowler() { + return bowlingController.getCurrentBowler(); + } + + public void printBattingScoreCard(){ + + for(Player Player : players){ + Player.printBattingScoreCard(); + } + } + + public void printBowlingScoreCard(){ + + for(Player Player : players){ + if(Player.bowlingScoreCard.totalOversDelivered > 0) { + Player.printBowlingScoreCard(); + } + } + } + + public int getTotalRuns(){ + int totalRun=0; + for (Player player : players){ + + totalRun+=player.battingScoreCard.totalRuns; + } + return totalRun; + } + +} diff --git a/cricbuzz/Wicket.java b/cricbuzz/Wicket.java new file mode 100644 index 00000000..b9f92a18 --- /dev/null +++ b/cricbuzz/Wicket.java @@ -0,0 +1,17 @@ +package cricbuzz; + +public class Wicket { + + public WicketType wicketType; + public Player takenBy; + public Overs overDetail; + public Balls ballDetail; + + public Wicket(WicketType wicketType, Player takenBy, Overs overDetail, Balls ballDetail) { + this.wicketType = wicketType; + this.takenBy = takenBy; + this.overDetail = overDetail; + this.ballDetail = ballDetail; + } +} + diff --git a/cricbuzz/WicketType.java b/cricbuzz/WicketType.java new file mode 100644 index 00000000..dae96d81 --- /dev/null +++ b/cricbuzz/WicketType.java @@ -0,0 +1,8 @@ +package cricbuzz; + +public enum WicketType { + + RUNOUT, + BOLD, + CATCH; +} diff --git a/flighbookingsystem/Airline.java b/flighbookingsystem/Airline.java new file mode 100644 index 00000000..a6b16624 --- /dev/null +++ b/flighbookingsystem/Airline.java @@ -0,0 +1,30 @@ +package flighbookingsystem; + +import java.util.ArrayList; +import java.util.List; + +public class Airline { + String name; + List flightList; + + public Airline(String name, List flightList) { + this.name = name; + this.flightList = new ArrayList<>(); + } + + public String getName() { + return name; + } + + public List getFlightList() { + return flightList; + } + + public void setName(String name) { + this.name = name; + } + + public void setFlightList(List flightList) { + this.flightList = flightList; + } +} diff --git a/flighbookingsystem/Airport.java b/flighbookingsystem/Airport.java new file mode 100644 index 00000000..0acc94bc --- /dev/null +++ b/flighbookingsystem/Airport.java @@ -0,0 +1,15 @@ +package flighbookingsystem; + +import java.util.List; + +public class Airport { + String name; + String loc; + List flightList; + + public Airport(String name, String loc, List flightList) { + this.name = name; + this.loc = loc; + this.flightList = flightList; + } +} diff --git a/flighbookingsystem/BookingDetail.java b/flighbookingsystem/BookingDetail.java new file mode 100644 index 00000000..34b709a7 --- /dev/null +++ b/flighbookingsystem/BookingDetail.java @@ -0,0 +1,12 @@ +package flighbookingsystem; + +import java.util.Date; + +public class BookingDetail { + String bookingId; + Flight flight; + String start; + String destination; + Date date; + String pnr; +} diff --git a/flighbookingsystem/BookingSystem.java b/flighbookingsystem/BookingSystem.java new file mode 100644 index 00000000..bc62415a --- /dev/null +++ b/flighbookingsystem/BookingSystem.java @@ -0,0 +1,94 @@ +package flighbookingsystem; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.List; + +public class BookingSystem { + private List userList; + private List flightList; + private List bookingList; + + public BookingSystem(List userList, List flightList) { + this.userList = userList; + this.flightList = flightList; + } + + public void setUserList(List userList) { + this.userList = userList; + } + + // Add a flight to the system + public void addFlight(Flight flight) { + flightList.add(flight); + } + + // Add a user to the system + public void addUser(User user) { + userList.add(user); + } + + // Get available flights based on criteria + public List getFlightDetails(String start, String end, String date) { + + SimpleDateFormat inputFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + return flightList.stream() + .filter(flight -> flight.getSchedules().stream() + .anyMatch(schedule -> { + try { + // Define the input and output date formats + + + // Convert date from schedule to desired format + String formattedDate = outputFormat.format(inputFormat.parse(schedule.getDateOfJourney().toString())); + + // Compare converted date with the provided date + return schedule.getStart().loc.equals(start) && + schedule.getDestination().loc.equals(end) + && + formattedDate.equals(date); + } catch (ParseException e) { + e.printStackTrace(); + return false; // Skip schedules with invalid dates + } + })) + .toList(); + } + + // Book a flight +// public BookingDetail bookFlight(Flight flight, User user) { +// if (flight.getAvailableSeats() <= 0) { +// System.out.println("No available seats on this flight."); +// return null; +// } +// +// // Generate a booking ID +// String bookingId = "BOOK" + (bookingList.size() + 1); +// +// // Reduce available seats +// flight.setAvailableSeats(flight.getAvailableSeats() - 1); +// +// // Create and store booking +// BookingDetail bookingDetail = new BookingDetail(bookingId, flight, user, new Timestamp(System.currentTimeMillis())); +// bookingList.add(bookingDetail); +// +// System.out.println("Booking confirmed: " + bookingDetail); +// return bookingDetail; +// } +// +// // Confirm booking +// public void confirmBooking(BookingDetail details) { +// if (details == null) { +// System.out.println("Invalid booking details."); +// } else { +// System.out.println("Booking confirmed for user: " + details.getUser().getName() + +// " on flight: " + details.getFlight().getFlightNumber()); +// } +// } + + // View all bookings + public List getAllBookings() { + return bookingList; + } +} diff --git a/flighbookingsystem/Flight.java b/flighbookingsystem/Flight.java new file mode 100644 index 00000000..46f0b1e3 --- /dev/null +++ b/flighbookingsystem/Flight.java @@ -0,0 +1,61 @@ +package flighbookingsystem; + +import java.util.ArrayList; +import java.util.List; + + +public class Flight { + private String id; + private Airline airline; + private int seatCapacity; + List seats; + List schedules; + + public Flight(String id, Airline airline, int seatCapacity, List seats, List schedules) { + this.id = id; + this.airline = airline; + this.seatCapacity = seatCapacity; + this.seats = new ArrayList<>(); + this.schedules = new ArrayList<>(); + } + + public void setId(String id) { + this.id = id; + } + + public void setAirline(Airline airline) { + this.airline = airline; + } + + public void setSeatCapacity(int seatCapacity) { + this.seatCapacity = seatCapacity; + } + + public void setSeats(List seats) { + this.seats = seats; + } + + public void setSchedules(List schedules) { + this.schedules = schedules; + } + + public String getId() { + return id; + } + + public Airline getAirline() { + return airline; + } + + public int getSeatCapacity() { + return seatCapacity; + } + + public List getSeats() { + return seats; + } + + public List getSchedules() { + return schedules; + } +} diff --git a/flighbookingsystem/FlightSeat.java b/flighbookingsystem/FlightSeat.java new file mode 100644 index 00000000..d8b5e473 --- /dev/null +++ b/flighbookingsystem/FlightSeat.java @@ -0,0 +1,12 @@ +package flighbookingsystem; + +public class FlightSeat extends Seat{ + int price; + Status status; + + public FlightSeat(int price, Status status) { + super(); + this.price = price; + this.status = status; + } +} diff --git a/flighbookingsystem/Main.java b/flighbookingsystem/Main.java new file mode 100644 index 00000000..6777a530 --- /dev/null +++ b/flighbookingsystem/Main.java @@ -0,0 +1,79 @@ +package flighbookingsystem; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Main { + public static void main(String[] args) { + List seats = new ArrayList<>(); + seats.add(new Seat(1, "Economy")); + seats.add(new Seat(2, "Business")); + + // Create FlightSeats + List flightSeats = new ArrayList<>(); + flightSeats.add(new FlightSeat(5000, Status.OPEN)); + flightSeats.add(new FlightSeat(10000, Status.OPEN)); + + // Create Airlines + Airline airline = new Airline("Indigo", new ArrayList<>()); + + // Create Flights + Flight flight1 = new Flight("FL123", airline, 150, seats, new ArrayList<>()); + Flight flight2 = new Flight("FL456", airline, 200, seats, new ArrayList<>()); + + airline.getFlightList().add(flight1); + airline.getFlightList().add(flight2); + + // Create Airports + Airport airport1 = new Airport("Delhi Airport", "Delhi", new ArrayList<>()); + Airport airport2 = new Airport("Mumbai Airport", "Mumbai", new ArrayList<>()); + + // Create Schedules + List schedules = new ArrayList<>(); + Schedule schedule1 = new Schedule( + flight1, + airport1, + airport2, + new Date(), + Timestamp.valueOf("2024-11-10 10:00:00"), + Timestamp.valueOf("2024-11-10 12:00:00"), + Status.ONTIME, + flightSeats + ); + + Schedule schedule2 = new Schedule( + flight2, + airport2, + airport1, + new Date(), + Timestamp.valueOf("2024-11-11 15:00:00"), + Timestamp.valueOf("2024-11-11 17:00:00"), + Status.DELAY, + flightSeats + ); + + flight1.getSchedules().add(schedule1); + flight2.getSchedules().add(schedule2); + + // Booking System + BookingSystem bookingSystem = new BookingSystem(new ArrayList<>(),List.of(flight1, flight2)); + + // Example User + User user = new User("John Doe", "john.doe@example.com"); + bookingSystem.setUserList(List.of(user)); + + // Search Flights + System.out.println("Available Flights:"); + List availableFlights = bookingSystem.getFlightDetails("Delhi", "Mumbai", String.valueOf(Timestamp.valueOf("2024-11-11 13:56:52"))); + for (Flight flight : availableFlights) { + System.out.println("Flight ID: " + flight.getId()); + } + + // Book a Flight + System.out.println("Booking Flight..."); + // bookingSystem.bookingFlight(flight1, user); + } + +} diff --git a/flighbookingsystem/Readme b/flighbookingsystem/Readme new file mode 100644 index 00000000..376286a3 --- /dev/null +++ b/flighbookingsystem/Readme @@ -0,0 +1,30 @@ +MakeMyTrip.com/Yatra/Booking.com + +Functional Requirements: +1.User should be able to search flights based on arrival + destination+ date of travel +2.User should be able to login to application. +3.Select the flight based on time/preference. +4.Enter the personal details. +5.Make payment in your application. +6.Notification to the email. + +Non-Functional Requirements +1.Scalable +2.Reliable +3.Modular + +Finding the actors +1.User +2.Airline authority +3.Admin + +Entities: +1.User +2.Flights +3.Booking +4.Payment +5.Notification +6.Airline + + + diff --git a/flighbookingsystem/Schedule.java b/flighbookingsystem/Schedule.java new file mode 100644 index 00000000..4c59b63c --- /dev/null +++ b/flighbookingsystem/Schedule.java @@ -0,0 +1,92 @@ +package flighbookingsystem; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Schedule { + Flight flight; + Airport start; + Airport destination; + Date dateOfJourney; + Timestamp startTime; + Timestamp endTime; + Status status; + List fare; + + public Schedule(Flight flight, Airport start, Airport destination, Date dateOfJourney, Timestamp startTime, Timestamp endTime, Status status, List fare) { + this.flight = flight; + this.start = start; + this.destination = destination; + this.dateOfJourney = dateOfJourney; + this.startTime = startTime; + this.endTime = endTime; + this.status = status; + this.fare = new ArrayList<>(); + } + + public void setFlight(Flight flight) { + this.flight = flight; + } + + public void setStart(Airport start) { + this.start = start; + } + + public void setDestination(Airport destination) { + this.destination = destination; + } + + public void setDateOfJourney(Date dateOfJourney) { + this.dateOfJourney = dateOfJourney; + } + + public void setStartTime(Timestamp startTime) { + this.startTime = startTime; + } + + public void setEndTime(Timestamp endTime) { + this.endTime = endTime; + } + + public void setStatus(Status status) { + this.status = status; + } + + public void setFare(List fare) { + this.fare = fare; + } + + public Flight getFlight() { + return flight; + } + + public Airport getStart() { + return start; + } + + public Airport getDestination() { + return destination; + } + + public Date getDateOfJourney() { + return dateOfJourney; + } + + public Timestamp getStartTime() { + return startTime; + } + + public Timestamp getEndTime() { + return endTime; + } + + public Status getStatus() { + return status; + } + + public List getFare() { + return fare; + } +} diff --git a/flighbookingsystem/Seat.java b/flighbookingsystem/Seat.java new file mode 100644 index 00000000..eac61171 --- /dev/null +++ b/flighbookingsystem/Seat.java @@ -0,0 +1,15 @@ +package flighbookingsystem; + +public class Seat { + private int seatId; + private String seatType; + + public Seat(int seatId, String seatType) { + this.seatId = seatId; + this.seatType = seatType; + } + + public Seat() { + + } +} diff --git a/flighbookingsystem/Status.java b/flighbookingsystem/Status.java new file mode 100644 index 00000000..c47cf733 --- /dev/null +++ b/flighbookingsystem/Status.java @@ -0,0 +1,9 @@ +package flighbookingsystem; + +public enum Status { + DELAY, + ONTIME, + CANCLLED, + BOOKED, + OPEN +} diff --git a/flighbookingsystem/User.java b/flighbookingsystem/User.java new file mode 100644 index 00000000..3f44bd89 --- /dev/null +++ b/flighbookingsystem/User.java @@ -0,0 +1,11 @@ +package flighbookingsystem; + +public class User { + String name; + String email; + + public User(String name, String email) { + this.name = name; + this.email = email; + } +} diff --git a/librarymanagement/Book.java b/librarymanagement/Book.java new file mode 100644 index 00000000..8d18e180 --- /dev/null +++ b/librarymanagement/Book.java @@ -0,0 +1,37 @@ +package librarymanagement; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +class Book { + private String bookId; + private String title; + private List authors; + private List publishers; + private List copies; + + public Book(String bookId, String title, List authors, List publishers) { + this.bookId = bookId; + this.title = title; + this.authors = authors; + this.publishers = publishers; + this.copies = new ArrayList<>(); + } + + public Optional getAvailableCopy() { + return copies.stream().filter(copy -> !copy.isBorrowed()).findFirst(); + } + + public void addBookCopy(BookCopy copy) { + copies.add(copy); + } + + public void search(String attribute, String value) { + if ((attribute.equals("book_id") && bookId.equals(value)) || + (attribute.equals("author") && authors.contains(value)) || + (attribute.equals("publisher") && publishers.contains(value))) { + copies.forEach(BookCopy::printDetails); + } + } +} \ No newline at end of file diff --git a/librarymanagement/BookCopy.java b/librarymanagement/BookCopy.java new file mode 100644 index 00000000..fe085a68 --- /dev/null +++ b/librarymanagement/BookCopy.java @@ -0,0 +1,48 @@ +package librarymanagement; +class BookCopy { + private String copyId; + private Book book; + private Rack rack; + private String borrowedBy; + private String dueDate; + + public Book getBook() { + return book; + } + + public void setBook(Book book) { + this.book = book; + } + + public BookCopy(String copyId, Book book, Rack rack) { + this.copyId = copyId; + this.book = book; + this.rack = rack; + } + + public String getCopyId() { + return copyId; + } + + public Rack getRack() { + return rack; + } + + public boolean isBorrowed() { + return borrowedBy != null; + } + + public void borrow(String userId, String dueDate) { + this.borrowedBy = userId; + this.dueDate = dueDate; + } + + public void returnCopy() { + this.borrowedBy = null; + this.dueDate = null; + } + + public void printDetails() { + System.out.println(copyId + " " + rack.getRackNumber()); + } +} diff --git a/librarymanagement/Library.java b/librarymanagement/Library.java new file mode 100644 index 00000000..3b1d20ff --- /dev/null +++ b/librarymanagement/Library.java @@ -0,0 +1,115 @@ +package librarymanagement; + + +import java.util.*; + +class Library { + private String libraryId; + private Map books; + private Map racks; + private Map users; + private int totalRacks; + + public Library(String libraryId, int totalRacks) { + this.libraryId = libraryId; + this.totalRacks = totalRacks; + this.books = new HashMap<>(); + this.racks = new HashMap<>(); + this.users = new HashMap<>(); + + for (int i = 1; i <= totalRacks; i++) { + racks.put("R" + i, new Rack(i)); + } + } + + public List addBook(String bookId, String title, List authors, List publishers, List bookCopyIds) { + Book book = books.getOrDefault(bookId, new Book(bookId, title, authors, publishers)); + List addedRackNos = new ArrayList<>(); + + for (String copyId : bookCopyIds) { + Optional availableRack = racks.values().stream().filter(rack -> !rack.isOccupied()).findFirst(); + if (availableRack.isPresent()) { + Rack rack = availableRack.get(); + BookCopy bookCopy = new BookCopy(copyId, book, rack); + rack.placeBookCopy(bookCopy); + book.addBookCopy(bookCopy); + addedRackNos.add(rack.getRackNumber()); + } else { + break; + } + } + + if (!addedRackNos.isEmpty()) books.put(bookId, book); + return addedRackNos; + } + + public int removeBookCopy(String bookCopyId) { + for (Rack rack : racks.values()) { + if (rack.isOccupied() && rack.getBookCopy().getCopyId().equals(bookCopyId)) { + rack.removeBookCopy(); + return rack.getRackNumber(); + } + } + return -1; + } + + public String borrowBook(String bookId, String userId, String dueDate) { + User user = users.computeIfAbsent(userId, id -> new User(userId)); + if (user.getBorrowedBooks().size() >= 5) return "Overlimit"; + + Book book = books.get(bookId); + if (book == null) return "Invalid Book ID"; + + Optional availableCopy = book.getAvailableCopy(); + if (!availableCopy.isPresent()) return "Not available"; + + BookCopy copy = availableCopy.get(); + copy.borrow(userId, dueDate); + user.borrowBook(copy); + return "Borrowed Book from rack: " + copy.getRack().getRackNumber(); + } + + public String borrowBookCopy(String bookCopyId, String userId, String dueDate) { + User user = users.computeIfAbsent(userId, id -> new User(userId)); + if (user.getBorrowedBooks().size() >= 5) return "Overlimit"; + + Optional bookCopyOpt = racks.values().stream() + .filter(rack -> rack.isOccupied() && rack.getBookCopy().getCopyId().equals(bookCopyId)) + .map(Rack::getBookCopy) + .findFirst(); + + if (!bookCopyOpt.isPresent()) return "Invalid Book Copy ID"; + + BookCopy bookCopy = bookCopyOpt.get(); + bookCopy.borrow(userId, dueDate); + user.borrowBook(bookCopy); + return "Borrowed Book Copy from rack: " + bookCopy.getRack().getRackNumber(); + } + + public String returnBookCopy(String bookCopyId) { + for (Rack rack : racks.values()) { + if (!rack.isOccupied()) { + Optional borrowedCopy = racks.values().stream() + .filter(r -> r.getBookCopy() != null && r.getBookCopy().getCopyId().equals(bookCopyId)) + .map(Rack::getBookCopy) + .findFirst(); + + if (borrowedCopy.isPresent()) { + borrowedCopy.get().returnCopy(); + rack.placeBookCopy(borrowedCopy.get()); + return "Returned book copy " + bookCopyId + " and added to rack: " + rack.getRackNumber(); + } + } + } + return "Invalid Book Copy ID"; + } + + public void printBorrowed(String userId) { + User user = users.get(userId); + if (user != null) user.printBorrowedBooks(); + } + + public void search(String attribute, String value) { + books.values().forEach(book -> book.search(attribute, value)); + } +} diff --git a/librarymanagement/Main.java b/librarymanagement/Main.java new file mode 100644 index 00000000..b73710c9 --- /dev/null +++ b/librarymanagement/Main.java @@ -0,0 +1,88 @@ +package librarymanagement; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class Main { + private static Library library; + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + while (scanner.hasNextLine()) { + String command = scanner.nextLine(); + if (command.equals("exit")) break; + + processCommand(command); + } + } + + private static void processCommand(String command) { + String[] tokens = command.split(" "); + switch (tokens[0]) { + case "create_library": + int numRacks = Integer.parseInt(tokens[1]); + library = new Library(tokens[1], numRacks); + System.out.println("Created library with " + numRacks + " racks"); + break; + + case "add_book": + String bookId = tokens[1]; + String title = tokens[2]; + List authors = Arrays.asList(tokens[3].split(",")); + List publishers = Arrays.asList(tokens[4].split(",")); + List bookCopyIds = Arrays.asList(tokens[5].split(",")); + List rackNos = library.addBook(bookId, title, authors, publishers, bookCopyIds); + if (rackNos.isEmpty()) { + System.out.println("Rack not available"); + } else { + System.out.println("Added Book to racks: " + rackNos.toString().replaceAll("[\\[\\]]", "")); + } + break; + + case "remove_book_copy": + String bookCopyId = tokens[1]; + int removedRack = library.removeBookCopy(bookCopyId); + if (removedRack == -1) { + System.out.println("Invalid Book Copy ID"); + } else { + System.out.println("Removed book copy: " + bookCopyId + " from rack: " + removedRack); + } + break; + + case "borrow_book": + bookId = tokens[1]; + String userId = tokens[2]; + String dueDate = tokens[3]; + String borrowResult = library.borrowBook(bookId, userId, dueDate); + System.out.println(borrowResult); + break; + + case "borrow_book_copy": + bookCopyId = tokens[1]; + userId = tokens[2]; + dueDate = tokens[3]; + borrowResult = library.borrowBookCopy(bookCopyId, userId, dueDate); + System.out.println(borrowResult); + break; + + case "return_book_copy": + bookCopyId = tokens[1]; + String returnResult = library.returnBookCopy(bookCopyId); + System.out.println(returnResult); + break; + + case "print_borrowed": + userId = tokens[1]; + library.printBorrowed(userId); + break; + + case "search": + String attribute = tokens[1]; + String attributeValue = tokens[2]; + library.search(attribute, attributeValue); + break; + } + } +} diff --git a/librarymanagement/Rack.java b/librarymanagement/Rack.java new file mode 100644 index 00000000..b9813492 --- /dev/null +++ b/librarymanagement/Rack.java @@ -0,0 +1,30 @@ +package librarymanagement; + +class Rack { + private int rackNumber; + private BookCopy bookCopy; + + public Rack(int rackNumber) { + this.rackNumber = rackNumber; + } + + public int getRackNumber() { + return rackNumber; + } + + public boolean isOccupied() { + return bookCopy != null; + } + + public void placeBookCopy(BookCopy bookCopy) { + this.bookCopy = bookCopy; + } + + public void removeBookCopy() { + this.bookCopy = null; + } + + public BookCopy getBookCopy() { + return bookCopy; + } +} \ No newline at end of file diff --git a/librarymanagement/User.java b/librarymanagement/User.java new file mode 100644 index 00000000..a92deaff --- /dev/null +++ b/librarymanagement/User.java @@ -0,0 +1,28 @@ +package librarymanagement; + +import java.util.ArrayList; +import java.util.List; + +class User { + private String userId; + private List borrowedBooks; + + public User(String userId) { + this.userId = userId; + this.borrowedBooks = new ArrayList<>(); + } + + public void borrowBook(BookCopy copy) { + borrowedBooks.add(copy); + } + + public void printBorrowedBooks() { + for (BookCopy copy : borrowedBooks) { + System.out.println(copy.getCopyId()); + } + } + + public List getBorrowedBooks() { + return borrowedBooks; + } +} diff --git a/meetingroom/Calender.java b/meetingroom/Calender.java new file mode 100644 index 00000000..04b642d9 --- /dev/null +++ b/meetingroom/Calender.java @@ -0,0 +1,15 @@ +package meetingroom; + +import java.util.List; + +public class Calender { + List intervalList; + + public void setIntervalList(List list) { + this.intervalList = list; + } + + public List getIntervalList() { + return intervalList; + } +} diff --git a/meetingroom/Interval.java b/meetingroom/Interval.java new file mode 100644 index 00000000..6dd2c5b3 --- /dev/null +++ b/meetingroom/Interval.java @@ -0,0 +1,42 @@ +package meetingroom; + +import java.time.LocalDate; +import java.time.LocalTime; + +public class Interval { + LocalDate date; + LocalTime start; + LocalTime end; + + public Interval(LocalDate date, LocalTime start, LocalTime end) { + this.date = date; + this.start = start; + this.end = end; + } + + public LocalDate getDate() { + return date; + } + + public LocalTime getStart() { + return start; + } + + public LocalTime getEnd() { + return end; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public void setStart(LocalTime start) { + this.start = start; + } + + public void setEnd(LocalTime end) { + this.end = end; + } + + +} diff --git a/meetingroom/Location.java b/meetingroom/Location.java new file mode 100644 index 00000000..62658693 --- /dev/null +++ b/meetingroom/Location.java @@ -0,0 +1,28 @@ +package meetingroom; + +public class Location { + int floorNo; + + public void setFloorNo(int floorNo) { + this.floorNo = floorNo; + } + + public void setBuildingNo(int buildingNo) { + BuildingNo = buildingNo; + } + + public int getFloorNo() { + return floorNo; + } + + public int getBuildingNo() { + return BuildingNo; + } + + public Location(int floorNo, int buildingNo) { + this.floorNo = floorNo; + BuildingNo = buildingNo; + } + + int BuildingNo; +} diff --git a/meetingroom/MeetingRoom.java b/meetingroom/MeetingRoom.java new file mode 100644 index 00000000..2b4f5d8d --- /dev/null +++ b/meetingroom/MeetingRoom.java @@ -0,0 +1,96 @@ +package meetingroom; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Map; + +public class MeetingRoom { + int id; + + @Override + public String toString() { + return "MeetingRoom{" + + "id=" + id + + ", location=" + location + + ", isBooked=" + isBooked + + ", capacity=" + capacity + + '}'; + } + + Location location; + boolean isBooked; + + public void setId(int id) { + this.id = id; + } + + public void setLocation(Location location) { + this.location = location; + } + + public void setBooked(boolean booked) { + isBooked = booked; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + public int getId() { + return id; + } + + public Location getLocation() { + return location; + } + + public boolean isBooked() { + return isBooked; + } + + public int getCapacity() { + return capacity; + } + + public void setCalender(Calender calender) { + this.calender = calender; + } + + public Calender getCalender() { + return calender; + } + + int capacity; + + Calender calender; + + public void bookRoom(int meetingRoomId, LocalTime start, LocalTime end, LocalDate date, Map meetingRoomCalenderMap) { + // Retrieve or create a calendar for the meeting room + Calender calendar = meetingRoomCalenderMap.getOrDefault(this, new Calender()); + + // Check for overlapping intervals + boolean isOverlapping = calendar.getIntervalList().stream().anyMatch(interval -> + interval.getDate().equals(date) && + (start.isBefore(interval.getEnd()) && end.isAfter(interval.getStart())) + ); + + // If there's an overlap, return an error or handle it appropriately + if (isOverlapping) { + System.out.println("Meeting room is already booked for the requested time interval."); + return; + } + + // Add the new interval if no overlap is found + Interval newInterval = new Interval(date,start,end); + calendar.getIntervalList().add(newInterval); + + // Update the calendar in the map if it's new + meetingRoomCalenderMap.put(this, calendar); + + // Mark the room as booked + this.setBooked(true); + System.out.println("Meeting room " + meetingRoomId + " booked successfully from " + start + " to " + end + " on " + date); + } + + +} diff --git a/meetingroom/MeetingRoomManager.java b/meetingroom/MeetingRoomManager.java new file mode 100644 index 00000000..8ca0a5f5 --- /dev/null +++ b/meetingroom/MeetingRoomManager.java @@ -0,0 +1,70 @@ +package meetingroom; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MeetingRoomManager { + public MeetingRoomManager() { + this.meetingRoomList = new ArrayList<>(); + this.meetingRoomCalenderMap = new HashMap<>(); + } + + List meetingRoomList ; + Map meetingRoomCalenderMap; + + List getAvailableMeetingRooms(int capacity, LocalTime startTime, LocalTime endTime, LocalDate date){ + return meetingRoomList.stream() + .filter(room -> !room.isBooked + && room.getCapacity() >= capacity + && room.getCalender().getIntervalList().stream() + .anyMatch(interval -> interval.getDate().equals(date) + && (interval.getStart().isBefore(endTime) && interval.getEnd().isAfter(startTime)) + ) + ).toList(); + + } + + void addMeetingRoom(int id, Location location, int capacity) { + MeetingRoom meetingRoom = new MeetingRoom(); + meetingRoom.setId(id); + meetingRoom.setLocation(location); + meetingRoom.setCapacity(capacity); + meetingRoom.setBooked(false); + + // Create and add initial intervals to simulate existing bookings + Calender calendar = new Calender(); + List initialIntervals = new ArrayList<>(); + + // Example: Booked on 2024-10-11 from 9:00 to 10:30 + Interval interval1 = new Interval(LocalDate.of(2024, 10, 11),LocalTime.of(9, 0),LocalTime.of(10, 30)); + + initialIntervals.add(interval1); + + // Example: Booked on 2024-10-12 from 14:00 to 15:30 + Interval interval2 = new Interval(LocalDate.of(2024, 10, 12), + LocalTime.of(14, 0), + LocalTime.of(15, 30)); + + initialIntervals.add(interval2); + + calendar.setIntervalList(initialIntervals); // Set intervals to the calendar + meetingRoomCalenderMap.put(meetingRoom, calendar); // Add to calendar map + meetingRoom.setCalender(calendar); + meetingRoomList.add(meetingRoom); + } + String bookMeetingRoom(int meetingRoomId, LocalTime start, LocalTime end, LocalDate date){ + + List list = meetingRoomList.stream().map(e -> e.getId()).toList(); + if(list.contains(meetingRoomId)) { + MeetingRoom meetingRoom = meetingRoomList.stream().filter(e->e.getId()==meetingRoomId).findFirst().get(); + meetingRoom.bookRoom(meetingRoomId, start, end, date, meetingRoomCalenderMap); + return meetingRoomId + "booked sucessfully "; + } + + return "invalid meetingRoomId"; + } +} diff --git a/meetingroom/MeetingScheduler.java b/meetingroom/MeetingScheduler.java new file mode 100644 index 00000000..16bc9182 --- /dev/null +++ b/meetingroom/MeetingScheduler.java @@ -0,0 +1,25 @@ +package meetingroom; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +public class MeetingScheduler { + + static MeetingRoomManager meetingRoomManager; + + public static void main(String[] args) { + meetingRoomManager = new MeetingRoomManager(); + meetingRoomManager.addMeetingRoom(1,new Location(1,11),10); + List availableMeetingRooms = meetingRoomManager.getAvailableMeetingRooms(5,LocalTime.of(9, 0),LocalTime.of(10, 30),LocalDate.of(2024, 10, 11)); + System.out.println("available meeting rooms::"+availableMeetingRooms); + if(!availableMeetingRooms.isEmpty()) { + String s = meetingRoomManager.bookMeetingRoom(1, LocalTime.of(11, 0), LocalTime.of(12, 15), LocalDate.of(2024, 11, 19)); + System.out.println(s); + } + else { + System.out.println("meeting room is not available at that schedule"); + } + // sendNotification(); + } +} diff --git a/parkingLot/Account.java b/parkingLot/Account.java new file mode 100644 index 00000000..7ae06b75 --- /dev/null +++ b/parkingLot/Account.java @@ -0,0 +1,13 @@ +package parkingLot; + +public abstract class Account { + private String userName; + private String password; + private Person person; + private AccountStatus status; + + public abstract boolean resetPassword(); + + // Getters and Setters + // ... +} diff --git a/parkingLot/AccountStatus.java b/parkingLot/AccountStatus.java new file mode 100644 index 00000000..47cce256 --- /dev/null +++ b/parkingLot/AccountStatus.java @@ -0,0 +1,9 @@ +package parkingLot; + +enum AccountStatus { + ACTIVE, + CLOSED, + CANCELED, + BLACKLISTED, + NONE +} diff --git a/parkingLot/Address.java b/parkingLot/Address.java new file mode 100644 index 00000000..5005f99a --- /dev/null +++ b/parkingLot/Address.java @@ -0,0 +1,12 @@ +package parkingLot; + +public class Address { + private int zipCode; + private String address; + private String city; + private String state; + private String country; + + // Getters and Setters + // ... +} diff --git a/parkingLot/Admin.java b/parkingLot/Admin.java new file mode 100644 index 00000000..5719c5b7 --- /dev/null +++ b/parkingLot/Admin.java @@ -0,0 +1,28 @@ +package parkingLot; + +public class Admin extends Account { + public boolean addParkingSpot(ParkingSpot spot) { + // Logic to add a parking spot + return true; + } + + public boolean addDisplayBoard(DisplayBoard displayBoard) { + // Logic to add a display board + return true; + } + + public boolean addEntrance(Entrance entrance) { + // Logic to add an entrance + return true; + } + + public boolean addExit(Exit exit) { + // Logic to add an exit + return true; + } + + public boolean resetPassword() { + // Logic to reset password + return true; + } +} diff --git a/parkingLot/Car.java b/parkingLot/Car.java new file mode 100644 index 00000000..3e867c9e --- /dev/null +++ b/parkingLot/Car.java @@ -0,0 +1,7 @@ +package parkingLot; + +public class Car extends Vehicle { + public void assignTicket(ParkingTicket ticket) { + // Logic to assign a ticket to the car + } +} diff --git a/parkingLot/Cash.java b/parkingLot/Cash.java new file mode 100644 index 00000000..604b9ecb --- /dev/null +++ b/parkingLot/Cash.java @@ -0,0 +1,8 @@ +package parkingLot; + +public class Cash extends Payment { + public boolean initiateTransaction() { + // Logic to initiate a cash transaction + return true; + } +} diff --git a/parkingLot/Compact.java b/parkingLot/Compact.java new file mode 100644 index 00000000..419393e0 --- /dev/null +++ b/parkingLot/Compact.java @@ -0,0 +1,8 @@ +package parkingLot; + +public class Compact extends ParkingSpot { + public boolean assignVehicle(Vehicle vehicle) { + // Logic to check if the vehicle can be assigned + return true; + } +} diff --git a/parkingLot/CreditCard.java b/parkingLot/CreditCard.java new file mode 100644 index 00000000..638e01df --- /dev/null +++ b/parkingLot/CreditCard.java @@ -0,0 +1,8 @@ +package parkingLot; + +public class CreditCard extends Payment { + public boolean initiateTransaction() { + // Logic to initiate a credit card transaction + return true; + } +} diff --git a/parkingLot/DisplayBoard.java b/parkingLot/DisplayBoard.java new file mode 100644 index 00000000..a1958686 --- /dev/null +++ b/parkingLot/DisplayBoard.java @@ -0,0 +1,26 @@ +package parkingLot; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DisplayBoard { + private int id; + private Map> parkingSpots; + + public DisplayBoard(int id) { + this.id = id; + this.parkingSpots = new HashMap<>(); + } + + public void addParkingSpot(String spotType, List spots) { + parkingSpots.put(spotType, spots); + } + + public void showFreeSlot() { + // Logic to show free slots + } + + // Getters and Setters + // ... +} diff --git a/parkingLot/Entrance.java b/parkingLot/Entrance.java new file mode 100644 index 00000000..c29f7a20 --- /dev/null +++ b/parkingLot/Entrance.java @@ -0,0 +1,13 @@ +package parkingLot; + +public class Entrance { + private int id; + + public ParkingTicket getTicket() { + // Logic to get a parking ticket + return new ParkingTicket(); + } + + // Getters and Setters + // ... +} diff --git a/parkingLot/Exit.java b/parkingLot/Exit.java new file mode 100644 index 00000000..8256bc84 --- /dev/null +++ b/parkingLot/Exit.java @@ -0,0 +1,12 @@ +package parkingLot; + +public class Exit { + private int id; + + public void validateTicket(ParkingTicket ticket) { + // Logic to validate a parking ticket + } + + // Getters and Setters + // ... +} diff --git a/parkingLot/Handicapped.java b/parkingLot/Handicapped.java new file mode 100644 index 00000000..0fd76fc2 --- /dev/null +++ b/parkingLot/Handicapped.java @@ -0,0 +1,8 @@ +package parkingLot; + +public class Handicapped extends ParkingSpot { + public boolean assignVehicle(Vehicle vehicle) { + // Logic to check if the vehicle can be assigned + return true; + } +} diff --git a/parkingLot/Large.java b/parkingLot/Large.java new file mode 100644 index 00000000..47b01059 --- /dev/null +++ b/parkingLot/Large.java @@ -0,0 +1,8 @@ +package parkingLot; + +public class Large extends ParkingSpot { + public boolean assignVehicle(Vehicle vehicle) { + // Logic to check if the vehicle can be assigned + return true; + } +} diff --git a/parkingLot/MotorVehicle.java b/parkingLot/MotorVehicle.java new file mode 100644 index 00000000..d7845b3c --- /dev/null +++ b/parkingLot/MotorVehicle.java @@ -0,0 +1,7 @@ +package parkingLot; + +public class MotorVehicle extends Vehicle { + public void assignTicket(ParkingTicket ticket) { + // Logic to assign a ticket to the motorcycle + } +} diff --git a/parkingLot/Motorcycle.java b/parkingLot/Motorcycle.java new file mode 100644 index 00000000..64ec1052 --- /dev/null +++ b/parkingLot/Motorcycle.java @@ -0,0 +1,8 @@ +package parkingLot; + +public class Motorcycle extends ParkingSpot { + public boolean assignVehicle(Vehicle vehicle) { + // Logic to check if the vehicle can be assigned + return true; + } +} diff --git a/parkingLot/ParkingAttendant.java b/parkingLot/ParkingAttendant.java new file mode 100644 index 00000000..9af6f61b --- /dev/null +++ b/parkingLot/ParkingAttendant.java @@ -0,0 +1,13 @@ +package parkingLot; + +public class ParkingAttendant extends Account { + public boolean processTicket(String ticketNumber) { + // Logic to process a parking ticket + return true; + } + + public boolean resetPassword() { + // Logic to reset password + return true; + } +} diff --git a/parkingLot/ParkingLot.java b/parkingLot/ParkingLot.java new file mode 100644 index 00000000..5db08f70 --- /dev/null +++ b/parkingLot/ParkingLot.java @@ -0,0 +1,53 @@ +package parkingLot; + +import java.util.HashMap; + +public class ParkingLot { + private int id; + private String name; + private String address; + private ParkingRate parkingRate; + + private HashMap entrance; + private HashMap exit; + + private HashMap tickets; + + private static ParkingLot parkingLot = null; + + private ParkingLot() { + this.entrance = new HashMap<>(); + this.exit = new HashMap<>(); + this.tickets = new HashMap<>(); + } + + public static ParkingLot getInstance() { + if (parkingLot == null) { + parkingLot = new ParkingLot(); + } + return parkingLot; + } + + public boolean addEntrance(Entrance entrance) { + // Logic to add an entrance + return true; + } + + public boolean addExit(Exit exit) { + // Logic to add an exit + return true; + } + + public ParkingTicket getParkingTicket(Vehicle vehicle) { + // Logic to generate a parking ticket + return new ParkingTicket(); + } + + public boolean isFull(ParkingSpot type) { + // Logic to check if the parking lot is full + return false; + } + + // Getters and Setters + // ... +} diff --git a/parkingLot/ParkingRate.java b/parkingLot/ParkingRate.java new file mode 100644 index 00000000..988ace0b --- /dev/null +++ b/parkingLot/ParkingRate.java @@ -0,0 +1,13 @@ +package parkingLot; + +public class ParkingRate { + private double hours; + private double rate; + + public void calculate() { + // Logic to calculate the rate + } + + // Getters and Setters + // ... +} diff --git a/parkingLot/ParkingSpot.java b/parkingLot/ParkingSpot.java new file mode 100644 index 00000000..1a918f40 --- /dev/null +++ b/parkingLot/ParkingSpot.java @@ -0,0 +1,22 @@ +package parkingLot; + +public abstract class ParkingSpot { + private int id; + private boolean isFree; + private Vehicle vehicle; + + public boolean getIsFree() { + return isFree; + } + + public abstract boolean assignVehicle(Vehicle vehicle); + + public boolean removeVehicle() { + this.vehicle = null; + this.isFree = true; + return true; + } + + // Getters and Setters + // ... +} diff --git a/parkingLot/ParkingTicket.java b/parkingLot/ParkingTicket.java new file mode 100644 index 00000000..96b4ea2d --- /dev/null +++ b/parkingLot/ParkingTicket.java @@ -0,0 +1,19 @@ +package parkingLot; + +import java.util.Date; + +public class ParkingTicket { + private int ticketNo; + private Date timestamp; + private Date exit; + private double amount; + private boolean status; + + private Vehicle vehicle; + private Payment payment; + private Entrance entrance; + private Exit exitIns; + + // Getters and Setters + // ... +} diff --git a/parkingLot/Payment.java b/parkingLot/Payment.java new file mode 100644 index 00000000..80a9fb1b --- /dev/null +++ b/parkingLot/Payment.java @@ -0,0 +1,14 @@ +package parkingLot; + +import java.util.Date; + +public abstract class Payment { + private double amount; + private PaymentStatus status; + private Date timestamp; + + public abstract boolean initiateTransaction(); + + // Getters and Setters + // ... +} diff --git a/parkingLot/PaymentStatus.java b/parkingLot/PaymentStatus.java new file mode 100644 index 00000000..78d5b7f9 --- /dev/null +++ b/parkingLot/PaymentStatus.java @@ -0,0 +1,9 @@ +package parkingLot; + +enum PaymentStatus { + COMPLETED, + FAILED, + PENDING, + UNPAID, + REFUNDED +} diff --git a/parkingLot/Person.java b/parkingLot/Person.java new file mode 100644 index 00000000..321e5422 --- /dev/null +++ b/parkingLot/Person.java @@ -0,0 +1,11 @@ +package parkingLot; + +public class Person { + private String name; + private String address; + private String phone; + private String email; + + // Getters and Setters + // ... +} diff --git a/parkingLot/Truck.java b/parkingLot/Truck.java new file mode 100644 index 00000000..54ccace6 --- /dev/null +++ b/parkingLot/Truck.java @@ -0,0 +1,7 @@ +package parkingLot; + +public class Truck extends Vehicle { + public void assignTicket(ParkingTicket ticket) { + // Logic to assign a ticket to the truck + } +} diff --git a/parkingLot/Van.java b/parkingLot/Van.java new file mode 100644 index 00000000..b3c0318d --- /dev/null +++ b/parkingLot/Van.java @@ -0,0 +1,7 @@ +package parkingLot; + +public class Van extends Vehicle { + public void assignTicket(ParkingTicket ticket) { + // Logic to assign a ticket to the van + } +} diff --git a/parkingLot/Vehicle.java b/parkingLot/Vehicle.java new file mode 100644 index 00000000..9907fd2b --- /dev/null +++ b/parkingLot/Vehicle.java @@ -0,0 +1,10 @@ +package parkingLot; + +public abstract class Vehicle { + private int licenseNo; + + public abstract void assignTicket(ParkingTicket ticket); + + // Getters and Setters + // ... +} diff --git a/parkingLot/parkingLot.plantuml b/parkingLot/parkingLot.plantuml new file mode 100644 index 00000000..ae473ec4 --- /dev/null +++ b/parkingLot/parkingLot.plantuml @@ -0,0 +1,374 @@ +@startuml + +title __PARKINGLOT's Class Diagram__\n + + namespace { + namespace ld { + namespace parkingLot { + abstract class lld.parkingLot.Account { + - password : String + - userName : String + {abstract} + resetPassword() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + enum AccountStatus { + ACTIVE + BLACKLISTED + CANCELED + CLOSED + NONE + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Address { + - address : String + - city : String + - country : String + - state : String + - zipCode : int + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Admin { + + addDisplayBoard() + + addEntrance() + + addExit() + + addParkingSpot() + + resetPassword() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Car { + + assignTicket() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Cash { + + initiateTransaction() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Compact { + + assignVehicle() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.CreditCard { + + initiateTransaction() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.DisplayBoard { + - id : int + - parkingSpots : Map> + + DisplayBoard() + + addParkingSpot() + + showFreeSlot() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Entrance { + - id : int + + getTicket() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Exit { + - id : int + + validateTicket() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Handicapped { + + assignVehicle() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Large { + + assignVehicle() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.MotorVehicle { + + assignTicket() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Motorcycle { + + assignVehicle() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.ParkingAttendant { + + processTicket() + + resetPassword() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.ParkingLot { + - address : String + - entrance : HashMap + - exit : HashMap + - id : int + - name : String + {static} - parkingLot : ParkingLot + - tickets : HashMap + + addEntrance() + + addExit() + {static} + getInstance() + + getParkingTicket() + + isFull() + - ParkingLot() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.ParkingRate { + - hours : double + - rate : double + + calculate() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + abstract class lld.parkingLot.ParkingSpot { + - id : int + - isFree : boolean + {abstract} + assignVehicle() + + getIsFree() + + removeVehicle() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.ParkingTicket { + - amount : double + - exit : Date + - status : boolean + - ticketNo : int + - timestamp : Date + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + abstract class lld.parkingLot.Payment { + - amount : double + - timestamp : Date + {abstract} + initiateTransaction() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + enum PaymentStatus { + COMPLETED + FAILED + PENDING + REFUNDED + UNPAID + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Person { + - address : String + - email : String + - name : String + - phone : String + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Truck { + + assignTicket() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + class lld.parkingLot.Van { + + assignTicket() + } + } + } + } + + + namespace { + namespace ld { + namespace parkingLot { + abstract class lld.parkingLot.Vehicle { + - licenseNo : int + {abstract} + assignTicket() + } + } + } + } + + + lld.parkingLot.Account o-- lld.parkingLot.Person : person + lld.parkingLot.Account o-- lld.parkingLot.AccountStatus : status + lld.parkingLot.Admin -up-|> lld.parkingLot.Account + lld.parkingLot.Car -up-|> lld.parkingLot.Vehicle + lld.parkingLot.Cash -up-|> lld.parkingLot.Payment + lld.parkingLot.Compact -up-|> lld.parkingLot.ParkingSpot + lld.parkingLot.CreditCard -up-|> lld.parkingLot.Payment + lld.parkingLot.Handicapped -up-|> lld.parkingLot.ParkingSpot + lld.parkingLot.Large -up-|> lld.parkingLot.ParkingSpot + lld.parkingLot.MotorVehicle -up-|> lld.parkingLot.Vehicle + lld.parkingLot.Motorcycle -up-|> lld.parkingLot.ParkingSpot + lld.parkingLot.ParkingAttendant -up-|> lld.parkingLot.Account + lld.parkingLot.ParkingLot o-- lld.parkingLot.ParkingRate : parkingRate + lld.parkingLot.ParkingSpot o-- lld.parkingLot.Vehicle : vehicle + lld.parkingLot.ParkingTicket o-- lld.parkingLot.Entrance : entrance + lld.parkingLot.ParkingTicket o-- lld.parkingLot.Exit : exitIns + lld.parkingLot.ParkingTicket o-- lld.parkingLot.Payment : payment + lld.parkingLot.ParkingTicket o-- lld.parkingLot.Vehicle : vehicle + lld.parkingLot.Payment o-- lld.parkingLot.PaymentStatus : status + lld.parkingLot.Truck -up-|> lld.parkingLot.Vehicle + lld.parkingLot.Van -up-|> lld.parkingLot.Vehicle + + +right footer + + +PlantUML diagram generated by SketchIt! (https://bitbucket.org/pmesmeur/sketch.it) +For more information about this tool, please contact philippe.mesmeur@gmail.com +endfooter + +@enduml diff --git a/Board.java b/snakeandladder/Board.java similarity index 97% rename from Board.java rename to snakeandladder/Board.java index 39a25fe2..4961385d 100644 --- a/Board.java +++ b/snakeandladder/Board.java @@ -1,3 +1,5 @@ +package snakeandladder; + import java.util.HashMap; import java.util.Map; diff --git a/Dice.java b/snakeandladder/Dice.java similarity index 92% rename from Dice.java rename to snakeandladder/Dice.java index 1c13c1d1..da377ad4 100644 --- a/Dice.java +++ b/snakeandladder/Dice.java @@ -1,3 +1,5 @@ +package snakeandladder; + import java.util.Random; public class Dice { diff --git a/Game.java b/snakeandladder/Game.java similarity index 92% rename from Game.java rename to snakeandladder/Game.java index 93232e34..38b58c74 100644 --- a/Game.java +++ b/snakeandladder/Game.java @@ -1,4 +1,6 @@ -import java.util.LinkedList; +package snakeandladder; + + import java.util.Queue; public class Game { @@ -36,5 +38,7 @@ public void play() { players.add(currentPlayer); } } + StringBuilder sb = new StringBuilder(); + sb.insert(0,"abc"); } } diff --git a/Main.java b/snakeandladder/Main.java similarity index 98% rename from Main.java rename to snakeandladder/Main.java index b39f1ae0..fce81bf8 100644 --- a/Main.java +++ b/snakeandladder/Main.java @@ -1,3 +1,7 @@ +package snakeandladder; + + + import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; diff --git a/Player.java b/snakeandladder/Player.java similarity index 93% rename from Player.java rename to snakeandladder/Player.java index eba13fc5..094da80e 100644 --- a/Player.java +++ b/snakeandladder/Player.java @@ -1,3 +1,5 @@ +package snakeandladder; + public class Player { private final String name; private int position; diff --git a/splitwise/Balance.java b/splitwise/Balance.java new file mode 100644 index 00000000..a4530791 --- /dev/null +++ b/splitwise/Balance.java @@ -0,0 +1,23 @@ +package splitwise; + +public class Balance { + double amountOwe; + double amountGetBack; + + public double getAmountOwe() { + return amountOwe; + } + + public void setAmountOwe(double amountOwe) { + this.amountOwe = amountOwe; + } + + public double getAmountGetBack() { + return amountGetBack; + } + + public void setAmountGetBack(double amountGetBack) { + this.amountGetBack = amountGetBack; + } + +} diff --git a/splitwise/BalanceSheetController.java b/splitwise/BalanceSheetController.java new file mode 100644 index 00000000..8bcd1bed --- /dev/null +++ b/splitwise/BalanceSheetController.java @@ -0,0 +1,81 @@ +package splitwise; + +import java.util.List; +import java.util.Map; + +public class BalanceSheetController { + public void updateUserExpenseBalanceSheet(User expensePaidBy, List splits, double totalExpenseAmount){ + + //update the total amount paid of the expense paid by user + UserExpenseBalanceSheet paidByUserExpenseSheet = expensePaidBy.getUserExpenseBalanceSheet(); + paidByUserExpenseSheet.setTotalPayment(paidByUserExpenseSheet.getTotalPayment() + totalExpenseAmount); + + for(SplitDetails split : splits) { + + User userOwe = split.getUser(); + UserExpenseBalanceSheet oweUserExpenseSheet = userOwe.getUserExpenseBalanceSheet(); + double oweAmount = split.getAmountOwe(); + + if(expensePaidBy.getUserId().equals(userOwe.getUserId())){ + paidByUserExpenseSheet.setTotalYourExpense(paidByUserExpenseSheet.getTotalYourExpense()+oweAmount); + } + else { + + //update the balance of paid user + paidByUserExpenseSheet.setTotalYouGetBack(paidByUserExpenseSheet.getTotalYouGetBack() + oweAmount); + + Balance userOweBalance; + if(paidByUserExpenseSheet.getUserVsBalance().containsKey(userOwe.getUserId())) { + + userOweBalance = paidByUserExpenseSheet.getUserVsBalance().get(userOwe.getUserId()); + } + else { + userOweBalance = new Balance(); + paidByUserExpenseSheet.getUserVsBalance().put(userOwe.getUserId(), userOweBalance); + } + + userOweBalance.setAmountGetBack(userOweBalance.getAmountGetBack() + oweAmount); + + + //update the balance sheet of owe user + oweUserExpenseSheet.setTotalYouOwe(oweUserExpenseSheet.getTotalYouOwe() + oweAmount); + oweUserExpenseSheet.setTotalYourExpense(oweUserExpenseSheet.getTotalYourExpense() + oweAmount); + + Balance userPaidBalance; + if(oweUserExpenseSheet.getUserVsBalance().containsKey(expensePaidBy.getUserId())){ + userPaidBalance = oweUserExpenseSheet.getUserVsBalance().get(expensePaidBy.getUserId()); + } + else{ + userPaidBalance = new Balance(); + oweUserExpenseSheet.getUserVsBalance().put(expensePaidBy.getUserId(), userPaidBalance); + } + userPaidBalance.setAmountOwe(userPaidBalance.getAmountOwe() + oweAmount); + } + } + } + + public void showBalanceSheetOfUser(User user){ + + System.out.println("---------------------------------------"); + + System.out.println("Balance sheet of user : " + user.getUserId()); + + UserExpenseBalanceSheet userExpenseBalanceSheet = user.getUserExpenseBalanceSheet(); + + System.out.println("TotalYourExpense: " + userExpenseBalanceSheet.getTotalYourExpense()); + System.out.println("TotalGetBack: " + userExpenseBalanceSheet.getTotalYouGetBack()); + System.out.println("TotalYourOwe: " + userExpenseBalanceSheet.getTotalYouOwe()); + System.out.println("TotalPaymnetMade: " + userExpenseBalanceSheet.getTotalPayment()); + for(Map.Entry entry : userExpenseBalanceSheet.getUserVsBalance().entrySet()){ + + String userID = entry.getKey(); + Balance balance = entry.getValue(); + + System.out.println("userID:" + userID + " YouGetBack:" + balance.getAmountGetBack() + " YouOwe:" + balance.getAmountOwe()); + } + + System.out.println("---------------------------------------"); + + } + +} diff --git a/splitwise/EqualExpenseSplit.java b/splitwise/EqualExpenseSplit.java new file mode 100644 index 00000000..3185bc48 --- /dev/null +++ b/splitwise/EqualExpenseSplit.java @@ -0,0 +1,18 @@ +package splitwise; + +import java.util.List; + +public class EqualExpenseSplit implements ExpenseSplit{ + + + @Override + public void validateSplitRequest(List splitList, double totalAmount) { + //validate total amount in splits of each user is equal and overall equals to totalAmount or not + double amountShouldBePresent = totalAmount/splitList.size(); + for(SplitDetails split: splitList) { + if(split.getAmountOwe() != amountShouldBePresent) { + //throw exception + } + } + } +} diff --git a/splitwise/Expense.java b/splitwise/Expense.java new file mode 100644 index 00000000..94e47697 --- /dev/null +++ b/splitwise/Expense.java @@ -0,0 +1,29 @@ +package splitwise; + + +import java.util.ArrayList; +import java.util.List; + +public class Expense { + + String expenseId; + + String description; + + double expenseAmount; + + User paidByUser; + + ExpenseSplitType splitType; + + List splitDetails = new ArrayList<>(); + + public Expense(String expenseId, String description, double expenseAmount, User paidByUser, ExpenseSplitType splitType, List splitDetails) { + this.expenseId = expenseId; + this.description = description; + this.expenseAmount = expenseAmount; + this.paidByUser = paidByUser; + this.splitType = splitType; + this.splitDetails.addAll(splitDetails); + } +} diff --git a/splitwise/ExpenseController.java b/splitwise/ExpenseController.java new file mode 100644 index 00000000..4321f5c8 --- /dev/null +++ b/splitwise/ExpenseController.java @@ -0,0 +1,25 @@ +package splitwise; + +import java.util.List; + +public class ExpenseController { + + BalanceSheetController balanceSheetController; + + public ExpenseController() { + balanceSheetController = new BalanceSheetController(); + } + + public Expense createExpense(String expenseId, String description, double expenseAmount, + List splitDetails, ExpenseSplitType splitType, User paidByUser) { + + ExpenseSplit expenseSplit = SplitFactory.getSplitObject(splitType); + expenseSplit.validateSplitRequest(splitDetails, expenseAmount); + + Expense expense = new Expense(expenseId, description, expenseAmount, paidByUser, splitType, splitDetails); + + balanceSheetController.updateUserExpenseBalanceSheet(paidByUser, splitDetails, expenseAmount); + + return expense; + } +} \ No newline at end of file diff --git a/splitwise/ExpenseSplit.java b/splitwise/ExpenseSplit.java new file mode 100644 index 00000000..79a6b8fe --- /dev/null +++ b/splitwise/ExpenseSplit.java @@ -0,0 +1,9 @@ +package splitwise; + +import java.util.List; + +public interface ExpenseSplit { + + public void validateSplitRequest(List splitList, double totalAmount); +} + diff --git a/splitwise/ExpenseSplitType.java b/splitwise/ExpenseSplitType.java new file mode 100644 index 00000000..72d13df9 --- /dev/null +++ b/splitwise/ExpenseSplitType.java @@ -0,0 +1,8 @@ +package splitwise; + +public enum ExpenseSplitType { + + EQUAL, + UNEQUAL, + PERCENTAGE +} diff --git a/splitwise/Group.java b/splitwise/Group.java new file mode 100644 index 00000000..c9af584d --- /dev/null +++ b/splitwise/Group.java @@ -0,0 +1,47 @@ +package splitwise; + +import java.util.ArrayList; +import java.util.List; + +public class Group { + + String groupId; + String groupName; + List groupMembers; + + List expenseList; + + ExpenseController expenseController; + + Group(){ + groupMembers = new ArrayList<>(); + expenseList = new ArrayList<>(); + expenseController = new ExpenseController(); + } + + //add member to group + public void addMember(User member){ + groupMembers.add(member); + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public Expense createExpense(String expenseId, String description, double expenseAmount, + List splitDetails, ExpenseSplitType splitType, User paidByUser) { + + Expense expense = expenseController.createExpense(expenseId, description, expenseAmount, splitDetails, splitType, paidByUser); + expenseList.add(expense); + return expense; + } +} + diff --git a/splitwise/GroupController.java b/splitwise/GroupController.java new file mode 100644 index 00000000..647ca262 --- /dev/null +++ b/splitwise/GroupController.java @@ -0,0 +1,41 @@ +package splitwise; + +import java.util.ArrayList; +import java.util.List; + +public class GroupController { + + List groupList; + + public GroupController(){ + groupList = new ArrayList<>(); + } + + //create group + public void createNewGroup(String groupId, String groupName, User createdByUser) { + + //create a new group + Group group = new Group(); + group.setGroupId(groupId); + group.setGroupName(groupName); + + //add the user into the group, as it is created by the USER + group.addMember(createdByUser); + + //add the group in the list of overall groups + groupList.add(group); + } + + public Group getGroup(String groupId){ + + for(Group group: groupList) { + + if(group.getGroupId().equals(groupId)){ + return group; + } + } + return null; + } + +} + diff --git a/splitwise/Main.java b/splitwise/Main.java new file mode 100644 index 00000000..785dbfb3 --- /dev/null +++ b/splitwise/Main.java @@ -0,0 +1,10 @@ +package splitwise; + +public class Main { + public static void main(String args[]){ + + SplitWise splitwise = new SplitWise(); + splitwise.demo(); + } + +} diff --git a/splitwise/PercentageExpenseSplit.java b/splitwise/PercentageExpenseSplit.java new file mode 100644 index 00000000..3ebfa6cb --- /dev/null +++ b/splitwise/PercentageExpenseSplit.java @@ -0,0 +1,12 @@ +package splitwise; + +import java.util.List; + +public class PercentageExpenseSplit implements ExpenseSplit { + @Override + public void validateSplitRequest(List splitList, double totalAmount) { + + } + + +} diff --git a/splitwise/SplitDetails.java b/splitwise/SplitDetails.java new file mode 100644 index 00000000..0f0ab664 --- /dev/null +++ b/splitwise/SplitDetails.java @@ -0,0 +1,31 @@ +package splitwise; + + +public class SplitDetails { + + User user; + double amountOwe; + + public SplitDetails(User user, double amountOwe){ + this.user = user; + this.amountOwe = amountOwe; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public double getAmountOwe() { + return amountOwe; + } + + public void setAmountOwe(double amountOwe) { + this.amountOwe = amountOwe; + } + + +} diff --git a/splitwise/SplitFactory.java b/splitwise/SplitFactory.java new file mode 100644 index 00000000..95d08ad3 --- /dev/null +++ b/splitwise/SplitFactory.java @@ -0,0 +1,18 @@ +package splitwise; + +public class SplitFactory { + + public static ExpenseSplit getSplitObject(ExpenseSplitType splitType) { + + switch (splitType) { + case EQUAL: + return new EqualExpenseSplit(); + case UNEQUAL: + return new UnequalExpenseSplit(); + case PERCENTAGE: + return new PercentageExpenseSplit(); + default: + return null; + } + } +} diff --git a/splitwise/SplitWise.java b/splitwise/SplitWise.java new file mode 100644 index 00000000..979bed12 --- /dev/null +++ b/splitwise/SplitWise.java @@ -0,0 +1,75 @@ +package splitwise; + +import java.util.ArrayList; +import java.util.List; + +public class SplitWise { + + UserController userController; + GroupController groupController; + + BalanceSheetController balanceSheetController; + + SplitWise(){ + userController = new UserController(); + groupController = new GroupController(); + balanceSheetController = new BalanceSheetController(); + } + + public void demo(){ + + setupUserAndGroup(); + + //Step1: add members to the group + Group group = groupController.getGroup("G1001"); + group.addMember(userController.getUser("U2001")); + group.addMember(userController.getUser("U3001")); + + //Step2. create an expense inside a group + List splits = new ArrayList<>(); + SplitDetails split1 = new SplitDetails(userController.getUser("U1001"), 300); + SplitDetails split2 = new SplitDetails(userController.getUser("U2001"), 300); + SplitDetails split3 = new SplitDetails(userController.getUser("U3001"), 300); + splits.add(split1); + splits.add(split2); + splits.add(split3); + group.createExpense("Exp1001", "Breakfast", 900, splits, ExpenseSplitType.EQUAL, userController.getUser("U1001")); + + List splits2 = new ArrayList<>(); + SplitDetails splits2_1 = new SplitDetails(userController.getUser("U1001"), 400); + SplitDetails splits2_2 = new SplitDetails(userController.getUser("U2001"), 100); + splits2.add(splits2_1); + splits2.add(splits2_2); + group.createExpense("Exp1002", "Lunch", 500, splits2, ExpenseSplitType.UNEQUAL, userController.getUser("U2001")); + + for(User user : userController.getAllUsers()) { + balanceSheetController.showBalanceSheetOfUser(user); + } + } + + public void setupUserAndGroup(){ + + //onboard user to splitwise app + addUsersToSplitwiseApp(); + + //create a group by user1 + User user1 = userController.getUser("U1001"); + groupController.createNewGroup("G1001", "Outing with Friends", user1); + } + + private void addUsersToSplitwiseApp(){ + + //adding User1 + User user1 = new User("U1001", "User1"); + + //adding User2 + User user2 = new User ("U2001", "User2"); + + //adding User3 + User user3 = new User ("U3001", "User3"); + + userController.addUser(user1); + userController.addUser(user2); + userController.addUser(user3); + } +} diff --git a/splitwise/UnequalExpenseSplit.java b/splitwise/UnequalExpenseSplit.java new file mode 100644 index 00000000..f204dfbd --- /dev/null +++ b/splitwise/UnequalExpenseSplit.java @@ -0,0 +1,16 @@ +package splitwise; + +import java.util.List; + +public class UnequalExpenseSplit implements ExpenseSplit{ + + + @Override + public void validateSplitRequest(List splitList, double totalAmount) { + + } + + + +} + diff --git a/splitwise/User.java b/splitwise/User.java new file mode 100644 index 00000000..24fd4983 --- /dev/null +++ b/splitwise/User.java @@ -0,0 +1,21 @@ +package splitwise; + +public class User { + String userId; + String userName; + UserExpenseBalanceSheet userExpenseBalanceSheet; + + public User(String id, String userName){ + this.userId = id; + this.userName = userName; + userExpenseBalanceSheet = new UserExpenseBalanceSheet(); + } + public String getUserId() { + return userId; + } + + public UserExpenseBalanceSheet getUserExpenseBalanceSheet() { + return userExpenseBalanceSheet; + } + +} diff --git a/splitwise/UserController.java b/splitwise/UserController.java new file mode 100644 index 00000000..78b48223 --- /dev/null +++ b/splitwise/UserController.java @@ -0,0 +1,32 @@ +package splitwise; + +import java.util.ArrayList; +import java.util.List; + +public class UserController { + + List userList; + + public UserController(){ + userList = new ArrayList<>(); + } + + //add user + public void addUser(User user) { + userList.add(user); + } + + public User getUser(String userID) { + + for (User user : userList) { + if (user.getUserId().equals(userID)) { + return user; + } + } + return null; + } + + public List getAllUsers(){ + return userList; + } +} diff --git a/splitwise/UserExpenseBalanceSheet.java b/splitwise/UserExpenseBalanceSheet.java new file mode 100644 index 00000000..a0ea59ee --- /dev/null +++ b/splitwise/UserExpenseBalanceSheet.java @@ -0,0 +1,59 @@ +package splitwise; + +import java.util.HashMap; +import java.util.Map; + +public class UserExpenseBalanceSheet { + Map userVsBalance; + double totalYourExpense; + + double totalPayment; + + double totalYouOwe; + double totalYouGetBack; + + public UserExpenseBalanceSheet(){ + + userVsBalance = new HashMap<>(); + totalYourExpense = 0; + totalYouOwe = 0; + totalYouGetBack = 0; + } + + public Map getUserVsBalance() { + return userVsBalance; + } + + public double getTotalYourExpense() { + return totalYourExpense; + } + + public void setTotalYourExpense(double totalYourExpense) { + this.totalYourExpense = totalYourExpense; + } + + public double getTotalYouOwe() { + return totalYouOwe; + } + + public void setTotalYouOwe(double totalYouOwe) { + this.totalYouOwe = totalYouOwe; + } + + public double getTotalYouGetBack() { + return totalYouGetBack; + } + + public void setTotalYouGetBack(double totalYouGetBack) { + this.totalYouGetBack = totalYouGetBack; + } + + public double getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(double totalPayment) { + this.totalPayment = totalPayment; + } + +} From 935c2f6fbfe5ba178fee825de52f26bbdaec990f Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 00:46:29 +0530 Subject: [PATCH 03/15] atm lld --- atm/ATM.java | 1 - atm/ATMRoom.java | 1 - atm/ATMState.java | 2 +- atm/Card.java | 2 +- atm/CashWithdrawProcessor.java | 2 +- atm/CashWithdrawalState.java | 2 +- atm/CheckBalanceState.java | 3 +-- atm/FiveHundredWithdrawProcessor.java | 1 - atm/HasCardState.java | 2 +- atm/IdleState.java | 1 - atm/OneHundredWithdrawProcessor.java | 2 +- atm/SelectOperationState.java | 2 +- atm/TransactionType.java | 2 +- atm/TwoThousandWithdrawProcessor.java | 3 +-- atm/User.java | 3 +-- atm/UserBankAccount.java | 3 +-- 16 files changed, 12 insertions(+), 20 deletions(-) diff --git a/atm/ATM.java b/atm/ATM.java index e362c115..faad2738 100644 --- a/atm/ATM.java +++ b/atm/ATM.java @@ -77,4 +77,3 @@ public void printCurrentATMStatus(){ } } - diff --git a/atm/ATMRoom.java b/atm/ATMRoom.java index 9702f23b..893ba729 100644 --- a/atm/ATMRoom.java +++ b/atm/ATMRoom.java @@ -53,4 +53,3 @@ private UserBankAccount createBankAccount() { } } - diff --git a/atm/ATMState.java b/atm/ATMState.java index 11f23a4b..c5022207 100644 --- a/atm/ATMState.java +++ b/atm/ATMState.java @@ -29,4 +29,4 @@ public void returnCard(){ public void exit(ATM atm){ System.out.println("OOPS!! Something went wrong"); } -} +} \ No newline at end of file diff --git a/atm/Card.java b/atm/Card.java index 39405a9b..45446478 100644 --- a/atm/Card.java +++ b/atm/Card.java @@ -28,4 +28,4 @@ public void deductBankBalance(int amount){ public void setBankAccount(UserBankAccount bankAccount) { this.bankAccount = bankAccount; } -} +} \ No newline at end of file diff --git a/atm/CashWithdrawProcessor.java b/atm/CashWithdrawProcessor.java index 9daaf555..39903014 100644 --- a/atm/CashWithdrawProcessor.java +++ b/atm/CashWithdrawProcessor.java @@ -16,4 +16,4 @@ public void withdraw(ATM atm, int remainingAmount) { nextCashWithdrawalProcessor.withdraw(atm, remainingAmount); } } -} +} \ No newline at end of file diff --git a/atm/CashWithdrawalState.java b/atm/CashWithdrawalState.java index c071a2bc..b462dfe6 100644 --- a/atm/CashWithdrawalState.java +++ b/atm/CashWithdrawalState.java @@ -40,4 +40,4 @@ public void exit(ATM atmObject) { public void returnCard() { System.out.println("Please collect your card"); } -} +} \ No newline at end of file diff --git a/atm/CheckBalanceState.java b/atm/CheckBalanceState.java index 9b04e090..4125540f 100644 --- a/atm/CheckBalanceState.java +++ b/atm/CheckBalanceState.java @@ -22,5 +22,4 @@ public void exit(ATM atmObject){ public void returnCard(){ System.out.println("Please collect your card"); } -} - +} \ No newline at end of file diff --git a/atm/FiveHundredWithdrawProcessor.java b/atm/FiveHundredWithdrawProcessor.java index bbff056a..5ffa777f 100644 --- a/atm/FiveHundredWithdrawProcessor.java +++ b/atm/FiveHundredWithdrawProcessor.java @@ -24,4 +24,3 @@ else if(required > atm.getNoOfFiveHundredNotes()) { } } } - diff --git a/atm/HasCardState.java b/atm/HasCardState.java index b184bd76..438f9bd2 100644 --- a/atm/HasCardState.java +++ b/atm/HasCardState.java @@ -29,4 +29,4 @@ public void exit(ATM atm){ public void returnCard(){ System.out.println("Please collect your card"); } -} +} \ No newline at end of file diff --git a/atm/IdleState.java b/atm/IdleState.java index 0ccf40f9..1049a468 100644 --- a/atm/IdleState.java +++ b/atm/IdleState.java @@ -8,4 +8,3 @@ public void insertCard(ATM atm, Card card) { atm.setCurrentATMState(new HasCardState()); } } - diff --git a/atm/OneHundredWithdrawProcessor.java b/atm/OneHundredWithdrawProcessor.java index 1a373a36..5784dc33 100644 --- a/atm/OneHundredWithdrawProcessor.java +++ b/atm/OneHundredWithdrawProcessor.java @@ -23,4 +23,4 @@ else if(required > atm.getNoOfOneHundredNotes()) { System.out.println("Something went wrong"); } } -} +} \ No newline at end of file diff --git a/atm/SelectOperationState.java b/atm/SelectOperationState.java index 803b4924..02a8ab15 100644 --- a/atm/SelectOperationState.java +++ b/atm/SelectOperationState.java @@ -41,4 +41,4 @@ private void showOperations(){ System.out.println("Please select the Operation"); TransactionType.showAllTransactionTypes(); } -} +} \ No newline at end of file diff --git a/atm/TransactionType.java b/atm/TransactionType.java index e88c0373..c53b559e 100644 --- a/atm/TransactionType.java +++ b/atm/TransactionType.java @@ -11,4 +11,4 @@ public static void showAllTransactionTypes(){ System.out.println(type.name()); } } -} +} \ No newline at end of file diff --git a/atm/TwoThousandWithdrawProcessor.java b/atm/TwoThousandWithdrawProcessor.java index 6fa00dde..0f76d6ff 100644 --- a/atm/TwoThousandWithdrawProcessor.java +++ b/atm/TwoThousandWithdrawProcessor.java @@ -23,5 +23,4 @@ else if(required > atm.getNoOfTwoThousandNotes()) { super.withdraw(atm, balance); } } -} - +} \ No newline at end of file diff --git a/atm/User.java b/atm/User.java index dca502bb..46f9e042 100644 --- a/atm/User.java +++ b/atm/User.java @@ -13,5 +13,4 @@ public Card getCard() { public void setCard(Card card) { this.card = card; } -} - +} \ No newline at end of file diff --git a/atm/UserBankAccount.java b/atm/UserBankAccount.java index 2a77b7fc..23d56fe4 100644 --- a/atm/UserBankAccount.java +++ b/atm/UserBankAccount.java @@ -7,5 +7,4 @@ public class UserBankAccount { public void withdrawalBalance(int amount) { balance = balance - amount; } -} - +} \ No newline at end of file From df84bd4b6ff3a9b1d50c031853b67cacc9be2948 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 00:54:13 +0530 Subject: [PATCH 04/15] bookmyshow lld --- bookmyshow/BookMyShow.java | 1 + bookmyshow/Booking.java | 2 +- bookmyshow/BookingStatus.java | 2 +- bookmyshow/City.java | 1 + bookmyshow/Location.java | 1 + bookmyshow/Movie.java | 2 +- bookmyshow/MovieController.java | 1 - bookmyshow/Payment.java | 2 +- bookmyshow/PaymentStatus.java | 2 +- bookmyshow/PaymentType.java | 2 +- bookmyshow/Screen.java | 1 + bookmyshow/Seat.java | 2 +- bookmyshow/SeatStatus.java | 2 +- bookmyshow/SeatType.java | 2 +- bookmyshow/Show.java | 2 +- bookmyshow/Theater.java | 1 + bookmyshow/TheaterController.java | 1 + bookmyshow/UserDetails.java | 1 + bookmyshow/UserProfile.java | 2 +- 19 files changed, 18 insertions(+), 12 deletions(-) diff --git a/bookmyshow/BookMyShow.java b/bookmyshow/BookMyShow.java index e7009deb..ad1a3e66 100644 --- a/bookmyshow/BookMyShow.java +++ b/bookmyshow/BookMyShow.java @@ -196,3 +196,4 @@ private void createMovies() { } } + diff --git a/bookmyshow/Booking.java b/bookmyshow/Booking.java index 69de8932..da331fc3 100644 --- a/bookmyshow/Booking.java +++ b/bookmyshow/Booking.java @@ -97,4 +97,4 @@ public void setStatus(BookingStatus status) { public void setUser(UserDetails user) { this.user = user; } -} \ No newline at end of file +} diff --git a/bookmyshow/BookingStatus.java b/bookmyshow/BookingStatus.java index c1ef96ca..aca7ab98 100644 --- a/bookmyshow/BookingStatus.java +++ b/bookmyshow/BookingStatus.java @@ -2,4 +2,4 @@ enum BookingStatus { CONFIRMED, CANCELLED, PENDING -} \ No newline at end of file +} diff --git a/bookmyshow/City.java b/bookmyshow/City.java index 57863f30..b63147ce 100644 --- a/bookmyshow/City.java +++ b/bookmyshow/City.java @@ -4,3 +4,4 @@ public enum City { Bangalore, Delhi; } + diff --git a/bookmyshow/Location.java b/bookmyshow/Location.java index 49ba8ad8..0ceb8b42 100644 --- a/bookmyshow/Location.java +++ b/bookmyshow/Location.java @@ -45,3 +45,4 @@ public void setTheaters(List theaters) { this.theaters = theaters; } } + diff --git a/bookmyshow/Movie.java b/bookmyshow/Movie.java index 73b68141..394902cd 100644 --- a/bookmyshow/Movie.java +++ b/bookmyshow/Movie.java @@ -75,4 +75,4 @@ public void setReleaseDate(Date releaseDate) { public void setTitle(String title) { this.title = title; } -} \ No newline at end of file +} diff --git a/bookmyshow/MovieController.java b/bookmyshow/MovieController.java index f4da6080..de442781 100644 --- a/bookmyshow/MovieController.java +++ b/bookmyshow/MovieController.java @@ -47,5 +47,4 @@ List getMoviesByCity(City city) { //CRUD operation based on Movie ID, make use of allMovies list - } diff --git a/bookmyshow/Payment.java b/bookmyshow/Payment.java index 8e793f8c..324f3554 100644 --- a/bookmyshow/Payment.java +++ b/bookmyshow/Payment.java @@ -52,4 +52,4 @@ public void setStatus(PaymentStatus status) { public void setType(PaymentType type) { this.type = type; } -} \ No newline at end of file +} diff --git a/bookmyshow/PaymentStatus.java b/bookmyshow/PaymentStatus.java index 61d09f71..45e3ce0c 100644 --- a/bookmyshow/PaymentStatus.java +++ b/bookmyshow/PaymentStatus.java @@ -2,4 +2,4 @@ enum PaymentStatus { SUCCESS, FAILURE, PENDING -} \ No newline at end of file +} diff --git a/bookmyshow/PaymentType.java b/bookmyshow/PaymentType.java index 6cd0db6c..93eacd80 100644 --- a/bookmyshow/PaymentType.java +++ b/bookmyshow/PaymentType.java @@ -2,4 +2,4 @@ enum PaymentType { CREDIT_CARD, DEBIT_CARD, NET_BANKING, UPI, WALLET -} \ No newline at end of file +} diff --git a/bookmyshow/Screen.java b/bookmyshow/Screen.java index 9cfac607..9919846f 100644 --- a/bookmyshow/Screen.java +++ b/bookmyshow/Screen.java @@ -56,3 +56,4 @@ public void setTheater(Theater theater) { } } + diff --git a/bookmyshow/Seat.java b/bookmyshow/Seat.java index d509ac21..7874c8bf 100644 --- a/bookmyshow/Seat.java +++ b/bookmyshow/Seat.java @@ -41,4 +41,4 @@ public void setSeatStatus(SeatStatus seatStatus) { public void setSeatType(SeatType seatType) { this.seatType = seatType; } -} \ No newline at end of file +} diff --git a/bookmyshow/SeatStatus.java b/bookmyshow/SeatStatus.java index 13ed5450..3f3c2a01 100644 --- a/bookmyshow/SeatStatus.java +++ b/bookmyshow/SeatStatus.java @@ -2,4 +2,4 @@ enum SeatStatus { AVAILABLE, BOOKED, RESERVED -} \ No newline at end of file +} diff --git a/bookmyshow/SeatType.java b/bookmyshow/SeatType.java index 8c1c2997..cdd6bed5 100644 --- a/bookmyshow/SeatType.java +++ b/bookmyshow/SeatType.java @@ -2,4 +2,4 @@ enum SeatType { REGULAR, PREMIUM, VIP -} \ No newline at end of file +} diff --git a/bookmyshow/Show.java b/bookmyshow/Show.java index 2d4be2d5..6ed0ec2f 100644 --- a/bookmyshow/Show.java +++ b/bookmyshow/Show.java @@ -64,4 +64,4 @@ public void setShowId(Integer showId) { public void setShowTime(Integer showTime) { this.showTime = showTime; } -} \ No newline at end of file +} diff --git a/bookmyshow/Theater.java b/bookmyshow/Theater.java index ad5ad818..7b3ccee0 100644 --- a/bookmyshow/Theater.java +++ b/bookmyshow/Theater.java @@ -64,3 +64,4 @@ public void setTheaterId(Integer theaterId) { this.theaterId = theaterId; } } + diff --git a/bookmyshow/TheaterController.java b/bookmyshow/TheaterController.java index 7fa6a836..e66e37a7 100644 --- a/bookmyshow/TheaterController.java +++ b/bookmyshow/TheaterController.java @@ -53,3 +53,4 @@ Map> getAllShow(Movie movie, City city) { return TheaterVsShows; } } + diff --git a/bookmyshow/UserDetails.java b/bookmyshow/UserDetails.java index 4aeb165e..14bed601 100644 --- a/bookmyshow/UserDetails.java +++ b/bookmyshow/UserDetails.java @@ -50,3 +50,4 @@ public void setUserId(String userId) { this.userId = userId; } } + diff --git a/bookmyshow/UserProfile.java b/bookmyshow/UserProfile.java index 72af1e2d..9b445684 100644 --- a/bookmyshow/UserProfile.java +++ b/bookmyshow/UserProfile.java @@ -23,4 +23,4 @@ public void setAddress(String address) { public void setBookings(List bookings) { this.bookings = bookings; } -} \ No newline at end of file +} From 7970fedde2023457115f9a3fb7b71496f5b64cb5 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 01:01:39 +0530 Subject: [PATCH 05/15] cricbuzz lld --- cricbuzz/BallType.java | 1 + cricbuzz/Balls.java | 1 - cricbuzz/BattingScoreCard.java | 1 - cricbuzz/BattingScoreUpdater.java | 1 + cricbuzz/BowlingScoreCard.java | 1 + cricbuzz/BowlingScoreUpdater.java | 1 - cricbuzz/Innings.java | 1 - cricbuzz/Main.java | 1 - cricbuzz/Match.java | 1 - cricbuzz/MatchType.java | 1 - cricbuzz/OneDayMatchType.java | 1 - cricbuzz/Overs.java | 1 - cricbuzz/Person.java | 1 + cricbuzz/Player.java | 1 - cricbuzz/PlayerBattingController.java | 1 - cricbuzz/PlayerBowlingController.java | 1 - cricbuzz/PlayerType.java | 1 + cricbuzz/RunType.java | 1 + cricbuzz/ScoreUpdaterObserver.java | 1 + cricbuzz/T20MatchType.java | 1 + cricbuzz/Team.java | 1 - cricbuzz/Wicket.java | 1 + cricbuzz/WicketType.java | 1 + 23 files changed, 10 insertions(+), 13 deletions(-) diff --git a/cricbuzz/BallType.java b/cricbuzz/BallType.java index 17b7c0aa..94641da5 100644 --- a/cricbuzz/BallType.java +++ b/cricbuzz/BallType.java @@ -5,3 +5,4 @@ public enum BallType { NO_BALL, WIDE_BALL } + diff --git a/cricbuzz/Balls.java b/cricbuzz/Balls.java index 3d00461b..2e592231 100644 --- a/cricbuzz/Balls.java +++ b/cricbuzz/Balls.java @@ -133,5 +133,4 @@ private boolean isWicketTaken() { } } - } diff --git a/cricbuzz/BattingScoreCard.java b/cricbuzz/BattingScoreCard.java index 7d69c9da..3f8ca58c 100644 --- a/cricbuzz/BattingScoreCard.java +++ b/cricbuzz/BattingScoreCard.java @@ -7,6 +7,5 @@ public class BattingScoreCard { int totalSixes; int strikeRate; public Wicket wicketDetails; - } diff --git a/cricbuzz/BattingScoreUpdater.java b/cricbuzz/BattingScoreUpdater.java index 23d8d8e9..24ef3513 100644 --- a/cricbuzz/BattingScoreUpdater.java +++ b/cricbuzz/BattingScoreUpdater.java @@ -25,3 +25,4 @@ public void update(Balls ballDetails) { } } } + diff --git a/cricbuzz/BowlingScoreCard.java b/cricbuzz/BowlingScoreCard.java index 69790509..70afb52f 100644 --- a/cricbuzz/BowlingScoreCard.java +++ b/cricbuzz/BowlingScoreCard.java @@ -8,3 +8,4 @@ public class BowlingScoreCard { int wideBalls; double economyRate; } + diff --git a/cricbuzz/BowlingScoreUpdater.java b/cricbuzz/BowlingScoreUpdater.java index 18b4e246..7144317b 100644 --- a/cricbuzz/BowlingScoreUpdater.java +++ b/cricbuzz/BowlingScoreUpdater.java @@ -30,5 +30,4 @@ public void update(Balls Balls) { Balls.bowledBy.bowlingScoreCard.wideBalls++; } } - } diff --git a/cricbuzz/Innings.java b/cricbuzz/Innings.java index b702a4f7..b0e262d1 100644 --- a/cricbuzz/Innings.java +++ b/cricbuzz/Innings.java @@ -52,5 +52,4 @@ public void start(int runsToWin){ public int getTotalRuns(){ return battingTeam.getTotalRuns(); } - } diff --git a/cricbuzz/Main.java b/cricbuzz/Main.java index 5087ce65..3b163fd9 100644 --- a/cricbuzz/Main.java +++ b/cricbuzz/Main.java @@ -20,7 +20,6 @@ public static void main(String args[]) { } - private Team addTeam(String name) { Queue Player = new LinkedList<>(); diff --git a/cricbuzz/Match.java b/cricbuzz/Match.java index 955f5d4c..895a790e 100644 --- a/cricbuzz/Match.java +++ b/cricbuzz/Match.java @@ -86,5 +86,4 @@ private Team toss(Team teamA, Team teamB){ return teamB; } } - } diff --git a/cricbuzz/MatchType.java b/cricbuzz/MatchType.java index aed6d25b..62cef2b0 100644 --- a/cricbuzz/MatchType.java +++ b/cricbuzz/MatchType.java @@ -3,5 +3,4 @@ public interface MatchType { public int noOfOvers(); public int maxOverCountBowlers(); - } diff --git a/cricbuzz/OneDayMatchType.java b/cricbuzz/OneDayMatchType.java index ff0dde6a..e681d09d 100644 --- a/cricbuzz/OneDayMatchType.java +++ b/cricbuzz/OneDayMatchType.java @@ -10,5 +10,4 @@ public int noOfOvers() { public int maxOverCountBowlers() { return 10; } - } diff --git a/cricbuzz/Overs.java b/cricbuzz/Overs.java index 8edc099c..7888b594 100644 --- a/cricbuzz/Overs.java +++ b/cricbuzz/Overs.java @@ -78,5 +78,4 @@ public boolean startOver(Team battingTeam, Team bowlingTeam, int runsToWin) thro return false; } - } diff --git a/cricbuzz/Person.java b/cricbuzz/Person.java index a3257b3c..4850988f 100644 --- a/cricbuzz/Person.java +++ b/cricbuzz/Person.java @@ -4,3 +4,4 @@ public class Person { String name; int age; } + diff --git a/cricbuzz/Player.java b/cricbuzz/Player.java index 769a3714..b9054dbc 100644 --- a/cricbuzz/Player.java +++ b/cricbuzz/Player.java @@ -23,5 +23,4 @@ public void printBowlingScoreCard(){ System.out.println("PlayerName: " + person.name + " -- totalOversThrown: " + bowlingScoreCard.totalOversDelivered + " -- totalRunsGiven: " + bowlingScoreCard.runsGiven + " -- WicketsTaken: " + bowlingScoreCard.wicketsTaken); } - } diff --git a/cricbuzz/PlayerBattingController.java b/cricbuzz/PlayerBattingController.java index ff602e2b..db90de8a 100644 --- a/cricbuzz/PlayerBattingController.java +++ b/cricbuzz/PlayerBattingController.java @@ -43,5 +43,4 @@ public void setNonStriker(Player Player) { nonStriker = Player; } - } diff --git a/cricbuzz/PlayerBowlingController.java b/cricbuzz/PlayerBowlingController.java index 31bbeb64..fbf991f6 100644 --- a/cricbuzz/PlayerBowlingController.java +++ b/cricbuzz/PlayerBowlingController.java @@ -35,5 +35,4 @@ public void getNextBowler(int maxOverCountPerBowler) { public Player getCurrentBowler(){ return currentBowler; } - } diff --git a/cricbuzz/PlayerType.java b/cricbuzz/PlayerType.java index d7f407e0..0306e2ee 100644 --- a/cricbuzz/PlayerType.java +++ b/cricbuzz/PlayerType.java @@ -7,3 +7,4 @@ public enum PlayerType { ALLROUNDER, CAPTAIN } + diff --git a/cricbuzz/RunType.java b/cricbuzz/RunType.java index dfeb65c5..abf2a162 100644 --- a/cricbuzz/RunType.java +++ b/cricbuzz/RunType.java @@ -9,3 +9,4 @@ public enum RunType { SIX, WIDE_RUN } + diff --git a/cricbuzz/ScoreUpdaterObserver.java b/cricbuzz/ScoreUpdaterObserver.java index b9434086..5ad46a27 100644 --- a/cricbuzz/ScoreUpdaterObserver.java +++ b/cricbuzz/ScoreUpdaterObserver.java @@ -4,3 +4,4 @@ public interface ScoreUpdaterObserver { public void update(Balls ballDetails); } + diff --git a/cricbuzz/T20MatchType.java b/cricbuzz/T20MatchType.java index c243c2e9..bc5c8a52 100644 --- a/cricbuzz/T20MatchType.java +++ b/cricbuzz/T20MatchType.java @@ -12,3 +12,4 @@ public int maxOverCountBowlers() { } } + diff --git a/cricbuzz/Team.java b/cricbuzz/Team.java index 3e7ed0fa..057cfee3 100644 --- a/cricbuzz/Team.java +++ b/cricbuzz/Team.java @@ -78,5 +78,4 @@ public int getTotalRuns(){ } return totalRun; } - } diff --git a/cricbuzz/Wicket.java b/cricbuzz/Wicket.java index b9f92a18..4768bde7 100644 --- a/cricbuzz/Wicket.java +++ b/cricbuzz/Wicket.java @@ -15,3 +15,4 @@ public Wicket(WicketType wicketType, Player takenBy, Overs overDetail, Balls bal } } + diff --git a/cricbuzz/WicketType.java b/cricbuzz/WicketType.java index dae96d81..93673775 100644 --- a/cricbuzz/WicketType.java +++ b/cricbuzz/WicketType.java @@ -6,3 +6,4 @@ public enum WicketType { BOLD, CATCH; } + From 4d880933c5c214b03db2a377533224abb785ced5 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 01:06:47 +0530 Subject: [PATCH 06/15] flightbookingsystem lld --- flighbookingsystem/Airline.java | 1 + flighbookingsystem/Airport.java | 1 + flighbookingsystem/BookingDetail.java | 1 + flighbookingsystem/BookingSystem.java | 1 + flighbookingsystem/Flight.java | 1 + flighbookingsystem/FlightSeat.java | 1 + flighbookingsystem/Main.java | 1 - flighbookingsystem/Readme | 1 + flighbookingsystem/Schedule.java | 1 + flighbookingsystem/Seat.java | 1 + flighbookingsystem/Status.java | 1 + flighbookingsystem/User.java | 1 + 12 files changed, 11 insertions(+), 1 deletion(-) diff --git a/flighbookingsystem/Airline.java b/flighbookingsystem/Airline.java index a6b16624..7571b02b 100644 --- a/flighbookingsystem/Airline.java +++ b/flighbookingsystem/Airline.java @@ -28,3 +28,4 @@ public void setFlightList(List flightList) { this.flightList = flightList; } } + diff --git a/flighbookingsystem/Airport.java b/flighbookingsystem/Airport.java index 0acc94bc..554ed74b 100644 --- a/flighbookingsystem/Airport.java +++ b/flighbookingsystem/Airport.java @@ -13,3 +13,4 @@ public Airport(String name, String loc, List flightList) { this.flightList = flightList; } } + diff --git a/flighbookingsystem/BookingDetail.java b/flighbookingsystem/BookingDetail.java index 34b709a7..331a2fbf 100644 --- a/flighbookingsystem/BookingDetail.java +++ b/flighbookingsystem/BookingDetail.java @@ -10,3 +10,4 @@ public class BookingDetail { Date date; String pnr; } + diff --git a/flighbookingsystem/BookingSystem.java b/flighbookingsystem/BookingSystem.java index bc62415a..34ca3317 100644 --- a/flighbookingsystem/BookingSystem.java +++ b/flighbookingsystem/BookingSystem.java @@ -92,3 +92,4 @@ public List getAllBookings() { return bookingList; } } + diff --git a/flighbookingsystem/Flight.java b/flighbookingsystem/Flight.java index 46f0b1e3..b6423fe1 100644 --- a/flighbookingsystem/Flight.java +++ b/flighbookingsystem/Flight.java @@ -59,3 +59,4 @@ public List getSchedules() { return schedules; } } + diff --git a/flighbookingsystem/FlightSeat.java b/flighbookingsystem/FlightSeat.java index d8b5e473..ff1318c8 100644 --- a/flighbookingsystem/FlightSeat.java +++ b/flighbookingsystem/FlightSeat.java @@ -10,3 +10,4 @@ public FlightSeat(int price, Status status) { this.status = status; } } + diff --git a/flighbookingsystem/Main.java b/flighbookingsystem/Main.java index 6777a530..0ca1c6ba 100644 --- a/flighbookingsystem/Main.java +++ b/flighbookingsystem/Main.java @@ -75,5 +75,4 @@ public static void main(String[] args) { System.out.println("Booking Flight..."); // bookingSystem.bookingFlight(flight1, user); } - } diff --git a/flighbookingsystem/Readme b/flighbookingsystem/Readme index 376286a3..2223d40c 100644 --- a/flighbookingsystem/Readme +++ b/flighbookingsystem/Readme @@ -28,3 +28,4 @@ Entities: + diff --git a/flighbookingsystem/Schedule.java b/flighbookingsystem/Schedule.java index 4c59b63c..211a5de3 100644 --- a/flighbookingsystem/Schedule.java +++ b/flighbookingsystem/Schedule.java @@ -90,3 +90,4 @@ public List getFare() { return fare; } } + diff --git a/flighbookingsystem/Seat.java b/flighbookingsystem/Seat.java index eac61171..5a51481a 100644 --- a/flighbookingsystem/Seat.java +++ b/flighbookingsystem/Seat.java @@ -13,3 +13,4 @@ public Seat() { } } + diff --git a/flighbookingsystem/Status.java b/flighbookingsystem/Status.java index c47cf733..f2da5c75 100644 --- a/flighbookingsystem/Status.java +++ b/flighbookingsystem/Status.java @@ -7,3 +7,4 @@ public enum Status { BOOKED, OPEN } + diff --git a/flighbookingsystem/User.java b/flighbookingsystem/User.java index 3f44bd89..1b07da76 100644 --- a/flighbookingsystem/User.java +++ b/flighbookingsystem/User.java @@ -9,3 +9,4 @@ public User(String name, String email) { this.email = email; } } + From d01c1d45f335d07410300733eb61517695a9bc0a Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 01:15:39 +0530 Subject: [PATCH 07/15] librarymanagement lld --- librarymanagement/Book.java | 2 +- librarymanagement/BookCopy.java | 1 + librarymanagement/Library.java | 1 + librarymanagement/Main.java | 1 + librarymanagement/Rack.java | 2 +- librarymanagement/User.java | 1 + 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/librarymanagement/Book.java b/librarymanagement/Book.java index 8d18e180..c43f0bc6 100644 --- a/librarymanagement/Book.java +++ b/librarymanagement/Book.java @@ -34,4 +34,4 @@ public void search(String attribute, String value) { copies.forEach(BookCopy::printDetails); } } -} \ No newline at end of file +} diff --git a/librarymanagement/BookCopy.java b/librarymanagement/BookCopy.java index fe085a68..2a3aa2dc 100644 --- a/librarymanagement/BookCopy.java +++ b/librarymanagement/BookCopy.java @@ -46,3 +46,4 @@ public void printDetails() { System.out.println(copyId + " " + rack.getRackNumber()); } } + diff --git a/librarymanagement/Library.java b/librarymanagement/Library.java index 3b1d20ff..717e4daa 100644 --- a/librarymanagement/Library.java +++ b/librarymanagement/Library.java @@ -113,3 +113,4 @@ public void search(String attribute, String value) { books.values().forEach(book -> book.search(attribute, value)); } } + diff --git a/librarymanagement/Main.java b/librarymanagement/Main.java index b73710c9..f79847f4 100644 --- a/librarymanagement/Main.java +++ b/librarymanagement/Main.java @@ -86,3 +86,4 @@ private static void processCommand(String command) { } } } + diff --git a/librarymanagement/Rack.java b/librarymanagement/Rack.java index b9813492..70f5bc3f 100644 --- a/librarymanagement/Rack.java +++ b/librarymanagement/Rack.java @@ -27,4 +27,4 @@ public void removeBookCopy() { public BookCopy getBookCopy() { return bookCopy; } -} \ No newline at end of file +} diff --git a/librarymanagement/User.java b/librarymanagement/User.java index a92deaff..c6cf7e99 100644 --- a/librarymanagement/User.java +++ b/librarymanagement/User.java @@ -26,3 +26,4 @@ public List getBorrowedBooks() { return borrowedBooks; } } + From 205c7bb9f7908e8eb32aedae7c6415e734ff974d Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 01:17:04 +0530 Subject: [PATCH 08/15] meetingroom lld --- meetingroom/Calender.java | 1 + meetingroom/Interval.java | 1 - meetingroom/Location.java | 1 + meetingroom/MeetingRoom.java | 1 - meetingroom/MeetingRoomManager.java | 1 + meetingroom/MeetingScheduler.java | 1 + 6 files changed, 4 insertions(+), 2 deletions(-) diff --git a/meetingroom/Calender.java b/meetingroom/Calender.java index 04b642d9..227ca51f 100644 --- a/meetingroom/Calender.java +++ b/meetingroom/Calender.java @@ -13,3 +13,4 @@ public List getIntervalList() { return intervalList; } } + diff --git a/meetingroom/Interval.java b/meetingroom/Interval.java index 6dd2c5b3..bda645a1 100644 --- a/meetingroom/Interval.java +++ b/meetingroom/Interval.java @@ -38,5 +38,4 @@ public void setEnd(LocalTime end) { this.end = end; } - } diff --git a/meetingroom/Location.java b/meetingroom/Location.java index 62658693..ef98313c 100644 --- a/meetingroom/Location.java +++ b/meetingroom/Location.java @@ -26,3 +26,4 @@ public Location(int floorNo, int buildingNo) { int BuildingNo; } + diff --git a/meetingroom/MeetingRoom.java b/meetingroom/MeetingRoom.java index 2b4f5d8d..8d646012 100644 --- a/meetingroom/MeetingRoom.java +++ b/meetingroom/MeetingRoom.java @@ -92,5 +92,4 @@ public void bookRoom(int meetingRoomId, LocalTime start, LocalTime end, LocalDat System.out.println("Meeting room " + meetingRoomId + " booked successfully from " + start + " to " + end + " on " + date); } - } diff --git a/meetingroom/MeetingRoomManager.java b/meetingroom/MeetingRoomManager.java index 8ca0a5f5..3292680f 100644 --- a/meetingroom/MeetingRoomManager.java +++ b/meetingroom/MeetingRoomManager.java @@ -68,3 +68,4 @@ String bookMeetingRoom(int meetingRoomId, LocalTime start, LocalTime end, LocalD return "invalid meetingRoomId"; } } + diff --git a/meetingroom/MeetingScheduler.java b/meetingroom/MeetingScheduler.java index 16bc9182..9dc9ed0e 100644 --- a/meetingroom/MeetingScheduler.java +++ b/meetingroom/MeetingScheduler.java @@ -23,3 +23,4 @@ public static void main(String[] args) { // sendNotification(); } } + From cf42ddc61bf58c6cb5fd118a8768b481e83acbe7 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 01:20:41 +0530 Subject: [PATCH 09/15] parkinglot lld --- parkingLot/Account.java | 1 + parkingLot/AccountStatus.java | 1 + parkingLot/Address.java | 1 + parkingLot/Admin.java | 1 + parkingLot/Car.java | 1 + parkingLot/Cash.java | 1 + parkingLot/Compact.java | 1 + parkingLot/CreditCard.java | 1 + parkingLot/DisplayBoard.java | 1 + parkingLot/Entrance.java | 1 + parkingLot/Exit.java | 1 + parkingLot/Handicapped.java | 1 + parkingLot/Large.java | 1 + parkingLot/MotorVehicle.java | 1 + parkingLot/Motorcycle.java | 1 + parkingLot/ParkingAttendant.java | 1 + parkingLot/ParkingLot.java | 1 + parkingLot/ParkingRate.java | 1 + parkingLot/ParkingSpot.java | 1 + parkingLot/ParkingTicket.java | 1 + parkingLot/Payment.java | 1 + parkingLot/PaymentStatus.java | 1 + parkingLot/Person.java | 1 + parkingLot/Truck.java | 1 + parkingLot/Van.java | 1 + parkingLot/Vehicle.java | 1 + parkingLot/parkingLot.plantuml | 374 ------------------------------- 27 files changed, 26 insertions(+), 374 deletions(-) delete mode 100644 parkingLot/parkingLot.plantuml diff --git a/parkingLot/Account.java b/parkingLot/Account.java index 7ae06b75..d566f42e 100644 --- a/parkingLot/Account.java +++ b/parkingLot/Account.java @@ -11,3 +11,4 @@ public abstract class Account { // Getters and Setters // ... } + diff --git a/parkingLot/AccountStatus.java b/parkingLot/AccountStatus.java index 47cce256..3d9c6da2 100644 --- a/parkingLot/AccountStatus.java +++ b/parkingLot/AccountStatus.java @@ -7,3 +7,4 @@ enum AccountStatus { BLACKLISTED, NONE } + diff --git a/parkingLot/Address.java b/parkingLot/Address.java index 5005f99a..427cfb54 100644 --- a/parkingLot/Address.java +++ b/parkingLot/Address.java @@ -10,3 +10,4 @@ public class Address { // Getters and Setters // ... } + diff --git a/parkingLot/Admin.java b/parkingLot/Admin.java index 5719c5b7..0953ca66 100644 --- a/parkingLot/Admin.java +++ b/parkingLot/Admin.java @@ -26,3 +26,4 @@ public boolean resetPassword() { return true; } } + diff --git a/parkingLot/Car.java b/parkingLot/Car.java index 3e867c9e..983b79da 100644 --- a/parkingLot/Car.java +++ b/parkingLot/Car.java @@ -5,3 +5,4 @@ public void assignTicket(ParkingTicket ticket) { // Logic to assign a ticket to the car } } + diff --git a/parkingLot/Cash.java b/parkingLot/Cash.java index 604b9ecb..9ebe8f32 100644 --- a/parkingLot/Cash.java +++ b/parkingLot/Cash.java @@ -6,3 +6,4 @@ public boolean initiateTransaction() { return true; } } + diff --git a/parkingLot/Compact.java b/parkingLot/Compact.java index 419393e0..4592b077 100644 --- a/parkingLot/Compact.java +++ b/parkingLot/Compact.java @@ -6,3 +6,4 @@ public boolean assignVehicle(Vehicle vehicle) { return true; } } + diff --git a/parkingLot/CreditCard.java b/parkingLot/CreditCard.java index 638e01df..2319635b 100644 --- a/parkingLot/CreditCard.java +++ b/parkingLot/CreditCard.java @@ -6,3 +6,4 @@ public boolean initiateTransaction() { return true; } } + diff --git a/parkingLot/DisplayBoard.java b/parkingLot/DisplayBoard.java index a1958686..3675d3dc 100644 --- a/parkingLot/DisplayBoard.java +++ b/parkingLot/DisplayBoard.java @@ -24,3 +24,4 @@ public void showFreeSlot() { // Getters and Setters // ... } + diff --git a/parkingLot/Entrance.java b/parkingLot/Entrance.java index c29f7a20..d8f629af 100644 --- a/parkingLot/Entrance.java +++ b/parkingLot/Entrance.java @@ -11,3 +11,4 @@ public ParkingTicket getTicket() { // Getters and Setters // ... } + diff --git a/parkingLot/Exit.java b/parkingLot/Exit.java index 8256bc84..ceff5b0e 100644 --- a/parkingLot/Exit.java +++ b/parkingLot/Exit.java @@ -10,3 +10,4 @@ public void validateTicket(ParkingTicket ticket) { // Getters and Setters // ... } + diff --git a/parkingLot/Handicapped.java b/parkingLot/Handicapped.java index 0fd76fc2..63703b28 100644 --- a/parkingLot/Handicapped.java +++ b/parkingLot/Handicapped.java @@ -6,3 +6,4 @@ public boolean assignVehicle(Vehicle vehicle) { return true; } } + diff --git a/parkingLot/Large.java b/parkingLot/Large.java index 47b01059..f368d369 100644 --- a/parkingLot/Large.java +++ b/parkingLot/Large.java @@ -6,3 +6,4 @@ public boolean assignVehicle(Vehicle vehicle) { return true; } } + diff --git a/parkingLot/MotorVehicle.java b/parkingLot/MotorVehicle.java index d7845b3c..dfe58d81 100644 --- a/parkingLot/MotorVehicle.java +++ b/parkingLot/MotorVehicle.java @@ -5,3 +5,4 @@ public void assignTicket(ParkingTicket ticket) { // Logic to assign a ticket to the motorcycle } } + diff --git a/parkingLot/Motorcycle.java b/parkingLot/Motorcycle.java index 64ec1052..509d93c7 100644 --- a/parkingLot/Motorcycle.java +++ b/parkingLot/Motorcycle.java @@ -6,3 +6,4 @@ public boolean assignVehicle(Vehicle vehicle) { return true; } } + diff --git a/parkingLot/ParkingAttendant.java b/parkingLot/ParkingAttendant.java index 9af6f61b..bbbb1be2 100644 --- a/parkingLot/ParkingAttendant.java +++ b/parkingLot/ParkingAttendant.java @@ -11,3 +11,4 @@ public boolean resetPassword() { return true; } } + diff --git a/parkingLot/ParkingLot.java b/parkingLot/ParkingLot.java index 5db08f70..cdcf6d22 100644 --- a/parkingLot/ParkingLot.java +++ b/parkingLot/ParkingLot.java @@ -51,3 +51,4 @@ public boolean isFull(ParkingSpot type) { // Getters and Setters // ... } + diff --git a/parkingLot/ParkingRate.java b/parkingLot/ParkingRate.java index 988ace0b..2bad4bbf 100644 --- a/parkingLot/ParkingRate.java +++ b/parkingLot/ParkingRate.java @@ -11,3 +11,4 @@ public void calculate() { // Getters and Setters // ... } + diff --git a/parkingLot/ParkingSpot.java b/parkingLot/ParkingSpot.java index 1a918f40..9c98a22a 100644 --- a/parkingLot/ParkingSpot.java +++ b/parkingLot/ParkingSpot.java @@ -20,3 +20,4 @@ public boolean removeVehicle() { // Getters and Setters // ... } + diff --git a/parkingLot/ParkingTicket.java b/parkingLot/ParkingTicket.java index 96b4ea2d..cc8ed4c5 100644 --- a/parkingLot/ParkingTicket.java +++ b/parkingLot/ParkingTicket.java @@ -17,3 +17,4 @@ public class ParkingTicket { // Getters and Setters // ... } + diff --git a/parkingLot/Payment.java b/parkingLot/Payment.java index 80a9fb1b..9aceb50e 100644 --- a/parkingLot/Payment.java +++ b/parkingLot/Payment.java @@ -12,3 +12,4 @@ public abstract class Payment { // Getters and Setters // ... } + diff --git a/parkingLot/PaymentStatus.java b/parkingLot/PaymentStatus.java index 78d5b7f9..f70819a7 100644 --- a/parkingLot/PaymentStatus.java +++ b/parkingLot/PaymentStatus.java @@ -7,3 +7,4 @@ enum PaymentStatus { UNPAID, REFUNDED } + diff --git a/parkingLot/Person.java b/parkingLot/Person.java index 321e5422..0e3c3df5 100644 --- a/parkingLot/Person.java +++ b/parkingLot/Person.java @@ -9,3 +9,4 @@ public class Person { // Getters and Setters // ... } + diff --git a/parkingLot/Truck.java b/parkingLot/Truck.java index 54ccace6..7514182a 100644 --- a/parkingLot/Truck.java +++ b/parkingLot/Truck.java @@ -5,3 +5,4 @@ public void assignTicket(ParkingTicket ticket) { // Logic to assign a ticket to the truck } } + diff --git a/parkingLot/Van.java b/parkingLot/Van.java index b3c0318d..48d7007d 100644 --- a/parkingLot/Van.java +++ b/parkingLot/Van.java @@ -5,3 +5,4 @@ public void assignTicket(ParkingTicket ticket) { // Logic to assign a ticket to the van } } + diff --git a/parkingLot/Vehicle.java b/parkingLot/Vehicle.java index 9907fd2b..8afd5aca 100644 --- a/parkingLot/Vehicle.java +++ b/parkingLot/Vehicle.java @@ -8,3 +8,4 @@ public abstract class Vehicle { // Getters and Setters // ... } + diff --git a/parkingLot/parkingLot.plantuml b/parkingLot/parkingLot.plantuml deleted file mode 100644 index ae473ec4..00000000 --- a/parkingLot/parkingLot.plantuml +++ /dev/null @@ -1,374 +0,0 @@ -@startuml - -title __PARKINGLOT's Class Diagram__\n - - namespace { - namespace ld { - namespace parkingLot { - abstract class lld.parkingLot.Account { - - password : String - - userName : String - {abstract} + resetPassword() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - enum AccountStatus { - ACTIVE - BLACKLISTED - CANCELED - CLOSED - NONE - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Address { - - address : String - - city : String - - country : String - - state : String - - zipCode : int - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Admin { - + addDisplayBoard() - + addEntrance() - + addExit() - + addParkingSpot() - + resetPassword() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Car { - + assignTicket() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Cash { - + initiateTransaction() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Compact { - + assignVehicle() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.CreditCard { - + initiateTransaction() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.DisplayBoard { - - id : int - - parkingSpots : Map> - + DisplayBoard() - + addParkingSpot() - + showFreeSlot() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Entrance { - - id : int - + getTicket() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Exit { - - id : int - + validateTicket() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Handicapped { - + assignVehicle() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Large { - + assignVehicle() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.MotorVehicle { - + assignTicket() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Motorcycle { - + assignVehicle() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.ParkingAttendant { - + processTicket() - + resetPassword() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.ParkingLot { - - address : String - - entrance : HashMap - - exit : HashMap - - id : int - - name : String - {static} - parkingLot : ParkingLot - - tickets : HashMap - + addEntrance() - + addExit() - {static} + getInstance() - + getParkingTicket() - + isFull() - - ParkingLot() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.ParkingRate { - - hours : double - - rate : double - + calculate() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - abstract class lld.parkingLot.ParkingSpot { - - id : int - - isFree : boolean - {abstract} + assignVehicle() - + getIsFree() - + removeVehicle() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.ParkingTicket { - - amount : double - - exit : Date - - status : boolean - - ticketNo : int - - timestamp : Date - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - abstract class lld.parkingLot.Payment { - - amount : double - - timestamp : Date - {abstract} + initiateTransaction() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - enum PaymentStatus { - COMPLETED - FAILED - PENDING - REFUNDED - UNPAID - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Person { - - address : String - - email : String - - name : String - - phone : String - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Truck { - + assignTicket() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - class lld.parkingLot.Van { - + assignTicket() - } - } - } - } - - - namespace { - namespace ld { - namespace parkingLot { - abstract class lld.parkingLot.Vehicle { - - licenseNo : int - {abstract} + assignTicket() - } - } - } - } - - - lld.parkingLot.Account o-- lld.parkingLot.Person : person - lld.parkingLot.Account o-- lld.parkingLot.AccountStatus : status - lld.parkingLot.Admin -up-|> lld.parkingLot.Account - lld.parkingLot.Car -up-|> lld.parkingLot.Vehicle - lld.parkingLot.Cash -up-|> lld.parkingLot.Payment - lld.parkingLot.Compact -up-|> lld.parkingLot.ParkingSpot - lld.parkingLot.CreditCard -up-|> lld.parkingLot.Payment - lld.parkingLot.Handicapped -up-|> lld.parkingLot.ParkingSpot - lld.parkingLot.Large -up-|> lld.parkingLot.ParkingSpot - lld.parkingLot.MotorVehicle -up-|> lld.parkingLot.Vehicle - lld.parkingLot.Motorcycle -up-|> lld.parkingLot.ParkingSpot - lld.parkingLot.ParkingAttendant -up-|> lld.parkingLot.Account - lld.parkingLot.ParkingLot o-- lld.parkingLot.ParkingRate : parkingRate - lld.parkingLot.ParkingSpot o-- lld.parkingLot.Vehicle : vehicle - lld.parkingLot.ParkingTicket o-- lld.parkingLot.Entrance : entrance - lld.parkingLot.ParkingTicket o-- lld.parkingLot.Exit : exitIns - lld.parkingLot.ParkingTicket o-- lld.parkingLot.Payment : payment - lld.parkingLot.ParkingTicket o-- lld.parkingLot.Vehicle : vehicle - lld.parkingLot.Payment o-- lld.parkingLot.PaymentStatus : status - lld.parkingLot.Truck -up-|> lld.parkingLot.Vehicle - lld.parkingLot.Van -up-|> lld.parkingLot.Vehicle - - -right footer - - -PlantUML diagram generated by SketchIt! (https://bitbucket.org/pmesmeur/sketch.it) -For more information about this tool, please contact philippe.mesmeur@gmail.com -endfooter - -@enduml From d63f8edc43c9fea4a97dc67bae7452ef144f0343 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Sun, 24 Nov 2024 01:23:30 +0530 Subject: [PATCH 10/15] splitwise lld --- splitwise/Balance.java | 1 + splitwise/BalanceSheetController.java | 1 - splitwise/EqualExpenseSplit.java | 1 + splitwise/Expense.java | 1 + splitwise/ExpenseController.java | 2 +- splitwise/ExpenseSplit.java | 1 + splitwise/ExpenseSplitType.java | 1 + splitwise/Group.java | 1 + splitwise/GroupController.java | 1 - splitwise/Main.java | 1 - splitwise/PercentageExpenseSplit.java | 1 - splitwise/SplitDetails.java | 1 - splitwise/SplitFactory.java | 1 + splitwise/SplitWise.java | 1 - splitwise/UnequalExpenseSplit.java | 2 -- splitwise/User.java | 1 - splitwise/UserController.java | 1 + splitwise/UserExpenseBalanceSheet.java | 1 + 18 files changed, 10 insertions(+), 10 deletions(-) diff --git a/splitwise/Balance.java b/splitwise/Balance.java index a4530791..99ad5e4e 100644 --- a/splitwise/Balance.java +++ b/splitwise/Balance.java @@ -21,3 +21,4 @@ public void setAmountGetBack(double amountGetBack) { } } + diff --git a/splitwise/BalanceSheetController.java b/splitwise/BalanceSheetController.java index 8bcd1bed..cb651605 100644 --- a/splitwise/BalanceSheetController.java +++ b/splitwise/BalanceSheetController.java @@ -77,5 +77,4 @@ public void showBalanceSheetOfUser(User user){ System.out.println("---------------------------------------"); } - } diff --git a/splitwise/EqualExpenseSplit.java b/splitwise/EqualExpenseSplit.java index 3185bc48..23aa41e7 100644 --- a/splitwise/EqualExpenseSplit.java +++ b/splitwise/EqualExpenseSplit.java @@ -16,3 +16,4 @@ public void validateSplitRequest(List splitList, double totalAmoun } } } + diff --git a/splitwise/Expense.java b/splitwise/Expense.java index 94e47697..04fd6afb 100644 --- a/splitwise/Expense.java +++ b/splitwise/Expense.java @@ -27,3 +27,4 @@ public Expense(String expenseId, String description, double expenseAmount, User this.splitDetails.addAll(splitDetails); } } + diff --git a/splitwise/ExpenseController.java b/splitwise/ExpenseController.java index 4321f5c8..58359d83 100644 --- a/splitwise/ExpenseController.java +++ b/splitwise/ExpenseController.java @@ -22,4 +22,4 @@ public Expense createExpense(String expenseId, String description, double expens return expense; } -} \ No newline at end of file +} diff --git a/splitwise/ExpenseSplit.java b/splitwise/ExpenseSplit.java index 79a6b8fe..a38f1064 100644 --- a/splitwise/ExpenseSplit.java +++ b/splitwise/ExpenseSplit.java @@ -7,3 +7,4 @@ public interface ExpenseSplit { public void validateSplitRequest(List splitList, double totalAmount); } + diff --git a/splitwise/ExpenseSplitType.java b/splitwise/ExpenseSplitType.java index 72d13df9..5b57188d 100644 --- a/splitwise/ExpenseSplitType.java +++ b/splitwise/ExpenseSplitType.java @@ -6,3 +6,4 @@ public enum ExpenseSplitType { UNEQUAL, PERCENTAGE } + diff --git a/splitwise/Group.java b/splitwise/Group.java index c9af584d..a381898e 100644 --- a/splitwise/Group.java +++ b/splitwise/Group.java @@ -45,3 +45,4 @@ public Expense createExpense(String expenseId, String description, double expens } } + diff --git a/splitwise/GroupController.java b/splitwise/GroupController.java index 647ca262..c63da801 100644 --- a/splitwise/GroupController.java +++ b/splitwise/GroupController.java @@ -36,6 +36,5 @@ public Group getGroup(String groupId){ } return null; } - } diff --git a/splitwise/Main.java b/splitwise/Main.java index 785dbfb3..7c46a390 100644 --- a/splitwise/Main.java +++ b/splitwise/Main.java @@ -6,5 +6,4 @@ public static void main(String args[]){ SplitWise splitwise = new SplitWise(); splitwise.demo(); } - } diff --git a/splitwise/PercentageExpenseSplit.java b/splitwise/PercentageExpenseSplit.java index 3ebfa6cb..54ef3591 100644 --- a/splitwise/PercentageExpenseSplit.java +++ b/splitwise/PercentageExpenseSplit.java @@ -8,5 +8,4 @@ public void validateSplitRequest(List splitList, double totalAmoun } - } diff --git a/splitwise/SplitDetails.java b/splitwise/SplitDetails.java index 0f0ab664..23bc8778 100644 --- a/splitwise/SplitDetails.java +++ b/splitwise/SplitDetails.java @@ -27,5 +27,4 @@ public void setAmountOwe(double amountOwe) { this.amountOwe = amountOwe; } - } diff --git a/splitwise/SplitFactory.java b/splitwise/SplitFactory.java index 95d08ad3..13e2c68e 100644 --- a/splitwise/SplitFactory.java +++ b/splitwise/SplitFactory.java @@ -16,3 +16,4 @@ public static ExpenseSplit getSplitObject(ExpenseSplitType splitType) { } } } + diff --git a/splitwise/SplitWise.java b/splitwise/SplitWise.java index 979bed12..3b06581f 100644 --- a/splitwise/SplitWise.java +++ b/splitwise/SplitWise.java @@ -9,7 +9,6 @@ public class SplitWise { GroupController groupController; BalanceSheetController balanceSheetController; - SplitWise(){ userController = new UserController(); groupController = new GroupController(); diff --git a/splitwise/UnequalExpenseSplit.java b/splitwise/UnequalExpenseSplit.java index f204dfbd..7711d4e7 100644 --- a/splitwise/UnequalExpenseSplit.java +++ b/splitwise/UnequalExpenseSplit.java @@ -10,7 +10,5 @@ public void validateSplitRequest(List splitList, double totalAmoun } - - } diff --git a/splitwise/User.java b/splitwise/User.java index 24fd4983..15f404d6 100644 --- a/splitwise/User.java +++ b/splitwise/User.java @@ -17,5 +17,4 @@ public String getUserId() { public UserExpenseBalanceSheet getUserExpenseBalanceSheet() { return userExpenseBalanceSheet; } - } diff --git a/splitwise/UserController.java b/splitwise/UserController.java index 78b48223..47114cd2 100644 --- a/splitwise/UserController.java +++ b/splitwise/UserController.java @@ -30,3 +30,4 @@ public List getAllUsers(){ return userList; } } + diff --git a/splitwise/UserExpenseBalanceSheet.java b/splitwise/UserExpenseBalanceSheet.java index a0ea59ee..840c188f 100644 --- a/splitwise/UserExpenseBalanceSheet.java +++ b/splitwise/UserExpenseBalanceSheet.java @@ -57,3 +57,4 @@ public void setTotalPayment(double totalPayment) { } } + From 8608b96fb38e6a94351d89c16331abdcb3bb3bb8 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Tue, 20 May 2025 00:26:14 +0530 Subject: [PATCH 11/15] caching system --- cache/pom.xml | 25 ++++++ cache/src/main/java/org/example/Cache.java | 60 ++++++++++++++ .../cache/policies/DoublyLinkedList.java | 82 +++++++++++++++++++ .../cache/policies/DoublyLinkedListNode.java | 16 ++++ .../cache/policies/EvictionPolicy.java | 8 ++ .../cache/policies/LRUEvictionPolicy.java | 35 ++++++++ .../example/cache/storage/HashMapStorage.java | 38 +++++++++ .../org/example/cache/storage/Storage.java | 7 ++ 8 files changed, 271 insertions(+) create mode 100644 cache/pom.xml create mode 100644 cache/src/main/java/org/example/Cache.java create mode 100644 cache/src/main/java/org/example/cache/policies/DoublyLinkedList.java create mode 100644 cache/src/main/java/org/example/cache/policies/DoublyLinkedListNode.java create mode 100644 cache/src/main/java/org/example/cache/policies/EvictionPolicy.java create mode 100644 cache/src/main/java/org/example/cache/policies/LRUEvictionPolicy.java create mode 100644 cache/src/main/java/org/example/cache/storage/HashMapStorage.java create mode 100644 cache/src/main/java/org/example/cache/storage/Storage.java diff --git a/cache/pom.xml b/cache/pom.xml new file mode 100644 index 00000000..c18b9983 --- /dev/null +++ b/cache/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.example + cache + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + \ No newline at end of file diff --git a/cache/src/main/java/org/example/Cache.java b/cache/src/main/java/org/example/Cache.java new file mode 100644 index 00000000..61581a01 --- /dev/null +++ b/cache/src/main/java/org/example/Cache.java @@ -0,0 +1,60 @@ +package org.example; + +import org.example.cache.policies.LRUEvictionPolicy; +import org.example.cache.storage.HashMapStorage; +import org.example.cache.storage.Storage; +import org.example.cache.policies.EvictionPolicy; +import org.example.cache.storage.Storage; +public class Cache { + Storage storage; + EvictionPolicy evictionPolicy; + + public Cache(EvictionPolicy evictionPolicy, Storage storage) { + this.evictionPolicy = evictionPolicy; + this.storage = storage; + } + + void put(Key k , Value v){ + try{ + this.storage.add(k,v); + this.evictionPolicy.keyAccessed(k); + } + catch (Exception e){ + Key keyToRemove = evictionPolicy.evictKey(); + if(keyToRemove == null){ + throw new RuntimeException(); + } + this.storage.remove(keyToRemove); + put(k,v); + } + } + + public Value get(Key k){ + try { + Value value = this.storage.get(k); + this.evictionPolicy.keyAccessed(k); + return value; + } catch (RuntimeException e) { + return null; + } + } + + public static void main(String[] args) { + // Create eviction policy and storage + EvictionPolicy evictionPolicy = new LRUEvictionPolicy(); + Storage storage = new HashMapStorage<>(2); // Capacity 2 + + // Create Cache instance + Cache cache = new Cache<>(evictionPolicy, storage); + + // Test put and get + cache.put("1", "one"); + cache.put("2", "two"); + + System.out.println("Get 1: " + cache.get("1")); // Access 1 to mark as recently used + cache.put("3", "three"); // This should evict "2" + + System.out.println("Get 2 (should be null): " + cache.get("2")); + System.out.println("Get 3: " + cache.get("3")); + } +} \ No newline at end of file diff --git a/cache/src/main/java/org/example/cache/policies/DoublyLinkedList.java b/cache/src/main/java/org/example/cache/policies/DoublyLinkedList.java new file mode 100644 index 00000000..f1e205a1 --- /dev/null +++ b/cache/src/main/java/org/example/cache/policies/DoublyLinkedList.java @@ -0,0 +1,82 @@ +package org.example.cache.policies; + +import java.util.NoSuchElementException; + +public class DoublyLinkedList { + + DoublyLinkedListNode dummyHead; + DoublyLinkedListNode dummyTail; + + public DoublyLinkedList() { + // We can instantiate these by null, since we are never gonna use val for these dummyNodes + dummyHead = new DoublyLinkedListNode<>(null); + dummyTail = new DoublyLinkedListNode<>(null); + + // Also Initially there are no items + // so just join dummyHead and Tail, we can add items in between them easily. + dummyHead.next = dummyTail; + dummyTail.prev = dummyHead; + } + + /** + * Method to detach a random node from the doubly linked list. The node itself will not be removed from the memory. + * Just that it will be removed from the list and becomes orphaned. + * + * @param node Node to be detached. + */ + public void detachNode(DoublyLinkedListNode node) { + // Just Simply modifying the pointers. + if (node != null) { + node.prev.next = node.next; + node.next.prev = node.prev; + } + } + + /** + * Helper method to add a node at the end of the list. + * + * @param node Node to be added. + */ + public void addNodeAtLast(DoublyLinkedListNode node) { + DoublyLinkedListNode tailPrev = dummyTail.prev; + tailPrev.next = node; + node.next = dummyTail; + dummyTail.prev = node; + node.prev = tailPrev; + } + + /** + * Helper method to add an element at the end. + * + * @param element Element to be added. + * @return Reference to new node created for the element. + */ + public DoublyLinkedListNode addElementAtLast(E element) { + if (element == null) { + throw new RuntimeException(); + } + DoublyLinkedListNode newNode = new DoublyLinkedListNode<>(element); + addNodeAtLast(newNode); + return newNode; + } + + public boolean isItemPresent() { + return dummyHead.next != dummyTail; + } + + public DoublyLinkedListNode getFirstNode() throws NoSuchElementException { + DoublyLinkedListNode item = null; + if (!isItemPresent()) { + return null; + } + return dummyHead.next; + } + + public DoublyLinkedListNode getLastNode() throws NoSuchElementException { + DoublyLinkedListNode item = null; + if (!isItemPresent()) { + return null; + } + return dummyTail.prev; + } +} \ No newline at end of file diff --git a/cache/src/main/java/org/example/cache/policies/DoublyLinkedListNode.java b/cache/src/main/java/org/example/cache/policies/DoublyLinkedListNode.java new file mode 100644 index 00000000..40440653 --- /dev/null +++ b/cache/src/main/java/org/example/cache/policies/DoublyLinkedListNode.java @@ -0,0 +1,16 @@ +package org.example.cache.policies; + +import lombok.Getter; + +@Getter +public class DoublyLinkedListNode { + DoublyLinkedListNode next; + DoublyLinkedListNode prev; + E element; + + public DoublyLinkedListNode(E element) { + this.element = element; + this.next = null; + this.prev = null; + } +} \ No newline at end of file diff --git a/cache/src/main/java/org/example/cache/policies/EvictionPolicy.java b/cache/src/main/java/org/example/cache/policies/EvictionPolicy.java new file mode 100644 index 00000000..1bbb4a4b --- /dev/null +++ b/cache/src/main/java/org/example/cache/policies/EvictionPolicy.java @@ -0,0 +1,8 @@ +package org.example.cache.policies; + +public interface EvictionPolicy { + + void keyAccessed(Key key); + + Key evictKey(); +} diff --git a/cache/src/main/java/org/example/cache/policies/LRUEvictionPolicy.java b/cache/src/main/java/org/example/cache/policies/LRUEvictionPolicy.java new file mode 100644 index 00000000..816ff9bb --- /dev/null +++ b/cache/src/main/java/org/example/cache/policies/LRUEvictionPolicy.java @@ -0,0 +1,35 @@ +package org.example.cache.policies; + +import java.util.HashMap; +import java.util.Map; + +public class LRUEvictionPolicy implements EvictionPolicy{ + private DoublyLinkedList dll; + private Map> mapper; + + public LRUEvictionPolicy() { + this.dll = new DoublyLinkedList<>(); + this.mapper = new HashMap<>(); + } + + @Override + public void keyAccessed(Key key) { + if (mapper.containsKey(key)) { + dll.detachNode(mapper.get(key)); + dll.addNodeAtLast(mapper.get(key)); + } else { + DoublyLinkedListNode newNode = dll.addElementAtLast(key); + mapper.put(key, newNode); + } + } + + @Override + public Key evictKey() { + DoublyLinkedListNode first = dll.getFirstNode(); + if(first == null) { + return null; + } + dll.detachNode(first); + return first.getElement(); + } +} diff --git a/cache/src/main/java/org/example/cache/storage/HashMapStorage.java b/cache/src/main/java/org/example/cache/storage/HashMapStorage.java new file mode 100644 index 00000000..e67721f8 --- /dev/null +++ b/cache/src/main/java/org/example/cache/storage/HashMapStorage.java @@ -0,0 +1,38 @@ +package org.example.cache.storage; + + +import java.util.HashMap; +import java.util.Map; + +public class HashMapStorage implements Storage { + Map storage; + private final Integer capacity; + + public HashMapStorage(Integer capacity) { + this.capacity = capacity; + storage = new HashMap<>(); + } + + @Override + public void add(Key k, Value v) { + if(storage.size()==capacity) + throw new RuntimeException("Cache is Full"); + else + storage.put(k,v); + } + + @Override + public Value get(Key k) { + if(!storage.containsKey(k)) + { + throw new RuntimeException("Key is not available"); + } + return storage.get(k); + + } + + @Override + public void remove(Object k) { + storage.remove(k); + } +} diff --git a/cache/src/main/java/org/example/cache/storage/Storage.java b/cache/src/main/java/org/example/cache/storage/Storage.java new file mode 100644 index 00000000..cc53172f --- /dev/null +++ b/cache/src/main/java/org/example/cache/storage/Storage.java @@ -0,0 +1,7 @@ +package org.example.cache.storage; + +public interface Storage { + void add(Key k , Value v); + Value get(Key k); + void remove(Key k); +} From 7c986ff2aa63fb5dbe470de5235c6dba533f5b8e Mon Sep 17 00:00:00 2001 From: VAMSI Date: Tue, 20 May 2025 00:43:12 +0530 Subject: [PATCH 12/15] caching system --- cache/src/main/java/org/example/Cache.java | 99 +++++++++++-------- .../java/org/example/KeyBasedExecutor.java | 37 +++++++ 2 files changed, 96 insertions(+), 40 deletions(-) create mode 100644 cache/src/main/java/org/example/KeyBasedExecutor.java diff --git a/cache/src/main/java/org/example/Cache.java b/cache/src/main/java/org/example/Cache.java index 61581a01..8b5dbf30 100644 --- a/cache/src/main/java/org/example/Cache.java +++ b/cache/src/main/java/org/example/Cache.java @@ -4,57 +4,76 @@ import org.example.cache.storage.HashMapStorage; import org.example.cache.storage.Storage; import org.example.cache.policies.EvictionPolicy; -import org.example.cache.storage.Storage; + +import java.util.concurrent.CompletableFuture; + public class Cache { - Storage storage; - EvictionPolicy evictionPolicy; + private final Storage storage; + private final EvictionPolicy evictionPolicy; + private final KeyBasedExecutor executor; - public Cache(EvictionPolicy evictionPolicy, Storage storage) { + public Cache(EvictionPolicy evictionPolicy, Storage storage, int threadCount) { this.evictionPolicy = evictionPolicy; this.storage = storage; + this.executor = new KeyBasedExecutor(threadCount); + } + + public CompletableFuture putAsync(Key k, Value v) { + CompletableFuture future = new CompletableFuture<>(); + executor.submit(k, () -> { + try { + storage.add(k, v); + evictionPolicy.keyAccessed(k); + future.complete(null); + } catch (Exception e) { + Key keyToRemove = evictionPolicy.evictKey(); + if (keyToRemove == null) { + future.completeExceptionally(new RuntimeException("Eviction failed")); + return; + } + storage.remove(keyToRemove); + // Retry after eviction + putAsync(k, v).thenAccept(future::complete) + .exceptionally(ex -> { future.completeExceptionally(ex); return null; }); + } + }); + return future; + } + + public CompletableFuture getAsync(Key k) { + CompletableFuture future = new CompletableFuture<>(); + executor.submit(k, () -> { + try { + Value value = storage.get(k); + evictionPolicy.keyAccessed(k); + future.complete(value); + } catch (RuntimeException e) { + future.complete(null); // key not present + } + }); + return future; + } + + public void shutdown() { + executor.shutdown(); } - void put(Key k , Value v){ - try{ - this.storage.add(k,v); - this.evictionPolicy.keyAccessed(k); - } - catch (Exception e){ - Key keyToRemove = evictionPolicy.evictKey(); - if(keyToRemove == null){ - throw new RuntimeException(); - } - this.storage.remove(keyToRemove); - put(k,v); - } - } - - public Value get(Key k){ - try { - Value value = this.storage.get(k); - this.evictionPolicy.keyAccessed(k); - return value; - } catch (RuntimeException e) { - return null; - } - } public static void main(String[] args) { - // Create eviction policy and storage - EvictionPolicy evictionPolicy = new LRUEvictionPolicy(); - Storage storage = new HashMapStorage<>(2); // Capacity 2 + EvictionPolicy evictionPolicy = new LRUEvictionPolicy<>(); + Storage storage = new HashMapStorage<>(2); + + Cache cache = new Cache<>(evictionPolicy, storage, 4); // 4 threads - // Create Cache instance - Cache cache = new Cache<>(evictionPolicy, storage); + cache.putAsync("1", "one").join(); + cache.putAsync("2", "two").join(); - // Test put and get - cache.put("1", "one"); - cache.put("2", "two"); + cache.getAsync("1").thenAccept(v -> System.out.println("Get 1: " + v)).join(); + cache.putAsync("3", "three").join(); // Should evict key "2" - System.out.println("Get 1: " + cache.get("1")); // Access 1 to mark as recently used - cache.put("3", "three"); // This should evict "2" + cache.getAsync("2").thenAccept(v -> System.out.println("Get 2 (should be null): " + v)).join(); + cache.getAsync("3").thenAccept(v -> System.out.println("Get 3: " + v)).join(); - System.out.println("Get 2 (should be null): " + cache.get("2")); - System.out.println("Get 3: " + cache.get("3")); + cache.shutdown(); } } \ No newline at end of file diff --git a/cache/src/main/java/org/example/KeyBasedExecutor.java b/cache/src/main/java/org/example/KeyBasedExecutor.java new file mode 100644 index 00000000..30666735 --- /dev/null +++ b/cache/src/main/java/org/example/KeyBasedExecutor.java @@ -0,0 +1,37 @@ +package org.example; + + +import java.util.concurrent.*; + +public class KeyBasedExecutor { + private final int numThreads; + private final ExecutorService[] executors; + + public KeyBasedExecutor(int numThreads) { + this.numThreads = numThreads; + this.executors = new ExecutorService[numThreads]; + for (int i = 0; i < numThreads; i++) { + executors[i] = Executors.newSingleThreadExecutor(); + } + } + + private int getExecutorIndex(Object key) { + return Math.abs(key.hashCode() % numThreads); + } + + public void submit(Object key, Runnable task) { + int index = getExecutorIndex(key); + executors[index].submit(task); + } + + public Future submit(Object key, Callable task) { + int index = getExecutorIndex(key); + return executors[index].submit(task); + } + + public void shutdown() { + for (ExecutorService executor : executors) { + executor.shutdown(); + } + } +} From c61ad4ecd4b8d2d407ac599c42baa7e93fc79186 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Tue, 28 Oct 2025 22:21:03 +0530 Subject: [PATCH 13/15] Deck of cards --- DeckOfCards/Card.java | 19 +++++++++++ DeckOfCards/Deck.java | 75 +++++++++++++++++++++++++++++++++++++++++++ DeckOfCards/Main.java | 33 +++++++++++++++++++ DeckOfCards/Rank.java | 6 ++++ DeckOfCards/Suit.java | 17 ++++++++++ 5 files changed, 150 insertions(+) create mode 100644 DeckOfCards/Card.java create mode 100644 DeckOfCards/Deck.java create mode 100644 DeckOfCards/Main.java create mode 100644 DeckOfCards/Rank.java create mode 100644 DeckOfCards/Suit.java diff --git a/DeckOfCards/Card.java b/DeckOfCards/Card.java new file mode 100644 index 00000000..ea153154 --- /dev/null +++ b/DeckOfCards/Card.java @@ -0,0 +1,19 @@ +package DeckOfCards; + + + + +public class Card { + private Suit suit; + private Rank rank; + + public Card(Suit suit, Rank rank) { + this.suit = suit; + this.rank = rank; + } + + @Override + public String toString() { + return rank + " of " + suit; + } +} diff --git a/DeckOfCards/Deck.java b/DeckOfCards/Deck.java new file mode 100644 index 00000000..ccc82772 --- /dev/null +++ b/DeckOfCards/Deck.java @@ -0,0 +1,75 @@ +package DeckOfCards; + +import java.util.*; + +public class Deck { + private Stack cards; + + public Deck(int numberOfDecks) { + cards = new Stack<>(); + createDeck(numberOfDecks); + } + + private void createDeck(int numberOfDecks) { + for (int i = 0; i < numberOfDecks; i++) { + for (Suit suit : Suit.values()) { + for (Rank rank : Rank.values()) { + cards.push(new Card(suit, rank)); + } + } + } + } + + public void shuffleDeck(int numberOfShuffles) { + Random random = new Random(); + Card[] tempArray = cards.toArray(new Card[0]); + + for (int m = 0; m < numberOfShuffles; m++) { // Shuffle M times + for (int i = tempArray.length - 1; i > 0; i--) { + int j = random.nextInt(i + 1); + Card temp = tempArray[i]; + tempArray[i] = tempArray[j]; + tempArray[j] = temp; + } + } + + // Rebuild the stack + cards.clear(); + for (Card card : tempArray) { + cards.push(card); + } + } + + // Distribute cards to players + public Map> dealCards(int numberOfPlayers, int cardsPerPlayer) { + int totalAvailable = cards.size(); + int required = numberOfPlayers * cardsPerPlayer; + + // Edge case check + if (required > totalAvailable) { + throw new IllegalArgumentException("Not enough cards! Required: " + required + ", Available: " + totalAvailable); + } + + Map> playerHands = new HashMap<>(); + for (int player = 1; player <= numberOfPlayers; player++) { + List hand = new ArrayList<>(); + for (int c = 0; c < cardsPerPlayer; c++) { + hand.add(cards.pop()); + } + playerHands.put(player, hand); + } + return playerHands; + } + + + public Card drawCard() { + if (cards.isEmpty()) { + throw new IllegalStateException("No cards left in the deck!"); + } + return cards.pop(); // Draw from top + } + + public int remainingCards() { + return cards.size(); + } +} diff --git a/DeckOfCards/Main.java b/DeckOfCards/Main.java new file mode 100644 index 00000000..f63fee6c --- /dev/null +++ b/DeckOfCards/Main.java @@ -0,0 +1,33 @@ +package DeckOfCards; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + System.out.print("Enter number of decks (N): "); + int N = sc.nextInt(); + + System.out.print("Enter number of shuffles (M): "); + int M = sc.nextInt(); + + Deck deck = new Deck(N); + deck.shuffleDeck(M); + + Map> dealCards = deck.dealCards(11, 11); + + for (Map.Entry> entry : dealCards.entrySet()) { + Integer playerId = entry.getKey(); + List cards = entry.getValue(); + + System.out.println("Player " + playerId + ": " + cards); + } + + + System.out.println("Remaining cards: " + deck.remainingCards()); + } +} diff --git a/DeckOfCards/Rank.java b/DeckOfCards/Rank.java new file mode 100644 index 00000000..a7840c86 --- /dev/null +++ b/DeckOfCards/Rank.java @@ -0,0 +1,6 @@ +package DeckOfCards; + +enum Rank { + TWO, THREE, FOUR, FIVE, SIX, SEVEN, + EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE +} \ No newline at end of file diff --git a/DeckOfCards/Suit.java b/DeckOfCards/Suit.java new file mode 100644 index 00000000..75f1a3aa --- /dev/null +++ b/DeckOfCards/Suit.java @@ -0,0 +1,17 @@ +package DeckOfCards; + +public enum Suit { + SPADE(0), + HEART(1), + CLUB(2), + DIAMOND(3); + private final int value; + + private Suit(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} From bb46bf0fa22505bb1eb71f606acef4efd86dc88f Mon Sep 17 00:00:00 2001 From: VAMSI Date: Tue, 28 Oct 2025 22:23:57 +0530 Subject: [PATCH 14/15] Deck of cards --- DeckOfCards/Card.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/DeckOfCards/Card.java b/DeckOfCards/Card.java index ea153154..7dddac8c 100644 --- a/DeckOfCards/Card.java +++ b/DeckOfCards/Card.java @@ -1,8 +1,6 @@ package DeckOfCards; - - public class Card { private Suit suit; private Rank rank; From 3071277dd3d3a73792595fd84334807e5232a925 Mon Sep 17 00:00:00 2001 From: VAMSI Date: Tue, 28 Oct 2025 22:26:40 +0530 Subject: [PATCH 15/15] lld --- bookmyshow/BookMyShow.java | 283 +++++++----------- bookmyshow/BookingController.java | 52 ++++ bookmyshow/Movie.java | 43 ++- bookmyshow/Screen.java | 10 +- bookmyshow/Seat.java | 33 +- coffeeMachine/BrewingState.java | 8 + coffeeMachine/Coffee.java | 50 ++++ coffeeMachine/CoffeeCommand.java | 5 + coffeeMachine/CoffeeFactory.java | 11 + coffeeMachine/CoffeeMachine.java | 52 ++++ coffeeMachine/CoffeeMachineInvoker.java | 15 + coffeeMachine/CoffeeType.java | 17 ++ coffeeMachine/MachineState.java | 5 + coffeeMachine/Main.java | 21 ++ coffeeMachine/MakeCoffeeCommand.java | 16 + coffeeMachine/OutOfStockState.java | 8 + coffeeMachine/ReadyState.java | 8 + elevatorSystem/ATM.java | 78 +++++ elevatorSystem/ATMRoom.java | 55 ++++ elevatorSystem/ATMState.java | 32 ++ elevatorSystem/Card.java | 31 ++ elevatorSystem/CashWithdrawProcessor.java | 19 ++ elevatorSystem/CashWithdrawalState.java | 43 +++ elevatorSystem/CheckBalanceState.java | 25 ++ .../FiveHundredWithdrawProcessor.java | 26 ++ elevatorSystem/HasCardState.java | 32 ++ elevatorSystem/IdleState.java | 10 + .../OneHundredWithdrawProcessor.java | 26 ++ elevatorSystem/SelectOperationState.java | 44 +++ elevatorSystem/TransactionType.java | 14 + .../TwoThousandWithdrawProcessor.java | 26 ++ elevatorSystem/User.java | 16 + elevatorSystem/UserBankAccount.java | 10 + librarymanagement/Book.java | 50 ++-- librarymanagement/BookCopy.java | 3 +- logger/ErrorProcessor.java | 18 ++ logger/InfoProcessor.java | 16 + logger/LogProcessor.java | 21 ++ logger/Main.java | 9 + .../flighbookingsystem/Readme | 31 ++ 40 files changed, 1048 insertions(+), 224 deletions(-) create mode 100644 bookmyshow/BookingController.java create mode 100644 coffeeMachine/BrewingState.java create mode 100644 coffeeMachine/Coffee.java create mode 100644 coffeeMachine/CoffeeCommand.java create mode 100644 coffeeMachine/CoffeeFactory.java create mode 100644 coffeeMachine/CoffeeMachine.java create mode 100644 coffeeMachine/CoffeeMachineInvoker.java create mode 100644 coffeeMachine/CoffeeType.java create mode 100644 coffeeMachine/MachineState.java create mode 100644 coffeeMachine/Main.java create mode 100644 coffeeMachine/MakeCoffeeCommand.java create mode 100644 coffeeMachine/OutOfStockState.java create mode 100644 coffeeMachine/ReadyState.java create mode 100644 elevatorSystem/ATM.java create mode 100644 elevatorSystem/ATMRoom.java create mode 100644 elevatorSystem/ATMState.java create mode 100644 elevatorSystem/Card.java create mode 100644 elevatorSystem/CashWithdrawProcessor.java create mode 100644 elevatorSystem/CashWithdrawalState.java create mode 100644 elevatorSystem/CheckBalanceState.java create mode 100644 elevatorSystem/FiveHundredWithdrawProcessor.java create mode 100644 elevatorSystem/HasCardState.java create mode 100644 elevatorSystem/IdleState.java create mode 100644 elevatorSystem/OneHundredWithdrawProcessor.java create mode 100644 elevatorSystem/SelectOperationState.java create mode 100644 elevatorSystem/TransactionType.java create mode 100644 elevatorSystem/TwoThousandWithdrawProcessor.java create mode 100644 elevatorSystem/User.java create mode 100644 elevatorSystem/UserBankAccount.java create mode 100644 logger/ErrorProcessor.java create mode 100644 logger/InfoProcessor.java create mode 100644 logger/LogProcessor.java create mode 100644 logger/Main.java create mode 100644 out/production/machine-coding-feedback/flighbookingsystem/Readme diff --git a/bookmyshow/BookMyShow.java b/bookmyshow/BookMyShow.java index ad1a3e66..c62004fc 100644 --- a/bookmyshow/BookMyShow.java +++ b/bookmyshow/BookMyShow.java @@ -1,199 +1,120 @@ package bookmyshow; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; public class BookMyShow { - - MovieController movieController; - TheaterController TheaterController; - - BookMyShow() { - movieController = new MovieController(); - TheaterController = new TheaterController(); - } - - - public static void main(String args[]) { - - BookMyShow bookMyShow = new BookMyShow(); - - bookMyShow.initialize(); - - //user1 - bookMyShow.createBooking(City.Bangalore, "BAAHUBALI"); - //user2 - bookMyShow.createBooking(City.Bangalore, "BAAHUBALI"); - - } - - private void createBooking(City userCity, String movieName) { - - - //1. search movie by my location - List movies = movieController.getMoviesByCity(userCity); - - //2. select the movie which you want to see. i want to see Baahubali - Movie interestedMovie = null; - for (Movie movie : movies) { - - if ((movie.getMovieName()).equals(movieName)) { - interestedMovie = movie; - } - } - - //3. get all show of this movie in Bangalore location - Map> showsTheaterWise = TheaterController.getAllShow(interestedMovie, userCity); - - //4. select the particular show user is interested in - Map.Entry> entry = showsTheaterWise.entrySet().iterator().next(); - List runningShows = entry.getValue(); - Show interestedShow = runningShows.get(0); - - //5. select the seat - int seatNumber = 30; - List bookedSeats = interestedShow.getBookedSeats() == null ? new ArrayList<>() : interestedShow.getBookedSeats(); - if(!bookedSeats.contains(seatNumber)){ - bookedSeats.add(seatNumber); - //startPayment - Booking booking = new Booking(); - List myBookedSeats = new ArrayList<>(); - for(Seat screenSeat : interestedShow.getScreen().getSeats()) { - if(screenSeat.getSeatId() == seatNumber) { - myBookedSeats.add(screenSeat); - } - } - booking.setBookedSeats(myBookedSeats); - booking.setShow(interestedShow); - } else { - //throw exception - System.out.println("seat already booked, try again"); - return; - } - - System.out.println("BOOKING SUCCESSFUL"); - } - - private void initialize() { - - //create movies - createMovies(); - - //create theater with screens, seats and shows - createTheater(); + private final Map> cityVsTheater; + private final List allTheaters; + private final BookingController bookingController; + + public BookMyShow() { + this.cityVsTheater = new HashMap<>(); + this.allTheaters = new ArrayList<>(); + this.bookingController = new BookingController(); } - //creating 2 Theater - private void createTheater() { - - Movie avengerMovie = movieController.getMovieByName("AVENGERS"); - Movie baahubali = movieController.getMovieByName("BAAHUBALI"); - - Theater inoxTheater = new Theater(); - inoxTheater.setTheaterId(1); - inoxTheater.setScreens(createScreen()); - inoxTheater.setCity(City.Bangalore); - List inoxShows = new ArrayList<>(); - Show inoxMorningShow = createShows(1, inoxTheater.getScreens().get(0), avengerMovie, 8); - Show inoxEveningShow = createShows(2, inoxTheater.getScreens().get(0), baahubali, 16); - inoxShows.add(inoxMorningShow); - inoxShows.add(inoxEveningShow); - inoxTheater.setShows(inoxShows); - - - Theater pvrTheater = new Theater(); - pvrTheater.setTheaterId(2); - pvrTheater.setScreens(createScreen()); - pvrTheater.setCity(City.Delhi); - List pvrShows = new ArrayList<>(); - Show pvrMorningShow = createShows(3, pvrTheater.getScreens().get(0), avengerMovie, 13); - Show pvrEveningShow = createShows(4, pvrTheater.getScreens().get(0), baahubali, 20); - pvrShows.add(pvrMorningShow); - pvrShows.add(pvrEveningShow); - pvrTheater.setShows(pvrShows); - - TheaterController.addTheater(inoxTheater, City.Bangalore); - TheaterController.addTheater(pvrTheater, City.Delhi); - + public void addTheater(Theater theater, City city) { + allTheaters.add(theater); + cityVsTheater.computeIfAbsent(city, k -> new ArrayList<>()).add(theater); } - private List createScreen() { - - List screens = new ArrayList<>(); - Screen screen1 = new Screen(); - screen1.setScreenId(1); - screen1.setSeats(createSeats()); - screens.add(screen1); - - return screens; + public String bookTicket(Movie movie, Show show, List seats, UserDetails user, Date bookingDate, Payment payment) { + return bookingController.bookTicket(movie, show, seats, user, bookingDate, payment); } - private Show createShows(int showId, Screen screen, Movie movie, int showStartTime) { - - Show show = new Show(); - show.setShowId(showId); - show.setScreen(screen); - show.setMovie(movie); - show.setShowTime(showStartTime); //24 hrs time ex: 14 means 2pm and 8 means 8AM - return show; + public Booking getBookingDetails(UserDetails user, Integer bookingId) { + return bookingController.getTicketDetails(user, bookingId); } - //creating 100 seats - private List createSeats() { - - //creating 100 seats for testing purpose, this can be generalised - List seats = new ArrayList<>(); - - //1 to 40 : SILVER - for (int i = 0; i < 40; i++) { - Seat seat = new Seat(); - seat.setSeatId(i); - seat.setSeatType(SeatType.REGULAR); - seats.add(seat); - } - - //41 to 70 : SILVER - for (int i = 40; i < 70; i++) { - Seat seat = new Seat(); - seat.setSeatId(i); - seat.setSeatType(SeatType.REGULAR); - seats.add(seat); - } - - //1 to 40 : SILVER - for (int i = 70; i < 100; i++) { - Seat seat = new Seat(); - seat.setSeatId(i); - seat.setSeatType(SeatType.REGULAR); - seats.add(seat); + public void showAvailableTheaters(City city) { + List theaters = cityVsTheater.getOrDefault(city, new ArrayList<>()); + if (theaters.isEmpty()) { + System.out.println("No theaters available in " + city); + } else { + theaters.forEach(theater -> System.out.println(theater.getName())); } - - return seats; } - private void createMovies() { - - //create Movies1 - Movie avengers = new Movie(); - avengers.setMovieId(1); - avengers.setMovieName("AVENGERS"); - avengers.setDuration(128); - - //create Movies2 - Movie baahubali = new Movie(); - baahubali.setMovieId(2); - baahubali.setMovieName("BAAHUBALI"); - baahubali.setDuration(180); - + public static void main(String[] args) { + BookMyShow bookMyShow = new BookMyShow(); - //add movies against the cities - movieController.addMovie(avengers, City.Bangalore); - movieController.addMovie(avengers, City.Delhi); - movieController.addMovie(baahubali, City.Bangalore); - movieController.addMovie(baahubali, City.Delhi); + // Creating Screens + Screen screen1 = new Screen(); + Screen screen2 = new Screen(); + + // Creating Movies + Movie movie1 = new Movie.MovieBuilder("RRR", 1,"Patriortic",new Date(),"Inception").setDuration(90).build(); + Movie movie2 = new Movie.MovieBuilder("RRR", 1,"Patriortic",new Date(),"Inception").setDuration(120).build(); + + // Creating Seats + Seat seatA1 = new Seat(); + seatA1.setSeatId(1); + seatA1.setSeatNumber("A1"); + seatA1.setSeatType(SeatType.REGULAR); + seatA1.setSeatStatus(SeatStatus.AVAILABLE); + + Seat seatA2 = new Seat(); + seatA2.setSeatId(2); + seatA2.setSeatNumber("A2"); + seatA2.setSeatType(SeatType.REGULAR); + seatA2.setSeatStatus(SeatStatus.AVAILABLE); + + // Creating Shows with seats + List show1Seats = Collections.synchronizedList(new ArrayList<>(List.of(1, 2))); + Show show1 = new Show(show1Seats, movie1, screen1, 1, 1900); + + List show2Seats = Collections.synchronizedList(new ArrayList<>(List.of(1, 2))); + Show show2 = new Show(show2Seats, movie2, screen2, 2, 2100); + + // Creating Theater + List screens = Arrays.asList(screen1, screen2); + List shows = Arrays.asList(show1, show2); + Theater theater = new Theater(City.Delhi, "PVR Cinemas", screens, shows, 1); + + // Adding Theater to BookMyShow + bookMyShow.addTheater(theater, City.Delhi); + + // Display available theaters in the city + bookMyShow.showAvailableTheaters(City.Delhi); + + // Create Users + UserDetails user1 = new UserDetails(); + user1.setUserId("U1001"); + user1.setName("Alice"); + user1.setEmail("alice@example.com"); + + UserDetails user2 = new UserDetails(); + user2.setUserId("U1002"); + user2.setName("Bob"); + user2.setEmail("bob@example.com"); + + // Create Payments + Payment payment1 = new Payment(); + payment1.setPaymentId("P1001"); + payment1.setAmount(250.0); + payment1.setType(PaymentType.CREDIT_CARD); + payment1.setStatus(PaymentStatus.SUCCESS); + payment1.setPaymentDate(new Date()); + + Payment payment2 = new Payment(); + payment2.setPaymentId("P1002"); + payment2.setAmount(250.0); + payment2.setType(PaymentType.DEBIT_CARD); + payment2.setStatus(PaymentStatus.SUCCESS); + payment2.setPaymentDate(new Date()); + + // Simulate Concurrent Booking + Thread user1Thread = new Thread(() -> { + String result = bookMyShow.bookTicket(movie1, show1, List.of(seatA1), user1, new Date(), payment1); + System.out.println("User 1: " + result); + }); + + Thread user2Thread = new Thread(() -> { + String result = bookMyShow.bookTicket(movie1, show1, List.of(seatA1), user2, new Date(), payment2); + System.out.println("User 2: " + result); + }); + + user1Thread.start(); + user2Thread.start(); } } - - diff --git a/bookmyshow/BookingController.java b/bookmyshow/BookingController.java new file mode 100644 index 00000000..c56c19fb --- /dev/null +++ b/bookmyshow/BookingController.java @@ -0,0 +1,52 @@ +package bookmyshow; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import static bookmyshow.SeatStatus.BOOKED; + +public class BookingController { + + private final Map bookingRecords = new ConcurrentHashMap<>(); + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private int bookingCounter = 1; + + // Book a ticket (Write Lock ensures one thread can write at a time) + public String bookTicket(Movie movie, Show show, List seats, UserDetails user, Date bookingDate, Payment payment) { + lock.writeLock().lock(); + try { + // Check if any seat is already booked + for (Seat seat : seats) { + if (seat.getSeatStatus().equals(BOOKED)) { + return "Seat " + seat.getSeatNumber() + " is already booked!"; + } + } + + // Mark seats as booked + for (Seat seat : seats) { + seat.setSeatStatus(BOOKED); + } + + int bookingId = bookingCounter++; + Booking bookingDetail = new Booking(seats, bookingDate, String.valueOf(bookingId), payment,seats, show, BookingStatus.CONFIRMED, user); + bookingRecords.put(bookingId, bookingDetail); + + return "Booking Successful! Booking ID: " + bookingId; + } finally { + lock.writeLock().unlock(); + } + } + + // Retrieve ticket details (Read Lock allows multiple reads) + public Booking getTicketDetails(UserDetails user, Integer bookingId) { + lock.readLock().lock(); + try { + return bookingRecords.get(bookingId); + } finally { + lock.readLock().unlock(); + } + } +} diff --git a/bookmyshow/Movie.java b/bookmyshow/Movie.java index 394902cd..041171bc 100644 --- a/bookmyshow/Movie.java +++ b/bookmyshow/Movie.java @@ -19,13 +19,13 @@ class Movie { public Movie() { } - public Movie(int duration, String genre, Integer movieId, String movieName, Date releaseDate, String title) { - this.duration = duration; - this.genre = genre; - this.movieId = movieId; - this.movieName = movieName; - this.releaseDate = releaseDate; - this.title = title; + public Movie(MovieBuilder builder) { + this.duration = builder.duration; + this.genre = builder.genre; + this.movieId = builder.movieId; + this.movieName = builder.movieName; + this.releaseDate = builder.releaseDate; + this.title = builder.title; } public int getDuration() { @@ -75,4 +75,33 @@ public void setReleaseDate(Date releaseDate) { public void setTitle(String title) { this.title = title; } + + public static class MovieBuilder { + + private Integer movieId; + private String movieName; + private String title; + private String genre; + private int duration; // Duration in minutes // optional + private Date releaseDate; + + public MovieBuilder(String movieName, Integer movieId, String genre, Date releaseDate, String title) { + this.movieName = movieName; + this.movieId = movieId; + this.genre = genre; + this.releaseDate = releaseDate; + this.title = title; + } + + public MovieBuilder setDuration(int duration) { + this.duration = duration; + return this; + } + + public Movie build(){ + return new Movie(this); + } + + + } } diff --git a/bookmyshow/Screen.java b/bookmyshow/Screen.java index 9919846f..11ded4cb 100644 --- a/bookmyshow/Screen.java +++ b/bookmyshow/Screen.java @@ -6,7 +6,7 @@ class Screen { private Integer screenId; private String name; - private Theater theater; + private List seats; private List shows; @@ -31,9 +31,7 @@ public List getShows() { return shows; } - public Theater getTheater() { - return theater; - } + public void setName(String name) { this.name = name; @@ -51,9 +49,7 @@ public void setShows(List shows) { this.shows = shows; } - public void setTheater(Theater theater) { - this.theater = theater; - } + } diff --git a/bookmyshow/Seat.java b/bookmyshow/Seat.java index 7874c8bf..ed130ca4 100644 --- a/bookmyshow/Seat.java +++ b/bookmyshow/Seat.java @@ -1,14 +1,37 @@ package bookmyshow; - -class Seat { +public class Seat { private Integer seatId; private String seatNumber; private SeatType seatType; private SeatStatus seatStatus; + private boolean isLocked = false; + + public synchronized boolean lockSeat() { + if (seatStatus == SeatStatus.AVAILABLE && !isLocked) { + isLocked = true; + return true; + } + return false; + } + + public synchronized void unlockSeat() { + isLocked = false; + } - // Constructors, getters, and setters + public synchronized boolean bookSeat() { + if (isLocked) { + seatStatus = SeatStatus.BOOKED; + isLocked = false; + return true; + } + return false; + } + + public boolean isLocked() { + return isLocked; + } public Integer getSeatId() { return seatId; @@ -26,6 +49,10 @@ public SeatType getSeatType() { return seatType; } + public void setLocked(boolean locked) { + isLocked = locked; + } + public void setSeatId(Integer seatId) { this.seatId = seatId; } diff --git a/coffeeMachine/BrewingState.java b/coffeeMachine/BrewingState.java new file mode 100644 index 00000000..a87f19f7 --- /dev/null +++ b/coffeeMachine/BrewingState.java @@ -0,0 +1,8 @@ +package coffeeMachine; + +class BrewingState implements MachineState { + @Override + public void handleRequest(CoffeeMachine machine) { + System.out.println("Machine is brewing coffee."); + } +} diff --git a/coffeeMachine/Coffee.java b/coffeeMachine/Coffee.java new file mode 100644 index 00000000..7c948236 --- /dev/null +++ b/coffeeMachine/Coffee.java @@ -0,0 +1,50 @@ +package coffeeMachine; + +class Coffee { + private int waterRequired; + private int milkRequired; + private int coffeeBeansRequired; + + private Coffee(CoffeeBuilder builder) { + this.waterRequired = builder.waterRequired; + this.milkRequired = builder.milkRequired; + this.coffeeBeansRequired = builder.coffeeBeansRequired; + } + + public int getWaterRequired() { + return waterRequired; + } + + public int getMilkRequired() { + return milkRequired; + } + + public int getCoffeeBeansRequired() { + return coffeeBeansRequired; + } + + public static class CoffeeBuilder { + private int waterRequired; + private int milkRequired; + private int coffeeBeansRequired; + + public CoffeeBuilder setWaterRequired(int waterRequired) { + this.waterRequired = waterRequired; + return this; + } + + public CoffeeBuilder setMilkRequired(int milkRequired) { + this.milkRequired = milkRequired; + return this; + } + + public CoffeeBuilder setCoffeeBeansRequired(int coffeeBeansRequired) { + this.coffeeBeansRequired = coffeeBeansRequired; + return this; + } + + public Coffee build() { + return new Coffee(this); + } + } +} diff --git a/coffeeMachine/CoffeeCommand.java b/coffeeMachine/CoffeeCommand.java new file mode 100644 index 00000000..ae763b0c --- /dev/null +++ b/coffeeMachine/CoffeeCommand.java @@ -0,0 +1,5 @@ +package coffeeMachine; + +interface CoffeeCommand { + void execute(); +} \ No newline at end of file diff --git a/coffeeMachine/CoffeeFactory.java b/coffeeMachine/CoffeeFactory.java new file mode 100644 index 00000000..70c7555f --- /dev/null +++ b/coffeeMachine/CoffeeFactory.java @@ -0,0 +1,11 @@ +package coffeeMachine; + +class CoffeeFactory { + public static Coffee createCoffee(CoffeeType coffeeType) { + return new Coffee.CoffeeBuilder() + .setWaterRequired(coffeeType.waterRequired) + .setMilkRequired(coffeeType.milkRequired) + .setCoffeeBeansRequired(coffeeType.coffeeBeansRequired) + .build(); + } +} diff --git a/coffeeMachine/CoffeeMachine.java b/coffeeMachine/CoffeeMachine.java new file mode 100644 index 00000000..7bc9cba2 --- /dev/null +++ b/coffeeMachine/CoffeeMachine.java @@ -0,0 +1,52 @@ +package coffeeMachine; + +class CoffeeMachine { + private static CoffeeMachine instance; + + private int water = 1000; + private int milk = 500; + private int coffeeBeans = 200; + + private MachineState currentState; + + private CoffeeMachine() { + this.currentState = new ReadyState(); + } + + public static CoffeeMachine getInstance() { + if (instance == null) { + instance = new CoffeeMachine(); + } + return instance; + } + + public void setState(MachineState state) { + this.currentState = state; + } + + public void processState() { + currentState.handleRequest(this); + } + + public boolean hasEnoughIngredients(Coffee coffee) { + return water >= coffee.getWaterRequired() && + milk >= coffee.getMilkRequired() && + coffeeBeans >= coffee.getCoffeeBeansRequired(); + } + + public void makeCoffee(CoffeeType coffeeType) { + Coffee coffee = CoffeeFactory.createCoffee(coffeeType); + if (hasEnoughIngredients(coffee)) { + setState(new BrewingState()); + processState(); + water -= coffee.getWaterRequired(); + milk -= coffee.getMilkRequired(); + coffeeBeans -= coffee.getCoffeeBeansRequired(); + System.out.println("Your " + coffeeType.name() + " is ready!"); + setState(new ReadyState()); + } else { + setState(new OutOfStockState()); + processState(); + } + } +} diff --git a/coffeeMachine/CoffeeMachineInvoker.java b/coffeeMachine/CoffeeMachineInvoker.java new file mode 100644 index 00000000..00cd8d0a --- /dev/null +++ b/coffeeMachine/CoffeeMachineInvoker.java @@ -0,0 +1,15 @@ +package coffeeMachine; + +class CoffeeMachineInvoker { + private CoffeeCommand command; + + public void setCommand(CoffeeCommand command) { + this.command = command; + } + + public void processCommand() { + if (command != null) { + command.execute(); + } + } +} diff --git a/coffeeMachine/CoffeeType.java b/coffeeMachine/CoffeeType.java new file mode 100644 index 00000000..c7bfed94 --- /dev/null +++ b/coffeeMachine/CoffeeType.java @@ -0,0 +1,17 @@ +package coffeeMachine; + +enum CoffeeType { + ESPRESSO(50, 0, 15), + LATTE(50, 150, 20), + CAPPUCCINO(50, 100, 20); + + int waterRequired; + int milkRequired; + int coffeeBeansRequired; + + CoffeeType(int waterRequired, int milkRequired, int coffeeBeansRequired) { + this.waterRequired = waterRequired; + this.milkRequired = milkRequired; + this.coffeeBeansRequired = coffeeBeansRequired; + } +} diff --git a/coffeeMachine/MachineState.java b/coffeeMachine/MachineState.java new file mode 100644 index 00000000..fc833a0c --- /dev/null +++ b/coffeeMachine/MachineState.java @@ -0,0 +1,5 @@ +package coffeeMachine; + +interface MachineState { + void handleRequest(CoffeeMachine machine); +} diff --git a/coffeeMachine/Main.java b/coffeeMachine/Main.java new file mode 100644 index 00000000..dbbf790a --- /dev/null +++ b/coffeeMachine/Main.java @@ -0,0 +1,21 @@ +package coffeeMachine; + +public class Main { + public static void main(String[] args) { + CoffeeMachine machine = CoffeeMachine.getInstance(); + + CoffeeMachineInvoker invoker = new CoffeeMachineInvoker(); + + // User selects Espresso + invoker.setCommand(new MakeCoffeeCommand(machine, CoffeeType.ESPRESSO)); + invoker.processCommand(); + + // User selects Latte + invoker.setCommand(new MakeCoffeeCommand(machine, CoffeeType.LATTE)); + invoker.processCommand(); + + // User selects Cappuccino + invoker.setCommand(new MakeCoffeeCommand(machine, CoffeeType.CAPPUCCINO)); + invoker.processCommand(); + } +} diff --git a/coffeeMachine/MakeCoffeeCommand.java b/coffeeMachine/MakeCoffeeCommand.java new file mode 100644 index 00000000..3d2ed31e --- /dev/null +++ b/coffeeMachine/MakeCoffeeCommand.java @@ -0,0 +1,16 @@ +package coffeeMachine; + +class MakeCoffeeCommand implements CoffeeCommand { + private CoffeeMachine machine; + private CoffeeType coffeeType; + + public MakeCoffeeCommand(CoffeeMachine machine, CoffeeType coffeeType) { + this.machine = machine; + this.coffeeType = coffeeType; + } + + @Override + public void execute() { + machine.makeCoffee(coffeeType); + } +} \ No newline at end of file diff --git a/coffeeMachine/OutOfStockState.java b/coffeeMachine/OutOfStockState.java new file mode 100644 index 00000000..d81d86ac --- /dev/null +++ b/coffeeMachine/OutOfStockState.java @@ -0,0 +1,8 @@ +package coffeeMachine; + +class OutOfStockState implements MachineState { + @Override + public void handleRequest(CoffeeMachine machine) { + System.out.println("Machine is out of stock. Please refill ingredients."); + } +} \ No newline at end of file diff --git a/coffeeMachine/ReadyState.java b/coffeeMachine/ReadyState.java new file mode 100644 index 00000000..4023479a --- /dev/null +++ b/coffeeMachine/ReadyState.java @@ -0,0 +1,8 @@ +package coffeeMachine; + +class ReadyState implements MachineState { + @Override + public void handleRequest(CoffeeMachine machine) { + System.out.println("Machine is ready. Choose your coffee."); + } +} diff --git a/elevatorSystem/ATM.java b/elevatorSystem/ATM.java new file mode 100644 index 00000000..25949ac6 --- /dev/null +++ b/elevatorSystem/ATM.java @@ -0,0 +1,78 @@ +package elevatorSystem; + + +public class ATM { + + private static ATM atmObject = new ATM(); //Singleton: eager initialization + + ATMState currentATMState; + + private int atmBalance; + int noOfTwoThousandNotes; + int noOfFiveHundredNotes; + int noOfOneHundredNotes; + + + private ATM() { + } + + public void setCurrentATMState(ATMState currentATMState) { + this.currentATMState = currentATMState; + } + + public ATMState getCurrentATMState() { + return currentATMState; + } + + public static ATM getATMObject() { + atmObject.setCurrentATMState(new IdleState()); + return atmObject; + } + + public int getAtmBalance() { + return atmBalance; + } + + public void setAtmBalance(int atmBalance, int noOfTwoThousandNotes, int noOfFiveHundredNotes, int noOfOneHundredNotes) { + this.atmBalance = atmBalance; + this.noOfTwoThousandNotes = noOfTwoThousandNotes; + this.noOfFiveHundredNotes = noOfFiveHundredNotes; + this.noOfOneHundredNotes = noOfOneHundredNotes; + } + + public int getNoOfTwoThousandNotes() { + return noOfTwoThousandNotes; + } + + public int getNoOfFiveHundredNotes() { + return noOfFiveHundredNotes; + } + + public int getNoOfOneHundredNotes() { + return noOfOneHundredNotes; + } + + public void deductATMBalance(int amount) { + atmBalance = atmBalance - amount; + } + + public void deductTwoThousandNotes(int number) { + noOfTwoThousandNotes = noOfTwoThousandNotes - number; + } + + public void deductFiveHundredNotes(int number) { + noOfFiveHundredNotes = noOfFiveHundredNotes - number; + } + + public void deductOneHundredNotes(int number) { + noOfOneHundredNotes = noOfOneHundredNotes - number; + } + + public void printCurrentATMStatus(){ + System.out.println("Balance: " + atmBalance); + System.out.println("2kNotes: " + noOfTwoThousandNotes); + System.out.println("500Notes: " + noOfFiveHundredNotes); + System.out.println("100Notes: " + noOfOneHundredNotes); + + } +} diff --git a/elevatorSystem/ATMRoom.java b/elevatorSystem/ATMRoom.java new file mode 100644 index 00000000..5f9cff73 --- /dev/null +++ b/elevatorSystem/ATMRoom.java @@ -0,0 +1,55 @@ +package elevatorSystem; + +public class ATMRoom { + ATM atm; + User user; + + public static void main(String args[]) { + + ATMRoom atmRoom = new ATMRoom(); + atmRoom.initialize(); + + atmRoom.atm.printCurrentATMStatus(); + atmRoom.atm.getCurrentATMState().insertCard(atmRoom.atm, atmRoom.user.card); + atmRoom.atm.getCurrentATMState().authenticatePin(atmRoom.atm, atmRoom.user.card, 112211); + atmRoom.atm.getCurrentATMState().selectOperation(atmRoom.atm, atmRoom.user.card, TransactionType.CASH_WITHDRAWAL); + atmRoom.atm.getCurrentATMState().cashWithdrawal(atmRoom.atm, atmRoom.user.card, 2700); + atmRoom.atm.printCurrentATMStatus(); + + + } + + private void initialize() { + + //create ATM + atm = ATM.getATMObject(); + atm.setAtmBalance(3500, 1,2,5); + + //create User + this.user = createUser(); + } + + private User createUser(){ + + User user = new User(); + user.setCard(createCard()); + return user; + } + + private Card createCard(){ + + Card card = new Card(); + card.setBankAccount(createBankAccount()); + return card; + } + + private UserBankAccount createBankAccount() { + + UserBankAccount bankAccount = new UserBankAccount(); + bankAccount.balance = 3000; + + return bankAccount; + + } + +} diff --git a/elevatorSystem/ATMState.java b/elevatorSystem/ATMState.java new file mode 100644 index 00000000..8c7d4f9e --- /dev/null +++ b/elevatorSystem/ATMState.java @@ -0,0 +1,32 @@ +package elevatorSystem; + +public abstract class ATMState { + + public void insertCard(ATM atm, Card card) { + System.out.println("OOPS!! Something went wrong"); + } + + public void authenticatePin(ATM atm, Card card, int pin){ + System.out.println("OOPS!! Something went wrong"); + } + + public void selectOperation(ATM atm, Card card, TransactionType txnType){ + System.out.println("OOPS!! Something went wrong"); + } + + public void cashWithdrawal(ATM atm, Card card, int withdrawAmount){ + System.out.println("OOPS!! Something went wrong"); + } + + public void displayBalance(ATM atm, Card card){ + System.out.println("OOPS!! Something went wrong"); + } + + public void returnCard(){ + System.out.println("OOPS!! Something went wrong"); + } + + public void exit(ATM atm){ + System.out.println("OOPS!! Something went wrong"); + } +} \ No newline at end of file diff --git a/elevatorSystem/Card.java b/elevatorSystem/Card.java new file mode 100644 index 00000000..9936aaf5 --- /dev/null +++ b/elevatorSystem/Card.java @@ -0,0 +1,31 @@ +package elevatorSystem; + +public class Card { + + private int cardNumber; + private int cvv; + private int expiryDate; + private int holderName; + static int PIN_NUMBER = 112211; + private UserBankAccount bankAccount; + + public boolean isCorrectPINEntered(int pin) { + + if (pin == PIN_NUMBER) { + return true; + } + return false; + } + + public int getBankBalance(){ + return bankAccount.balance; + } + + public void deductBankBalance(int amount){ + bankAccount.withdrawalBalance(amount); + } + + public void setBankAccount(UserBankAccount bankAccount) { + this.bankAccount = bankAccount; + } +} \ No newline at end of file diff --git a/elevatorSystem/CashWithdrawProcessor.java b/elevatorSystem/CashWithdrawProcessor.java new file mode 100644 index 00000000..b6d1225e --- /dev/null +++ b/elevatorSystem/CashWithdrawProcessor.java @@ -0,0 +1,19 @@ +package elevatorSystem; + +public abstract class CashWithdrawProcessor { + + CashWithdrawProcessor nextCashWithdrawalProcessor; + + CashWithdrawProcessor(CashWithdrawProcessor cashWithdrawalProcessor) { + + this.nextCashWithdrawalProcessor = cashWithdrawalProcessor; + + } + + public void withdraw(ATM atm, int remainingAmount) { + + if (nextCashWithdrawalProcessor != null) { + nextCashWithdrawalProcessor.withdraw(atm, remainingAmount); + } + } +} \ No newline at end of file diff --git a/elevatorSystem/CashWithdrawalState.java b/elevatorSystem/CashWithdrawalState.java new file mode 100644 index 00000000..540b5a24 --- /dev/null +++ b/elevatorSystem/CashWithdrawalState.java @@ -0,0 +1,43 @@ +package elevatorSystem; + + +public class CashWithdrawalState extends ATMState { + + public CashWithdrawalState() { + System.out.println("Please enter the Withdrawal Amount"); + } + + public void cashWithdrawal(ATM atmObject, Card card, int withdrawalAmountRequest) { + + if (atmObject.getAtmBalance() < withdrawalAmountRequest) { + System.out.println("Insufficient fund in the ATM Machine"); + exit(atmObject); + } else if (card.getBankBalance() < withdrawalAmountRequest) { + System.out.println("Insufficient fund in the your Bank Account"); + exit(atmObject); + } else { + + card.deductBankBalance(withdrawalAmountRequest); + atmObject.deductATMBalance(withdrawalAmountRequest); + + //using chain of responsibility for this logic, how many 2k Rs notes, how many 500 Rs notes etc, has to be withdrawal + CashWithdrawProcessor withdrawProcessor = + new TwoThousandWithdrawProcessor(new FiveHundredWithdrawProcessor(new OneHundredWithdrawProcessor(null))); + + withdrawProcessor.withdraw(atmObject, withdrawalAmountRequest); + exit(atmObject); + } + } + + @Override + public void exit(ATM atmObject) { + returnCard(); + atmObject.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard() { + System.out.println("Please collect your card"); + } +} \ No newline at end of file diff --git a/elevatorSystem/CheckBalanceState.java b/elevatorSystem/CheckBalanceState.java new file mode 100644 index 00000000..d3c86414 --- /dev/null +++ b/elevatorSystem/CheckBalanceState.java @@ -0,0 +1,25 @@ +package elevatorSystem; + +public class CheckBalanceState extends ATMState { + + public CheckBalanceState() { + } + + @Override + public void displayBalance(ATM atm, Card card){ + System.out.println("Your Balance is: " + card.getBankBalance()); + exit(atm); + } + + @Override + public void exit(ATM atmObject){ + returnCard(); + atmObject.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard(){ + System.out.println("Please collect your card"); + } +} \ No newline at end of file diff --git a/elevatorSystem/FiveHundredWithdrawProcessor.java b/elevatorSystem/FiveHundredWithdrawProcessor.java new file mode 100644 index 00000000..b1944001 --- /dev/null +++ b/elevatorSystem/FiveHundredWithdrawProcessor.java @@ -0,0 +1,26 @@ +package elevatorSystem; + +public class FiveHundredWithdrawProcessor extends CashWithdrawProcessor { + + public FiveHundredWithdrawProcessor(CashWithdrawProcessor nextCashWithdrawProcessor){ + super(nextCashWithdrawProcessor); + } + + public void withdraw(ATM atm, int remainingAmount){ + + int required = remainingAmount/500; + int balance = remainingAmount%500; + + if(required <= atm.getNoOfFiveHundredNotes()) { + atm.deductFiveHundredNotes(required); + } + else if(required > atm.getNoOfFiveHundredNotes()) { + atm.deductFiveHundredNotes(atm.getNoOfFiveHundredNotes()); + balance = balance + (required-atm.getNoOfFiveHundredNotes()) * 500; + } + + if(balance != 0){ + super.withdraw(atm, balance); + } + } +} diff --git a/elevatorSystem/HasCardState.java b/elevatorSystem/HasCardState.java new file mode 100644 index 00000000..b0dc5f5e --- /dev/null +++ b/elevatorSystem/HasCardState.java @@ -0,0 +1,32 @@ +package elevatorSystem; + +public class HasCardState extends ATMState { + + public HasCardState(){ + System.out.println("enter your card pin number"); + } + + @Override + public void authenticatePin(ATM atm, Card card, int pin){ + boolean isCorrectPinEntered = card.isCorrectPINEntered(pin); + + if(isCorrectPinEntered) { + atm.setCurrentATMState(new SelectOperationState()); + } else { + System.out.println("Invalid PIN Number"); + exit(atm); + } + } + + @Override + public void exit(ATM atm){ + returnCard(); + atm.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard(){ + System.out.println("Please collect your card"); + } +} \ No newline at end of file diff --git a/elevatorSystem/IdleState.java b/elevatorSystem/IdleState.java new file mode 100644 index 00000000..5607353d --- /dev/null +++ b/elevatorSystem/IdleState.java @@ -0,0 +1,10 @@ +package elevatorSystem; + +public class IdleState extends ATMState { + + @Override + public void insertCard(ATM atm, Card card) { + System.out.println("Card is inserted"); + atm.setCurrentATMState(new HasCardState()); + } +} diff --git a/elevatorSystem/OneHundredWithdrawProcessor.java b/elevatorSystem/OneHundredWithdrawProcessor.java new file mode 100644 index 00000000..1e90bfbb --- /dev/null +++ b/elevatorSystem/OneHundredWithdrawProcessor.java @@ -0,0 +1,26 @@ +package elevatorSystem; + +public class OneHundredWithdrawProcessor extends CashWithdrawProcessor { + + public OneHundredWithdrawProcessor(CashWithdrawProcessor nextCashWithdrawProcessor){ + super(nextCashWithdrawProcessor); + } + + public void withdraw(ATM atm, int remainingAmount){ + + int required = remainingAmount/100; + int balance = remainingAmount%100; + + if(required <= atm.getNoOfOneHundredNotes()) { + atm.deductOneHundredNotes(required); + } + else if(required > atm.getNoOfOneHundredNotes()) { + atm.deductOneHundredNotes(atm.getNoOfOneHundredNotes()); + balance = balance + (required-atm.getNoOfOneHundredNotes()) * 100; + } + + if(balance != 0){ + System.out.println("Something went wrong"); + } + } +} \ No newline at end of file diff --git a/elevatorSystem/SelectOperationState.java b/elevatorSystem/SelectOperationState.java new file mode 100644 index 00000000..fd242876 --- /dev/null +++ b/elevatorSystem/SelectOperationState.java @@ -0,0 +1,44 @@ +package elevatorSystem; + +public class SelectOperationState extends ATMState { + + public SelectOperationState(){ + showOperations(); + } + + @Override + public void selectOperation(ATM atmObject, Card card, TransactionType txnType){ + + switch (txnType) { + + case CASH_WITHDRAWAL: + atmObject.setCurrentATMState(new CashWithdrawalState()); + break; + case BALANCE_CHECK: + atmObject.setCurrentATMState(new CheckBalanceState()); + break; + default: { + System.out.println("Invalid Option"); + exit(atmObject); + } + + } + } + + @Override + public void exit(ATM atmObject){ + returnCard(); + atmObject.setCurrentATMState(new IdleState()); + System.out.println("Exit happens"); + } + + @Override + public void returnCard(){ + System.out.println("Please collect your card"); + } + + private void showOperations(){ + System.out.println("Please select the Operation"); + TransactionType.showAllTransactionTypes(); + } +} \ No newline at end of file diff --git a/elevatorSystem/TransactionType.java b/elevatorSystem/TransactionType.java new file mode 100644 index 00000000..cafbf964 --- /dev/null +++ b/elevatorSystem/TransactionType.java @@ -0,0 +1,14 @@ +package elevatorSystem; + +public enum TransactionType { + + CASH_WITHDRAWAL, + BALANCE_CHECK; + + public static void showAllTransactionTypes(){ + + for(TransactionType type: TransactionType.values()){ + System.out.println(type.name()); + } + } +} \ No newline at end of file diff --git a/elevatorSystem/TwoThousandWithdrawProcessor.java b/elevatorSystem/TwoThousandWithdrawProcessor.java new file mode 100644 index 00000000..a17523fb --- /dev/null +++ b/elevatorSystem/TwoThousandWithdrawProcessor.java @@ -0,0 +1,26 @@ +package elevatorSystem; + +public class TwoThousandWithdrawProcessor extends CashWithdrawProcessor { + + public TwoThousandWithdrawProcessor(CashWithdrawProcessor nextCashWithdrawProcessor) { + super(nextCashWithdrawProcessor); + } + + public void withdraw(ATM atm, int remainingAmount) { + + int required = remainingAmount/2000; + int balance = remainingAmount%2000; + + if(required <= atm.getNoOfTwoThousandNotes()) { + atm.deductTwoThousandNotes(required); + } + else if(required > atm.getNoOfTwoThousandNotes()) { + atm.deductTwoThousandNotes(atm.getNoOfTwoThousandNotes()); + balance = balance + (required-atm.getNoOfTwoThousandNotes()) * 2000; + } + + if(balance != 0){ + super.withdraw(atm, balance); + } + } +} \ No newline at end of file diff --git a/elevatorSystem/User.java b/elevatorSystem/User.java new file mode 100644 index 00000000..5216d725 --- /dev/null +++ b/elevatorSystem/User.java @@ -0,0 +1,16 @@ +package elevatorSystem; + + +public class User { + + public Card card; + public UserBankAccount bankAccount; + + public Card getCard() { + return card; + } + + public void setCard(Card card) { + this.card = card; + } +} \ No newline at end of file diff --git a/elevatorSystem/UserBankAccount.java b/elevatorSystem/UserBankAccount.java new file mode 100644 index 00000000..13ce6ff0 --- /dev/null +++ b/elevatorSystem/UserBankAccount.java @@ -0,0 +1,10 @@ +package elevatorSystem; + +public class UserBankAccount { + + int balance; + + public void withdrawalBalance(int amount) { + balance = balance - amount; + } +} \ No newline at end of file diff --git a/librarymanagement/Book.java b/librarymanagement/Book.java index c43f0bc6..328a9c20 100644 --- a/librarymanagement/Book.java +++ b/librarymanagement/Book.java @@ -4,34 +4,34 @@ import java.util.List; import java.util.Optional; -class Book { - private String bookId; - private String title; - private List authors; - private List publishers; - private List copies; +public class Book { + private String bookId; + private String title; + private List authors; + private List publishers; + private List copies; - public Book(String bookId, String title, List authors, List publishers) { - this.bookId = bookId; - this.title = title; - this.authors = authors; - this.publishers = publishers; - this.copies = new ArrayList<>(); - } + public Book(String bookId, String title, List authors, List publishers) { + this.bookId = bookId; + this.title = title; + this.authors = authors; + this.publishers = publishers; + this.copies = new ArrayList<>(); + } - public Optional getAvailableCopy() { - return copies.stream().filter(copy -> !copy.isBorrowed()).findFirst(); - } + public Optional getAvailableCopy() { + return copies.stream().filter(copy -> !copy.isBorrowed()).findFirst(); + } - public void addBookCopy(BookCopy copy) { - copies.add(copy); - } + public void addBookCopy(BookCopy copy) { + copies.add(copy); + } - public void search(String attribute, String value) { - if ((attribute.equals("book_id") && bookId.equals(value)) || - (attribute.equals("author") && authors.contains(value)) || - (attribute.equals("publisher") && publishers.contains(value))) { - copies.forEach(BookCopy::printDetails); + public void search(String attribute, String value) { + if ((attribute.equals("book_id") && bookId.equals(value)) || + (attribute.equals("author") && authors.contains(value)) || + (attribute.equals("publisher") && publishers.contains(value))) { + copies.forEach(BookCopy::printDetails); + } } } -} diff --git a/librarymanagement/BookCopy.java b/librarymanagement/BookCopy.java index 2a3aa2dc..10dd6de0 100644 --- a/librarymanagement/BookCopy.java +++ b/librarymanagement/BookCopy.java @@ -1,5 +1,6 @@ package librarymanagement; -class BookCopy { + +public class BookCopy { private String copyId; private Book book; private Rack rack; diff --git a/logger/ErrorProcessor.java b/logger/ErrorProcessor.java new file mode 100644 index 00000000..7b497579 --- /dev/null +++ b/logger/ErrorProcessor.java @@ -0,0 +1,18 @@ +package logger; + + +public class ErrorProcessor extends LogProcessor{ + public ErrorProcessor(LogProcessor logProcessor) { + super(logProcessor); + } + + public void log(int log, String message){ + if(log == ERROR){ + System.out.println("ERROR::"+message); + } + else { + super.log(log,message); + } + + } +} diff --git a/logger/InfoProcessor.java b/logger/InfoProcessor.java new file mode 100644 index 00000000..90df8741 --- /dev/null +++ b/logger/InfoProcessor.java @@ -0,0 +1,16 @@ +package logger; + +public class InfoProcessor extends LogProcessor{ + public InfoProcessor(LogProcessor logProcessor) { + super(logProcessor); + } + + public void log(int log, String message){ + if(log == INFO){ + System.out.println("Info::"+message); + } + else { + super.log(log,message); + } + } +} diff --git a/logger/LogProcessor.java b/logger/LogProcessor.java new file mode 100644 index 00000000..e17dff6f --- /dev/null +++ b/logger/LogProcessor.java @@ -0,0 +1,21 @@ +package logger; + +public abstract class LogProcessor { + + int INFO = 1; + int DEBUG = 2; + int ERROR = 3; + + LogProcessor logProcessor; + + + public LogProcessor(LogProcessor logProcessor) { + this.logProcessor = logProcessor; + } + + public void log(int level , String message ){ + if(logProcessor!=null){ + logProcessor.log(level,message); + } + } +} diff --git a/logger/Main.java b/logger/Main.java new file mode 100644 index 00000000..e180fa27 --- /dev/null +++ b/logger/Main.java @@ -0,0 +1,9 @@ +package logger; + +public class Main { + public static void main(String[] args) { + LogProcessor logProcessor = new InfoProcessor(new ErrorProcessor(null)); + logProcessor.log(logProcessor.ERROR, "error message"); + logProcessor.log(logProcessor.INFO, "info message"); + } +} diff --git a/out/production/machine-coding-feedback/flighbookingsystem/Readme b/out/production/machine-coding-feedback/flighbookingsystem/Readme new file mode 100644 index 00000000..2223d40c --- /dev/null +++ b/out/production/machine-coding-feedback/flighbookingsystem/Readme @@ -0,0 +1,31 @@ +MakeMyTrip.com/Yatra/Booking.com + +Functional Requirements: +1.User should be able to search flights based on arrival + destination+ date of travel +2.User should be able to login to application. +3.Select the flight based on time/preference. +4.Enter the personal details. +5.Make payment in your application. +6.Notification to the email. + +Non-Functional Requirements +1.Scalable +2.Reliable +3.Modular + +Finding the actors +1.User +2.Airline authority +3.Admin + +Entities: +1.User +2.Flights +3.Booking +4.Payment +5.Notification +6.Airline + + + +