Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Dev #91

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open

Dev #91

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 24 additions & 10 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,56 +18,70 @@
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.2</version>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.4</version>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<version>0.8.10</version>
<type>maven-plugin</type>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
</dependency>

</dependencies>


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
Expand All @@ -81,7 +95,7 @@
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>executable-jar-with-dependencies</descriptorRef>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
Expand Down Expand Up @@ -124,7 +138,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<version>0.8.10</version>
<executions>
<execution>
<goals>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public Connection getConnection() throws ClassNotFoundException, SQLException {
logger.info("Create DB connection");
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/prod","root","rootroot");
"jdbc:mysql://localhost:3306/prod?serverTimezone=Europe/Paris","root","");
}

public void closeConnection(Connection con){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@ public class DBConstants {

public static final String SAVE_TICKET = "insert into ticket(PARKING_NUMBER, VEHICLE_REG_NUMBER, PRICE, IN_TIME, OUT_TIME) values(?,?,?,?,?)";
public static final String UPDATE_TICKET = "update ticket set PRICE=?, OUT_TIME=? where ID=?";
public static final String GET_TICKET = "select t.PARKING_NUMBER, t.ID, t.PRICE, t.IN_TIME, t.OUT_TIME, p.TYPE from ticket t,parking p where p.parking_number = t.parking_number and t.VEHICLE_REG_NUMBER=? order by t.IN_TIME limit 1";
public static final String GET_TICKET = "select t.PARKING_NUMBER, t.ID, t.PRICE, t.IN_TIME, t.OUT_TIME, p.TYPE from ticket t,parking p where p.parking_number = t.parking_number and t.OUT_TIME is null and t.VEHICLE_REG_NUMBER=? order by t.IN_TIME DESC limit 1";
public static final String GET_LAST_TICKET = "select t.PARKING_NUMBER, t.ID, t.PRICE, t.IN_TIME, t.OUT_TIME, p.TYPE from ticket t,parking p where p.parking_number = t.parking_number and t.VEHICLE_REG_NUMBER=? order by t.IN_TIME DESC limit 1";
public static final String COUNT_TICKETS = "select count(*) AS lign_count from ticket WHERE VEHICLE_REG_NUMBER=?";
}
3 changes: 3 additions & 0 deletions src/main/java/com/parkit/parkingsystem/constants/Fare.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.parkit.parkingsystem.constants;

import java.text.DecimalFormat;

public class Fare {
public static final double BIKE_RATE_PER_HOUR = 1.0;
public static final double CAR_RATE_PER_HOUR = 1.5;
public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##");
}
35 changes: 31 additions & 4 deletions src/main/java/com/parkit/parkingsystem/dao/TicketDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;

public class TicketDAO {

private static final Logger logger = LogManager.getLogger("TicketDAO");
Expand All @@ -28,7 +27,7 @@ public boolean saveTicket(Ticket ticket){
//ps.setInt(1,ticket.getId());
ps.setInt(1,ticket.getParkingSpot().getId());
ps.setString(2, ticket.getVehicleRegNumber());
ps.setDouble(3, ticket.getPrice());
ps.setFloat(3, Float.parseFloat(Double.toString(ticket.getPrice())));
ps.setTimestamp(4, new Timestamp(ticket.getInTime().getTime()));
ps.setTimestamp(5, (ticket.getOutTime() == null)?null: (new Timestamp(ticket.getOutTime().getTime())) );
return ps.execute();
Expand All @@ -40,12 +39,17 @@ public boolean saveTicket(Ticket ticket){
}
}

public Ticket getTicket(String vehicleRegNumber) {
public Ticket getTicket(String vehicleRegNumber, Boolean closed) {
Connection con = null;
Ticket ticket = null;
PreparedStatement ps;
try {
con = dataBaseConfig.getConnection();
PreparedStatement ps = con.prepareStatement(DBConstants.GET_TICKET);
if(closed) {
ps = con.prepareStatement(DBConstants.GET_LAST_TICKET);
} else {
ps = con.prepareStatement(DBConstants.GET_TICKET);
}
//ID, PARKING_NUMBER, VEHICLE_REG_NUMBER, PRICE, IN_TIME, OUT_TIME)
ps.setString(1,vehicleRegNumber);
ResultSet rs = ps.executeQuery();
Expand All @@ -69,6 +73,28 @@ public Ticket getTicket(String vehicleRegNumber) {
}
}

public Integer getnumberOfTickets(String vehicleRegNumber) {
Connection con = null;
Integer ticketsCount = 0;
try {
con = dataBaseConfig.getConnection();
PreparedStatement ps = con.prepareStatement(DBConstants.COUNT_TICKETS);
//ID, PARKING_NUMBER, VEHICLE_REG_NUMBER, PRICE, IN_TIME, OUT_TIME)
ps.setString(1,vehicleRegNumber);
ResultSet rs = ps.executeQuery();
if(rs.next()) {
ticketsCount = rs.getInt(1);
}
dataBaseConfig.closeResultSet(rs);
dataBaseConfig.closePreparedStatement(ps);
}catch (Exception ex){
logger.error("Error fetching next available slot",ex);
}finally {
dataBaseConfig.closeConnection(con);
return ticketsCount;
}
}

public boolean updateTicket(Ticket ticket) {
Connection con = null;
try {
Expand All @@ -86,4 +112,5 @@ public boolean updateTicket(Ticket ticket) {
}
return false;
}

}
7 changes: 7 additions & 0 deletions src/main/java/com/parkit/parkingsystem/model/Ticket.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class Ticket {
private double price;
private Date inTime;
private Date outTime;
private boolean regularUser;

public int getId() {
return id;
Expand Down Expand Up @@ -58,4 +59,10 @@ public Date getOutTime() {
public void setOutTime(Date outTime) {
this.outTime = outTime;
}

public void setRegularUser(boolean regularUser) {
this.regularUser = regularUser;
}

public boolean getRegularUser() { return regularUser; };
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,38 @@

public class FareCalculatorService {

public void calculateFare(Ticket ticket){
public void calculateFare(Ticket ticket, boolean getDiscount){
if( (ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime())) ){
throw new IllegalArgumentException("Out time provided is incorrect:"+ticket.getOutTime().toString());
}

int inHour = ticket.getInTime().getHours();
int outHour = ticket.getOutTime().getHours();
long inHour = ticket.getInTime().getTime();
long outHour = ticket.getOutTime().getTime();
double durationInMilliseconds = outHour - inHour;

//TODO: Some tests are failing here. Need to check if this logic is correct
int duration = outHour - inHour;
// Convert milliseconds to hour
double duration = durationInMilliseconds/3600000;
double price =0;

switch (ticket.getParkingSpot().getParkingType()){
case CAR: {
ticket.setPrice(duration * Fare.CAR_RATE_PER_HOUR);
break;
// Calculate the price if the duration exceed 30 minutes else the price is still 0
if(duration > 0.5) {
// Remove the first free half hour
duration = duration - 0.5;
switch (ticket.getParkingSpot().getParkingType()){
case CAR: {
price = duration * Fare.CAR_RATE_PER_HOUR;
break;
}
case BIKE: {
price = duration * Fare.BIKE_RATE_PER_HOUR;
break;
}
default: throw new IllegalArgumentException("Unkown Parking Type");
}
case BIKE: {
ticket.setPrice(duration * Fare.BIKE_RATE_PER_HOUR);
break;
if(getDiscount) {
price = 0.95*price;
}
default: throw new IllegalArgumentException("Unkown Parking Type");
}
ticket.setPrice(price);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.Date;

public class InteractiveShell {

private static final Logger logger = LogManager.getLogger("InteractiveShell");


public static void loadInterface(){
logger.info("App initialized!!!");
System.out.println("Welcome to Parking System!");
Expand All @@ -25,11 +28,13 @@ public static void loadInterface(){
int option = inputReaderUtil.readSelection();
switch(option){
case 1: {
parkingService.processIncomingVehicle();
Date inTime = new Date();
parkingService.processIncomingVehicle(inTime);
break;
}
case 2: {
parkingService.processExitingVehicle();
Date outTime = new Date();
parkingService.processExitingVehicle(outTime);
break;
}
case 3: {
Expand Down
36 changes: 22 additions & 14 deletions src/main/java/com/parkit/parkingsystem/service/ParkingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,43 +11,50 @@

import java.util.Date;

import static com.parkit.parkingsystem.constants.Fare.DECIMAL_FORMAT;

public class ParkingService {

private static final Logger logger = LogManager.getLogger("ParkingService");

private static FareCalculatorService fareCalculatorService = new FareCalculatorService();
final static FareCalculatorService fareCalculatorService = new FareCalculatorService();

private InputReaderUtil inputReaderUtil;
private ParkingSpotDAO parkingSpotDAO;
private TicketDAO ticketDAO;
final private InputReaderUtil inputReaderUtil;
final private ParkingSpotDAO parkingSpotDAO;
final private TicketDAO ticketDAO;

public ParkingService(InputReaderUtil inputReaderUtil, ParkingSpotDAO parkingSpotDAO, TicketDAO ticketDAO){
this.inputReaderUtil = inputReaderUtil;
this.parkingSpotDAO = parkingSpotDAO;
this.ticketDAO = ticketDAO;
}

public void processIncomingVehicle() {
public void processIncomingVehicle(Date inTime) {
try{
ParkingSpot parkingSpot = getNextParkingNumberIfAvailable();
if(parkingSpot !=null && parkingSpot.getId() > 0){
String vehicleRegNumber = getVehichleRegNumber();
parkingSpot.setAvailable(false);
parkingSpotDAO.updateParking(parkingSpot);//allot this parking space and mark it's availability as false

Date inTime = new Date();
Ticket ticket = new Ticket();
//ID, PARKING_NUMBER, VEHICLE_REG_NUMBER, PRICE, IN_TIME, OUT_TIME)
//ticket.setId(ticketID);
ticket.setParkingSpot(parkingSpot);
ticket.setVehicleRegNumber(vehicleRegNumber);
ticket.setPrice(0);
ticket.setInTime(inTime);
ticket.setOutTime(null);
ticketDAO.saveTicket(ticket);

Integer allTickets = ticketDAO.getnumberOfTickets(vehicleRegNumber);

if(allTickets > 1) {
System.out.println("Happy to see you again ! As a regular user of our parking you will have a 5% discount");
}

System.out.println("Generated Ticket and saved in DB");
System.out.println("Please park your vehicle in spot number:"+parkingSpot.getId());
System.out.println("Recorded in-time for vehicle number:"+vehicleRegNumber+" is:"+inTime);
System.out.println("Recorded in-time for vehicle number:"+vehicleRegNumber+" is:"+ inTime);
}
}catch(Exception e){
logger.error("Unable to process incoming vehicle",e);
Expand All @@ -60,7 +67,7 @@ private String getVehichleRegNumber() throws Exception {
}

public ParkingSpot getNextParkingNumberIfAvailable(){
int parkingNumber=0;
int parkingNumber;
ParkingSpot parkingSpot = null;
try{
ParkingType parkingType = getVehichleType();
Expand Down Expand Up @@ -97,18 +104,19 @@ private ParkingType getVehichleType(){
}
}

public void processExitingVehicle() {
public void processExitingVehicle(Date outTime) {
try{
String vehicleRegNumber = getVehichleRegNumber();
Ticket ticket = ticketDAO.getTicket(vehicleRegNumber);
Date outTime = new Date();
Ticket ticket = ticketDAO.getTicket(vehicleRegNumber, false);

ticket.setOutTime(outTime);
fareCalculatorService.calculateFare(ticket);
fareCalculatorService.calculateFare(ticket, ticketDAO.getnumberOfTickets(ticket.getVehicleRegNumber()) > 1);
if(ticketDAO.updateTicket(ticket)) {
ParkingSpot parkingSpot = ticket.getParkingSpot();
parkingSpot.setAvailable(true);
parkingSpotDAO.updateParking(parkingSpot);
System.out.println("Please pay the parking fare:" + ticket.getPrice());
String price = DECIMAL_FORMAT.format(ticket.getPrice()).toString();
System.out.println("Please pay the parking fare:" + price);
System.out.println("Recorded out-time for vehicle number:" + ticket.getVehicleRegNumber() + " is:" + outTime);
}else{
System.out.println("Unable to update ticket information. Error occurred");
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/log4j.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Root logger option
log4j.rootLogger=DEBUG, stdout
log4j.rootLogger=debug, stdout

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
Expand Down
Loading