Compare commits

...

74 Commits

Author SHA1 Message Date
e3e7bf5ccd Package script:
tar jar and run.sh
2021-01-11 02:34:41 +03:00
b386665e66 Simple run script for MacOS/Linux 2021-01-11 02:16:07 +03:00
5e1ff6451c Exit Button improved:
Exit button behaviour was just setting flags.
    This caused the program to set the exit flag when
    it is paused and wont exit until the unpause. Some other
    Funky stuff when the sim ends are fixed.
2021-01-05 17:11:43 +03:00
5be16de49f
Prevents OutOfMem (Heap) On my potato laptop. 2021-01-01 00:47:36 +03:00
f4bc812f23 After Sub fixes 2020-12-18 21:38:23 +03:00
f137b07c1e Min/Max for history 2020-12-18 14:57:06 +03:00
c07dc8a87c Fixes 2020-12-18 14:01:52 +03:00
Asaad Dadoush
f30a64a5b5 GUI edit report btn 2020-12-18 07:40:04 +03:00
Asaad Dadoush
dc12b51801 customize GUI 2020-12-18 07:23:06 +03:00
IMXHERO
1745db8700
Merge pull request #30 from AsaadDadoush/master
Add Action for Report btn
2020-12-17 23:25:29 +03:00
Asaad Dadoush
8085b5b951 Add Action for Report btn 2020-12-17 23:06:16 +03:00
EngOsamah
b9c0de4470
GUI_History (#29) 2020-12-17 21:20:32 +03:00
Asaad Dadoush
61f3fd63bd lbl arrived time for araft/hotles 2020-12-17 19:09:15 +03:00
d915e04832 Meeting fixes and new TODO 2020-12-17 14:27:11 +03:00
IMXHERO
67b313aabf
Merge pull request #28 from EngOsamah/master
d
2020-12-17 02:01:52 +03:00
EngOsamah
7e50caf26a a few changes 2020-12-17 01:13:14 +03:00
EngOsamah
1db0ce7ca7 Add toString to GUI_ViewBuses 2020-12-17 01:11:45 +03:00
EngOsamah
67c81d22d6 GUI_ViewRoute 2020-12-16 23:51:17 +03:00
HeshamTB
b3847bad78
Hist view size (#27) 2020-12-16 17:56:09 +03:00
HeshamTB
9cbb063af0
Merge pull request #26 from HeshamTB/browse-hist
Browse hist
2020-12-16 17:44:53 +03:00
a795117895 Hist view with states 2020-12-16 17:42:26 +03:00
9cf847ad46 DataManeger working save load 2020-12-16 16:51:45 +03:00
ab3acdec9b DataManeger:
- DataManeger is static global var in Makkah.
    - Save states in data/ dir.
    - Clear all bin files with constructor.
2020-12-16 16:26:40 +03:00
9a610b65e6 Imports block compile and eclipse project files 2020-12-16 15:58:46 +03:00
9280a5b4b3
WIP: Rework DataMan constructors.
Method to get all saved times.
    Not working.
2020-12-14 06:28:18 +03:00
270e89ee5b
Main view updates every Hour instead of min 2020-12-14 04:40:45 +03:00
HeshamTB
5143ae2891
Pause button and flag check in Checkinput() (#23) 2020-12-14 04:29:56 +03:00
EngOsamah
1d509a124f
GUI_ViewStreet done (#25) 2020-12-14 04:15:12 +03:00
EngOsamah
a695ead32d
Start GUI_ViewStreet class (#24)
Co-authored-by: HeshamTB <38921037+HeshamTB@users.noreply.github.com>
2020-12-11 16:40:25 +03:00
Asaad Dadoush
556dc27d9c edit buses table 2020-12-11 08:18:11 +03:00
ec5888cae2
Prevent exit on (x) ViewBuses and del fx test 2020-12-11 06:31:38 +03:00
HeshamTB
75667bfa10
Merge pull request #22 from EngOsamah/master
GUI_ViewBuses
2020-12-11 06:29:03 +03:00
EngOsamah
f517b8ea00 GUI_ViewBuses 2020-12-11 05:35:18 +03:00
Asaad Dadoush
1b137dce3b new Class for show the buses 2020-12-10 22:19:30 +03:00
Asaad Dadoush
f397003d32 Event for btnHistory(undone)! 2020-12-09 23:29:06 +03:00
Asaad Dadoush
938ffa9b69 organize the code 2020-12-09 22:53:08 +03:00
Asaad Dadoush
73ff93b32a Osamah : Added new Frame to btn View Busses and new class GUI_ViewBuses
some rework in the GUI interface
2020-12-09 22:35:24 +03:00
Asaad Dadoush
f1010ff184 TODO Arrival Time For Each Day 2020-12-09 09:13:41 +03:00
Asaad Dadoush
08f19fd60f Edit GUI 2020-12-09 08:51:54 +03:00
Asaad Dadoush
8656da255a GUI Edit 2020-12-09 08:35:06 +03:00
Asaad Dadoush
9988c9d205 TODO avg for all the Dist 2020-12-09 08:26:53 +03:00
Asaad Dadoush
8df3814395 lbl For Average Trip For Last Hour Value 2020-12-09 08:13:46 +03:00
Asaad Dadoush
309c83d582 lbl Maximum Trip + lbl Minimum Trip 2020-12-09 08:01:39 +03:00
Asaad Dadoush
34c06d2fb0 null Solved 2020-12-09 07:41:24 +03:00
Asaad Dadoush
47e6ffb30f Null Exception why ???? check TODO list in line 1142 2020-12-09 04:45:13 +03:00
Asaad Dadoush
36e44ceab6 add lbl for number of buses + edit district table 2020-12-09 04:05:47 +03:00
Asaad Dadoush
6b7f7eee11 Add Action for ViewRoutes 2020-12-09 01:26:32 +03:00
IMXHERO
4a5b9cf964
Merge pull request #21 from HeshamTB/history-bin
History bin
2020-12-09 01:00:52 +03:00
IMXHERO
89f7946f98
Merge branch 'master' into history-bin 2020-12-09 01:00:28 +03:00
Asaad Dadoush
c5c89e30e8 phase2 sol + frame Color + update the table 2020-12-09 00:56:13 +03:00
Asaad Dadoush
afb8f0982c Add new Table for district 2020-12-08 11:46:58 +03:00
e14ed99d42
Exit Button 2020-12-07 22:33:27 +03:00
54421ee9e6
StreetsFrame/Table (Live updating):
- Move code to GUI inter class.
    - The table updates every minute
2020-12-07 22:18:39 +03:00
HeshamTB
5ab60978dc
Merge pull request #20 from HeshamTB/swing-test
Swing test
2020-12-07 21:50:40 +03:00
HeshamTB
add1264e01
Merge branch 'master' into swing-test 2020-12-07 21:50:25 +03:00
Asaad Dadoush
bb17d9180e edit some swing 2020-12-07 11:13:37 +03:00
Asaad Dadoush
192a482bb4 edit some swing 2020-12-07 11:12:23 +03:00
Asaad Dadoush
7d5f3452ad GUI Woring heeeeeeeee :D 2020-12-07 11:01:20 +03:00
6648832d50
Prevent overwrite of arrival times 2020-12-07 05:15:36 +03:00
72eba421db
Typo 2020-12-07 04:49:32 +03:00
13f46c84dc
GUI nested class to setup for swing GUI 2020-12-07 04:46:51 +03:00
HeshamTB
f06614c390
Merge pull request #18 from EngOsamah/master
Distribute the Buses
2020-12-07 04:46:35 +03:00
da959a5cd3
simple Street table 2020-12-07 03:24:46 +03:00
EngOsamah
b88a33a749 Distribute the Buses 2020-12-07 02:05:51 +03:00
6720b412e6
Typo 2020-12-06 23:03:06 +03:00
HeshamTB
20296571fc
Merge pull request #16 from AsaadDadoush/master
First GUI test
2020-12-06 22:33:38 +03:00
HeshamTB
50e348de8d
Merge pull request #15 from EngOsamah/master
shuffle
2020-12-06 22:31:56 +03:00
Asaad Dadoush
4b9c5a8544 First GUI test 2020-12-06 22:21:50 +03:00
414cf44dae
Load history menu option:
- Browse is still incomplete.
	- There is a bug when selecting a time before the hour 12.
	The time becomes 23:00 ?
2020-12-06 05:38:39 +03:00
53dc294cf1
ignore bin extention 2020-12-06 05:37:54 +03:00
147d45e4fe
DataMan and State:
- Save state of given time.

    Still not tested with recovering saved
    states.
2020-12-06 04:07:49 +03:00
EngOsamah
ee1cb4852c Tasks 2020-12-05 23:54:01 +03:00
EngOsamah
4d736bc21c Shuffle Campaigns 2020-12-05 23:03:09 +03:00
cebf2a272b
ignore 2020-12-05 10:50:14 +03:00
20 changed files with 2324 additions and 53 deletions

6
.classpath Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

3
.gitignore vendored
View File

@ -1,2 +1,5 @@
out/ out/
/bin/ /bin/
*.jpeg
*.zip
*.bin

View File

@ -2,9 +2,6 @@
<artifact type="jar" build-on-make="true" name="Hajj-simulation:jar"> <artifact type="jar" build-on-make="true" name="Hajj-simulation:jar">
<output-path>$PROJECT_DIR$/out/artifacts/Hajj_simulation_jar</output-path> <output-path>$PROJECT_DIR$/out/artifacts/Hajj_simulation_jar</output-path>
<root id="archive" name="Hajj-simulation.jar"> <root id="archive" name="Hajj-simulation.jar">
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/out/META-INF/MANIFEST.MF" />
</element>
<element id="module-output" name="Hajj-simulation" /> <element id="module-output" name="Hajj-simulation" />
</root> </root>
</artifact> </artifact>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

17
.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Hajj-simulation</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

14
package.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
GIT=$(command -v git)
HEAD=$(command -v head)
CUT=$(command -v cut)
JAR_ARTIFACT="out/artifacts/Hajj_simulation_jar/Hajj-simulation.jar"
if [ -z $"GIT" ] || [ -z $"HEAD" ] || [ -z $"CUT" ]; then
echo "Tools missing"
exit 1
else
tar -cvf Hajj-Simulation-$(git log | head -n1 | cut -d' ' -f2).tar.gz $JAR_ARTIFACT run.sh
fi

9
run.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
jav=$(command -v java)
if [ -z "$jav" ]; then
>&2 echo "Can't find java installation"
else
java -jar out/artifacts/Hajj_simulation_jar/Hajj-simulation.jar
fi

View File

@ -33,7 +33,7 @@ public class Bus extends CivilVehicle {
@Override @Override
public String toString() { public String toString() {
StringBuilder s = new StringBuilder(); StringBuilder s = new StringBuilder();
s.append(String.format("\nID: %s, Campaign ID: %s\n",this.getUID() , getCampaign().getUID())); s.append(String.format("ID: %s, Campaign ID: %s\n",this.getUID() , getCampaign().getUID()));
s.append(super.toString()); s.append(super.toString());
return s.toString(); return s.toString();
} }

View File

@ -1,7 +1,8 @@
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
public class Campaign { public class Campaign implements Serializable {
private String UID; private String UID;
private int numberOfAriivedBuses; private int numberOfAriivedBuses;

182
src/DataManeger.java Normal file
View File

@ -0,0 +1,182 @@
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DataManeger {
private File workingDir;
public DataManeger(){
workingDir = new File("./data/");
workingDir.mkdir();
clearData();
}
public boolean stateAvailable(Date time) {
File f = new File(String.format("./data/%s.bin", time.getTime()));
return f.exists();
}
public State loadState(Date time){
State state = null;
if (stateAvailable(time)){
try {
ObjectInputStream objectInputStream = new ObjectInputStream(
new FileInputStream(String.format("./data/%s.bin", time.getTime())));
state = (State)objectInputStream.readObject();
objectInputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
return state;
}
public boolean saveState(State state, Date time){
try {
FileOutputStream fs = new FileOutputStream(String.format("./data/%s.bin", time.getTime()));
BufferedOutputStream bfs = new BufferedOutputStream(fs);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bfs);
objectOutputStream.writeObject(state);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public File[] savedStateFiles() {
return workingDir.listFiles();
}
public Date[] savedStatesTimes() {
File[] files = savedStateFiles();
ArrayList<Date> timesList = new ArrayList<>();
for (File file : files){
if (file.getName().contains(".bin")){
String timeInName = file.getName().replaceAll(".bin", "").trim();
if ("".equals(timeInName)) continue;
long time = Long.parseLong(timeInName);
timesList.add(new HijriDate(time));
}
}
Date[] times = new Date[timesList.size()];
times = timesList.toArray(times);
return times;
}
public List<State> getStates(){
List<State> list = new ArrayList<>();
for (File file : workingDir.listFiles()) {
if (file.getName().contains(".bin")){
try {
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
ObjectInputStream objectInputStream = new ObjectInputStream(bufferedInputStream);
State state = (State) objectInputStream.readObject();
list.add(state);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
return list;
}
private void clearData() {
for (File file : savedStateFiles()) {
if (file.getName().contains(".bin")){
file.delete();
}
}
}
}
class State implements Serializable {
//A better implementation is to make this more general or make Makkah an instance.
private ArrayList<Campaign> listOfCampaigns;
private ArrayList<Vehicle> listOfVehicles;
private ArrayList<Campaign>[] campPerDistrict;
private Route[] stdRoutes;
private Street[] stdStreet;
private Date allArrivedToArafatTime;
private Date allArrivedToHotelsTime;
private Date stateTime;
private String maxTrip;
private String minTrip;
public State(ArrayList<Campaign> listOfCampaigns,
ArrayList<Vehicle> listOfVehicles,
ArrayList<Campaign>[] campPerDistrict,
Route[] stdRoutes,
Street[] stdStreet,
Date allArrivedToArafatTime,
Date allArrivedToHotelsTime,
Date stateTime) {
//Make clones since values may change if this is running on a thread.
this.listOfCampaigns = (ArrayList<Campaign>) listOfCampaigns.clone();
this.listOfVehicles = (ArrayList<Vehicle>) listOfVehicles.clone();
this.campPerDistrict = (ArrayList<Campaign>[])campPerDistrict.clone();
this.stdRoutes = stdRoutes.clone();
this.stdStreet = stdStreet.clone();
if (allArrivedToArafatTime != null) {
this.allArrivedToArafatTime = (Date) allArrivedToArafatTime.clone();
}
if (allArrivedToHotelsTime != null) {
this.allArrivedToHotelsTime = (Date) allArrivedToHotelsTime.clone();
}
this.stateTime = stateTime;
if (Vehicle.getMinArrived() != null && Vehicle.getMaxArrived() != null){
this.maxTrip = Vehicle.getMaxArrived().getTripTime();
this.minTrip = Vehicle.getMinArrived().getTripTime();
}
else {
this.maxTrip = "N/A";
this.minTrip = "N/A";
}
}
public ArrayList<Campaign> getListOfCampaigns() {
return listOfCampaigns;
}
public ArrayList<Vehicle> getListOfVehicles() {
return listOfVehicles;
}
public ArrayList<Campaign>[] getCampPerDistrict() {
return campPerDistrict;
}
public Route[] getStdRoutes() {
return stdRoutes;
}
public Street[] getStdStreet() {
return stdStreet;
}
public Date getAllArrivedToArafatTime() {
return allArrivedToArafatTime;
}
public Date getAllArrivedToHotelsTime() {
return allArrivedToHotelsTime;
}
public Date getStateTime() {
return stateTime;
}
public String getMaxTrip() {
return maxTrip;
}
public String getMinTrip() {
return minTrip;
}
}

56
src/EventControll.java Normal file
View File

@ -0,0 +1,56 @@
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JScrollBar;
import javax.swing.JTextField;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JScrollPane;
public class EventControll {
private JFrame frame;
//private JTextField textField;
private JTextField textField_2;
private JTextField textField_3;
private JTextField textField_4;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
EventControll window = new EventControll();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public EventControll() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
for (int i = 0; i<10 ; i++) {
JTextField textField = new JTextField();
int x =(int)(((double)i/9.0)*255);
textField.setBackground(new Color(255,x,0));
frame.getContentPane().add(textField);
textField.setColumns(10);
}
}
public void setData(Object A) {
//lblNewLabel.setText(A.toString());
}
}

512
src/GUI_History.java Normal file
View File

@ -0,0 +1,512 @@
import java.awt.Color;
import java.awt.Font;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.UIManager;
import java.awt.SystemColor;
public class GUI_History {
private List<State> states;
private State selectedState;
private ArrayList<Campaign> listOfCampaigns;
private ArrayList<Vehicle> listOfVehicles;
private ArrayList<Campaign>[] campPerDistrict;
private Route[] stdRoutes;
private Street[] stdStreet;
private Date currenttimeManager;
private JFrame frame;
private JTable streetTable;
private JTable districtTable;
private JLabel lblDate;
private JLabel lblDestination;
private JLabel lblNumOfBuses;
private JLabel lblNumOfDonebuses;
private JLabel lblMaximumTripValue;
private JLabel lblMinimumTripValue;
private JLabel lblBusesArrivedInTheLastHourValue;
private JLabel lblAverageTripForLastHourValue;
private JLabel lblAverageTimeForTheTrip;
private Object[][] streetData;
private String[] streetColNames = {"Street Name", "Street Load %", "Total", "Buses",
"Local Vehicles","Avg. Time"};
private String[] districtColNames = {"District", "Campaigns", "Busses", "Arrival %",
"Avg. Time", "Best time to Arafat", "Best time to District"};
public GUI_History(List<State> states) {
this.states = states;
makeFrame();
}
private void makeFrame() {
setData(states.get(0));
frame = new JFrame("History");
frame.setBounds(200, 150, 1386, 731);
frame.setLocationRelativeTo(null);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.getContentPane().setLayout(null);
frame.revalidate();
frame.setAutoRequestFocus(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = MakkahCity.avgTimeOnStreet(stdStreet[i]);
}
//District data
Object[][] districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = MakkahCity.busesInDistrict(District.values()[i]);
districtData[i][3] = MakkahCity.getPercentArrival(District.values()[i]);
districtData[i][4] = MakkahCity.getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = MakkahCity.getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = MakkahCity.getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
//tables
//Street table
streetTable = new JTable(streetData,streetColNames);
streetTable.setEnabled(false);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(streetColNames);
streetTable.getTableHeader().setBackground(new Color(17,17,17));
streetTable.getTableHeader().setForeground(Color.WHITE);
streetTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setBackground(new Color(17,17,17));
streetTable.setForeground(Color.white);
streetTable.setSelectionBackground(Color.RED);
streetTable.setGridColor(new Color(102, 102, 102));
streetTable.setSelectionForeground(Color.white);
streetTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setRowHeight(25);
streetTable.setAutoCreateRowSorter(true);
JScrollPane streetScroll = new JScrollPane(streetTable);
streetScroll.setBounds(30,75,1140,329);
frame.getContentPane().add(streetScroll);
//District table
districtTable = new JTable(districtData,districtColNames);
districtTable.setEnabled(false);
districtTable.setForeground(new Color(255, 255, 255));
districtTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.getTableHeader().setBackground(new Color(17,17,17));
districtTable.getTableHeader().setForeground(Color.WHITE);
districtTable.setBackground(new Color(17,17,17));
districtTable.setSelectionBackground(Color.RED);
model.setColumnIdentifiers(districtColNames);
districtTable.setSelectionForeground(Color.white);
districtTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.setGridColor(new Color(102, 102, 102));
JScrollPane districtScroll = new JScrollPane(districtTable);
districtScroll.setEnabled(false);
districtTable.setAutoCreateRowSorter(true);
districtTable.setRowHeight(25);
districtTable.revalidate();
districtScroll.setBounds(30,452,1140,105);
frame.getContentPane().add(districtScroll);
JLabel lblStreets = new JLabel("Streets");
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblStreets.setForeground(new Color(255, 255, 255));
lblStreets.setBounds(30, 44, 208, 30);
frame.getContentPane().add(lblStreets);
JLabel lblDistrict = new JLabel("District");
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblDistrict.setForeground(new Color(255, 255, 255));
lblDistrict.setBounds(30, 425, 166, 29);
frame.getContentPane().add(lblDistrict);
JLabel lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(50, 11, 72, 14);
frame.getContentPane().add(lblTime);
JLabel lblStatus = new JLabel("Status:");
lblStatus.setForeground(new Color(255, 255, 255));
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(423, 9, 72, 18);
frame.getContentPane().add(lblStatus);
lblDestination = new JLabel();
lblDestination.setForeground(new Color(255, 255, 255));
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(477, 9, 184, 18);
frame.getContentPane().add(lblDestination);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setForeground(Color.WHITE);
lblDate.setBounds(100, 8, 326, 21);
frame.getContentPane().add(lblDate);
JLabel lblBuses = new JLabel("Buses: ");
lblBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBuses.setForeground(new Color(255, 255, 255));
lblBuses.setBackground(new Color(192, 192, 192));
lblBuses.setBounds(30, 578, 56, 14);
frame.getContentPane().add(lblBuses);
lblNumOfBuses = new JLabel();
lblNumOfBuses.setText("0");
lblNumOfBuses.setBackground(new Color(0, 0, 0));
lblNumOfBuses.setForeground(new Color(255, 255, 255));
lblNumOfBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumOfBuses.setBounds(79, 579, 90, 12);
frame.getContentPane().add(lblNumOfBuses);
JLabel lblBusesDone = new JLabel("Buses Done:");
lblBusesDone.setForeground(new Color(255, 255, 255));
lblBusesDone.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesDone.setBounds(169, 579, 101, 12);
frame.getContentPane().add(lblBusesDone);
lblNumOfDonebuses = new JLabel();
lblNumOfDonebuses.setText("0");
lblNumOfDonebuses.setForeground(new Color(255, 255, 255));
lblNumOfDonebuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumOfDonebuses.setBounds(259, 577, 80, 16);
frame.getContentPane().add(lblNumOfDonebuses);
JLabel lblMaximumTrip = new JLabel("Maximum Trip:");
lblMaximumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMaximumTrip.setForeground(new Color(255, 255, 255));
lblMaximumTrip.setBounds(30, 619, 112, 22);
frame.getContentPane().add(lblMaximumTrip);
lblMaximumTripValue = new JLabel();
lblMaximumTripValue.setText("-:--");
lblMaximumTripValue.setForeground(new Color(255, 255, 255));
lblMaximumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMaximumTripValue.setBounds(150, 621, 46, 18);
frame.getContentPane().add(lblMaximumTripValue);
JLabel lblMinimumTrip = new JLabel("MinimumTrip:");
lblMinimumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMinimumTrip.setForeground(Color.WHITE);
lblMinimumTrip.setBounds(30, 655, 112, 18);
frame.getContentPane().add(lblMinimumTrip);
lblMinimumTripValue = new JLabel("-:--");
lblMinimumTripValue.setForeground(Color.WHITE);
lblMinimumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMinimumTripValue.setBounds(139, 657, 46, 14);
frame.getContentPane().add(lblMinimumTripValue);
JLabel lblBusesArrivedInTheLastHour = new JLabel("Buses Arrived In The Last Hour:");
lblBusesArrivedInTheLastHour.setForeground(Color.WHITE);
lblBusesArrivedInTheLastHour.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesArrivedInTheLastHour.setBounds(360, 578, 237, 14);
frame.getContentPane().add(lblBusesArrivedInTheLastHour);
lblBusesArrivedInTheLastHourValue = new JLabel();
lblBusesArrivedInTheLastHourValue.setText("0");
lblBusesArrivedInTheLastHourValue.setForeground(Color.WHITE);
lblBusesArrivedInTheLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesArrivedInTheLastHourValue.setBounds(594, 578, 90, 14);
frame.getContentPane().add(lblBusesArrivedInTheLastHourValue);
JLabel lblAverageTripForLastHour = new JLabel("Average Trip For Last Hour:");
lblAverageTripForLastHour.setForeground(Color.WHITE);
lblAverageTripForLastHour.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTripForLastHour.setBackground(Color.BLACK);
lblAverageTripForLastHour.setBounds(206, 621, 208, 18);
frame.getContentPane().add(lblAverageTripForLastHour);
lblAverageTripForLastHourValue = new JLabel("(No Arrivals) In Last Hour");
lblAverageTripForLastHourValue.setForeground(Color.WHITE);
lblAverageTripForLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTripForLastHourValue.setBounds(423, 621, 216, 18);
frame.getContentPane().add(lblAverageTripForLastHourValue);
JLabel lblAvgTime = new JLabel("Average Time For The Trip:");
lblAvgTime.setForeground(Color.WHITE);
lblAvgTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAvgTime.setBounds(206, 650, 208, 29);
frame.getContentPane().add(lblAvgTime);
lblAverageTimeForTheTrip = new JLabel("-:--");
lblAverageTimeForTheTrip.setForeground(Color.WHITE);
lblAverageTimeForTheTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTimeForTheTrip.setBounds(423, 657, 101, 14);
frame.getContentPane().add(lblAverageTimeForTheTrip);
JButton btnViewRoutes = new JButton("View Routes");
btnViewRoutes.setBounds(1195, 75, 166, 30);
btnViewRoutes.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewRoutes.setBackground(new Color(9,9,9));
btnViewRoutes.setForeground(Color.white);
btnViewRoutes.addActionListener(e -> {
GUI_ViewRoute r = new GUI_ViewRoute(stdRoutes ,listOfCampaigns, currenttimeManager);
});
frame.getContentPane().add(btnViewRoutes);
JButton btnViewBuses = new JButton("View Buses");
btnViewBuses.setBounds(1195, 130, 166, 30);
btnViewBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewBuses.setBackground(new Color(9,9,9));
btnViewBuses.setForeground(Color.white);
btnViewBuses.addActionListener(e -> {
GUI_ViewBuses t = new GUI_ViewBuses(listOfCampaigns , currenttimeManager);
});
frame.getContentPane().add(btnViewBuses);
JButton btnViewStreet = new JButton("View Street");
btnViewStreet.setBounds(1195, 185, 166, 29);
btnViewStreet.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewStreet.setBackground(new Color(9,9,9));
btnViewStreet.setForeground(Color.white);
btnViewStreet.addActionListener(e -> {
GUI_ViewStreet t = new GUI_ViewStreet(stdStreet,currenttimeManager);
});
frame.getContentPane().add(btnViewStreet);
JComboBox comboBox = new JComboBox<Date>();
comboBox.setBackground(new Color(150, 150 , 150));
comboBox.setBounds(1143, 11, 217, 33);
for (State state : states) {
comboBox.addItem(state.getStateTime());
}
comboBox.addActionListener(e ->{
setData(states.get(comboBox.getSelectedIndex()));
updateFrame();
});
frame.getContentPane().add(comboBox);
updateFrame();
}
public void setData(State state) {
listOfCampaigns = state.getListOfCampaigns();
listOfVehicles = state.getListOfVehicles();
campPerDistrict = state.getCampPerDistrict();
stdRoutes = state.getStdRoutes();
stdStreet = state.getStdStreet();
currenttimeManager = state.getStateTime();
selectedState = state;
}
public void updateFrame() {
streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = avgTimeOnStreet(stdStreet[i]);
}
streetTable.setModel(new DefaultTableModel(streetData ,streetColNames));
Object[][] districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = busesInDistrict(District.values()[i]);
districtData[i][3] = getPercentArrival(District.values()[i]);
districtData[i][4] = getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
districtTable.setModel(new DefaultTableModel(districtData, districtColNames));
lblDate.setText(currenttimeManager.toString());
String status = "";
if (currenttimeManager.getDay() == 9) {
status = "Heading to Arafat";
}
else{
status = "Heading to Hotels";
}
lblDestination.setText(status);
int numberOfBusses = 0;
for (Campaign campaign : listOfCampaigns) {
numberOfBusses += campaign.getNumberOfBusses();
}
String bus = String.format("%d", numberOfBusses);
lblNumOfBuses.setText(bus);
String numOfdoneBuses = String.format("%d", getNumberOfArrivedBusses());
lblNumOfDonebuses.setText(numOfdoneBuses);
String NumberOfBussPerHour = String.format("%d", getNumberOfArrivedBussesPerHour());
lblBusesArrivedInTheLastHourValue.setText(NumberOfBussPerHour);
lblAverageTripForLastHourValue.setText(avgTimeOfTrip());
lblAverageTimeForTheTrip.setText(getAvgTripForAllDis());
lblMaximumTripValue.setText(selectedState.getMaxTrip());
lblMinimumTripValue.setText(selectedState.getMinTrip());
}
//Methods
public String avgTimeOnStreet(Street street) {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns)
for (Vehicle vehicle : campaign.getArrivedVehicles())
if (vehicle.hasCrossedStreet(street)){
sum += vehicle.getTimeOnStreet(street);
counter++;
}
sum /= counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return street.getFastestTimeOfTravel(new Bus());
return String.format("%02d:%02d", hours, minutes);
}
private int busesInDistrict(District district){
int buses = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]){
buses += campaign.getNumberOfBusses();
}
return buses;
}
private int getPercentArrival(District district) {
int sum = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
sum += campaign.getPercentArrived();
}
return sum/campPerDistrict[district.ordinal()].size();
}
private String getAvgTimeOfTrip(District district){
int sum = 0;
int counter = 1;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return " n/a";
return String.format("%2d:%02d", hours,minutes);
}
private Route getShortestRoute(Campaign campaign, Mashier mashier) {
Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict());
Route route = null;
double min = Double.MAX_VALUE;
for (Route r : routes) {
if (r.getMashier() == mashier){
if (r.getTotalLength() < min) {
min = r.getTotalLength();
route = r;
}
}
}
return route;
}
private Route[] getRoutesToDistrict(District district) {
ArrayList<Route> routes = new ArrayList<>();
for (Route route : stdRoutes) {
if (route.getHotelArea() == district) {
routes.add(route);
}
}
Route[] routesArray = new Route[routes.size()];
return routes.toArray(routesArray);
}
public int getNumberOfArrivedBusses() {
int num = 0;
for (Campaign campaign : listOfCampaigns) {
for (Vehicle vehicle : campaign.getVehicles()){
if (vehicle instanceof Bus &&
vehicle.isArrivedToDest()) num++;
}
}
return num;
}
public int getNumberOfArrivedBussesPerHour() {
Calendar now = new GregorianCalendar();
now.setTime(currenttimeManager);
Calendar from = (GregorianCalendar)now.clone();
from.roll(Calendar.HOUR, -1);
int num = 0;
for (Campaign campaign : listOfCampaigns){
for (Vehicle bus : campaign.getVehicles()){
if (bus.isArrivedToDest() && bus.getTimeOfArrival().before(now.getTime())
&& bus.getTimeOfArrival().after(from.getTime())) {
num++;
}
}
}
return num;
}
public String avgTimeOfTrip() {
//TODO: does output diff value even after all have arrived.
Calendar now = new GregorianCalendar();
now.setTime(currenttimeManager);
Calendar from = (GregorianCalendar)now.clone();
from.roll(Calendar.HOUR, -1);
int counter = 1;
int sum = 0;
for (Campaign campaign : listOfCampaigns){
for (Vehicle bus : campaign.getVehicles()){
if (bus.isArrivedToDest() && bus.getTimeOfArrival().before(now.getTime())
&& bus.getTimeOfArrival().after(from.getTime())) {
long minutes = (bus.getTimeOfArrival().getTime() - bus.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return "(No Arrivals) In Last Hour";
return String.format("%2d:%02d", hours, minutes);
}
public String getAvgTripForAllDis() {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}//Make the following a method since it is the same other method
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return "-:--";
return String.format("%2d:%02d", hours,minutes);
}
}

237
src/GUI_Report.java Normal file
View File

@ -0,0 +1,237 @@
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class GUI_Report {
JFrame frame;
private static ArrayList<Campaign> listOfCampaigns;
private static Route[] stdRoutes;
private JTable streetTable;
private JTable districtTable;
private Street[] stdStreet;
private Date currenttimeManager;
private static ArrayList<Campaign>[] campPerDistrict;
private String[] streetColNames = {"Street Name", "Street Load %", "Total","Buses","Local Vehicles","Avg. Time"};
private String[] districtColNames = {"District", "Campaigns", "Busses", "Arrival %","Avg. Time", "Best time to Arafat", "Best time to District"};
private Object[][] streetData;
private Object[][] districtData;
private JLabel lblDate;
public GUI_Report(ArrayList<Campaign> listOfCampaigns, Route[] stdRoutes, Street[] stdStreet, ArrayList<Campaign>[] campPerDistrict, Date currenttimeManager) {
this.listOfCampaigns = listOfCampaigns;
this.stdRoutes = stdRoutes;
this.stdStreet = stdStreet;
this.campPerDistrict = campPerDistrict;
this.currenttimeManager = currenttimeManager;
makeFrame();
}
private void makeFrame() {
frame = new JFrame("Report");
//Street data
streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = avgTimeOnStreet(stdStreet[i]);
}
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(streetColNames);
//district
districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = busesInDistrict(District.values()[i]);
districtData[i][3] = getPercentArrival(District.values()[i]);
districtData[i][4] = getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
//tables
//Street table
streetTable = new JTable(streetData,streetColNames);
streetTable.setEnabled(false);
streetTable.getTableHeader().setBackground(new Color(17,17,17));
streetTable.getTableHeader().setForeground(Color.WHITE);
streetTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setBackground(new Color(17,17,17));
streetTable.setForeground(Color.white);
streetTable.setGridColor(new Color(102, 102, 102));
streetTable.setSelectionForeground(Color.white);
streetTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setRowHeight(20);
streetTable.setAutoCreateRowSorter(true);
JScrollPane streetScroll = new JScrollPane(streetTable);
streetTable.getColumnModel().getColumn(0).setPreferredWidth(111);
streetTable.getColumnModel().getColumn(1).setPreferredWidth(46);
streetTable.getColumnModel().getColumn(2).setPreferredWidth(1);
streetTable.getColumnModel().getColumn(3).setPreferredWidth(0);
streetTable.getColumnModel().getColumn(4).setPreferredWidth(60);
streetTable.getColumnModel().getColumn(5).setPreferredWidth(0);
streetScroll.setBounds(10,75,809,269);
//District table
districtTable = new JTable(districtData,districtColNames);
districtTable.setEnabled(false);
districtTable.setForeground(new Color(255, 255, 255));
districtTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.getTableHeader().setBackground(new Color(17,17,17));
districtTable.getTableHeader().setForeground(Color.WHITE);
districtTable.setBackground(new Color(17,17,17));
districtTable.setSelectionBackground(Color.RED);
model.setColumnIdentifiers(districtColNames);
districtTable.setSelectionForeground(Color.white);
districtTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.setGridColor(new Color(102, 102, 102));
JScrollPane districtScroll = new JScrollPane(districtTable);
districtScroll.setEnabled(false);
districtTable.setAutoCreateRowSorter(true);
districtTable.getColumnModel().getColumn(0).setPreferredWidth(43);
districtTable.getColumnModel().getColumn(1).setPreferredWidth(30);
districtTable.getColumnModel().getColumn(2).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(3).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(4).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(5).setPreferredWidth(85);
districtTable.getColumnModel().getColumn(6).setPreferredWidth(93);
districtTable.setRowHeight(20);
districtTable.revalidate();
districtScroll.setBounds(10,395,809,89);
//lbl
JLabel lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(50, 11, 72, 14);
//Add Elements
frame.getContentPane().add(streetScroll);
frame.getContentPane().add(districtScroll);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,856,540);
frame.getContentPane().setLayout(null);
JLabel lblStreets = new JLabel("Streets");
lblStreets.setForeground(Color.WHITE);
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblStreets.setBounds(10, 34, 208, 30);
frame.getContentPane().add(lblStreets);
JLabel lblDistrict = new JLabel("District");
lblDistrict.setForeground(Color.WHITE);
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblDistrict.setBounds(10, 355, 166, 29);
frame.getContentPane().add(lblDistrict);
JLabel lblTime_1 = new JLabel("Time:");
lblTime_1.setForeground(Color.WHITE);
lblTime_1.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime_1.setBounds(190, 21, 72, 14);
frame.getContentPane().add(lblTime_1);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setForeground(Color.WHITE);
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setBounds(238, 18, 326, 21);
frame.getContentPane().add(lblDate);
frame.setLocationRelativeTo(null);
frame.revalidate();
frame.setLocation(100,150);
frame.setAutoRequestFocus(false);
frame.setVisible(true);
}
//Methods
public static String avgTimeOnStreet(Street street) {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns)
for (Vehicle vehicle : campaign.getArrivedVehicles())
if (vehicle.hasCrossedStreet(street)){
sum += vehicle.getTimeOnStreet(street);
counter++;
}
sum /= counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return street.getFastestTimeOfTravel(new Bus());
return String.format("%02d:%02d", hours, minutes);
}
private static int busesInDistrict(District district){
int buses = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]){
buses += campaign.getNumberOfBusses();
}
return buses;
}
private static int getPercentArrival(District district) {
int sum = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
sum += campaign.getPercentArrived();
}
return sum/campPerDistrict[district.ordinal()].size();
}
private static String getAvgTimeOfTrip(District district){
int sum = 0;
int counter = 1;
for (Campaign campaign : campPerDistrict[district.ordinal()]) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return " n/a";
return String.format("%2d:%02d", hours,minutes);
}
private static Route getShortestRoute(Campaign campaign, Mashier mashier) {
Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict());
Route route = null;
double min = Double.MAX_VALUE;
for (Route r : routes) {
if (r.getMashier() == mashier){
if (r.getTotalLength() < min) {
min = r.getTotalLength();
route = r;
}
}
}
return route;
}
private static Route[] getRoutesToDistrict(District district) {
ArrayList<Route> routes = new ArrayList<>();
for (Route route : stdRoutes) {
if (route.getHotelArea() == district) {
routes.add(route);
}
}
Route[] routesArray = new Route[routes.size()];
return routes.toArray(routesArray);
}
}

224
src/GUI_ViewBuses.java Normal file
View File

@ -0,0 +1,224 @@
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Calendar;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import java.awt.Color;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.JTextField;
import javax.swing.DropMode;
import javax.swing.JTextPane;
public class GUI_ViewBuses {
private JFrame frame;
private ArrayList<Vehicle> vehicles = new ArrayList<>();
private ArrayList<Vehicle> vehiclesAlazizya = new ArrayList<>();
private ArrayList<Vehicle> vehiclesAlhijra = new ArrayList<>();
private ArrayList<Vehicle> vehiclesAlmansoor = new ArrayList<>();
private Date currenttimeManager;
private JTable table;
private Object[][] busData;
private String[] busColNames = {"ID", "Street", "location","Progress", "trip time", "Arrive Time"};
private JButton Alazizya;
private JButton Alhijra;
private JButton Almansoor;
private JLabel lblTime;
private JLabel lblDate;
private JLabel lblStatus;
private JLabel lblDestination;
private JLabel lblDistrict;
private JLabel lblDistrictValue;
private JTextPane textPane;
public GUI_ViewBuses(ArrayList<Campaign> campaign , Date currenttimeManager) {
for (Campaign camp : campaign) {
switch (camp.getHotelDistrict()) {
case ALAZIZIYA:
vehiclesAlazizya.add(camp.getVehicles().get(0));
break;
case ALHIJRA:
vehiclesAlhijra.add(camp.getVehicles().get(0));
break;
case ALMANSOOR:
vehiclesAlmansoor.add(camp.getVehicles().get(0));
break;
default:
break;
}
}
this.currenttimeManager = currenttimeManager;
makeFrame();
}
private void makeFrame() {
frame = new JFrame("Buses");
table = new JTable(busData,busColNames);
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(busColNames);
ListSelectionModel model2 = table.getSelectionModel();
model2.addListSelectionListener(e -> {
if (!model2.isSelectionEmpty()) {
int row = model2.getMinSelectionIndex();
textPane.setText(((Bus)vehicles.get(row)).toString());
}
});
table.getTableHeader().setBackground(new Color(17,17,17));
table.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
table.getTableHeader().setForeground(Color.WHITE);
table.setModel(new DefaultTableModel(busData ,busColNames));
table.setBackground(new Color(17,17,17));
table.setForeground(Color.WHITE);
table.setGridColor(new Color(102, 102, 102));
table.setFont(new Font("Rockwell", Font.PLAIN, 18));
table.setRowHeight(25);
table.setAutoCreateRowSorter(true);
table.revalidate();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.getVerticalScrollBar().setBackground(new Color(17,17,17));
scrollPane.setBounds(20, 24, 887, 236);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,972,454);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(scrollPane);
Alazizya = new JButton("Alazizya");
Alazizya.setBackground(new Color(9,9,9));
Alazizya.setFont(new Font("Rockwell", Font.PLAIN, 16));
Alazizya.setForeground(Color.white);
Alazizya.setBounds(20, 366, 116, 23);
Alazizya.addActionListener(e -> {
if (vehiclesAlazizya.get(0).getRoute() != null)
updateVehicles(vehiclesAlazizya);
});
frame.getContentPane().add(Alazizya);
Alhijra = new JButton("Alhijra");
Alhijra.setBackground(new Color(9,9,9));
Alhijra.setFont(new Font("Rockwell", Font.PLAIN, 16));
Alhijra.setForeground(Color.white);
Alhijra.setBounds(20, 269, 116, 23);
Alhijra.addActionListener(e -> {
if (vehiclesAlhijra.get(0).getRoute() != null)
updateVehicles(vehiclesAlhijra);
});
frame.getContentPane().add(Alhijra);
Almansoor = new JButton("Almansoor");
Almansoor.setBackground(new Color(9,9,9));
Almansoor.setFont(new Font("Rockwell", Font.PLAIN, 16));
Almansoor.setForeground(Color.white);
Almansoor.setBounds(20, 316, 116, 23);
Almansoor.addActionListener(e -> {
if (vehiclesAlmansoor.get(0).getRoute() != null)
updateVehicles(vehiclesAlmansoor);
});
frame.getContentPane().add(Almansoor);
lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(180, 273, 72, 14);
frame.getContentPane().add(lblTime);
lblStatus = new JLabel("Status:");
lblStatus.setForeground(new Color(255, 255, 255));
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(180, 317, 72, 18);
frame.getContentPane().add(lblStatus);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setForeground(Color.WHITE);
lblDate.setBounds(235, 270, 326, 21);
frame.getContentPane().add(lblDate);
lblDestination = new JLabel();
lblDestination.setForeground(Color.WHITE);
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(235, 317, 184, 18);
frame.getContentPane().add(lblDestination);
Calendar cal = new GregorianCalendar();
cal.setTime(currenttimeManager);
if (cal.get(Calendar.DAY_OF_MONTH) == 9)
lblDestination.setText("Heading to Arafat");
else lblDestination.setText("Heading to Hotels");
lblDistrict = new JLabel("District: ");
lblDistrict.setForeground(Color.WHITE);
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDistrict.setBackground(Color.LIGHT_GRAY);
lblDistrict.setBounds(180, 370, 72, 14);
frame.getContentPane().add(lblDistrict);
lblDistrictValue = new JLabel();
lblDistrictValue.setForeground(Color.WHITE);
lblDistrictValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDistrictValue.setBackground(Color.BLACK);
lblDistrictValue.setBounds(247, 371, 129, 12);
frame.getContentPane().add(lblDistrictValue);
textPane = new JTextPane();
textPane.setFont(new Font("Rockwell", Font.PLAIN, 16));
textPane.setForeground(Color.WHITE);
textPane.setBackground(Color.BLACK);
JScrollPane scrolltext = new JScrollPane(textPane);
scrolltext.setBounds(523, 271, 384, 133);
frame.getContentPane().add(scrolltext);
frame.setVisible(true);
}
public void updateTable() {
busData = new Object[vehicles.size()][6];
for (int i = 0; i < vehicles.size(); i++) {
busData[i][0] = vehicles.get(i).getUID();
if (vehicles.get(i).isMoving())
busData[i][1] = vehicles.get(i).getCurrentStreet().getName();
else busData[i][1] = "Not Moving";
busData[i][2] = vehicles.get(i).getCurrentLocation();
if (vehicles.get(i).getProgress() != null)
busData[i][3] = vehicles.get(i).getProgress();
else busData[i][3] = "%0";
busData[i][4] = vehicles.get(i).getTripTime();
if (vehicles.get(i).isArrivedToDest())
busData[i][5] = getShortTime(vehicles.get(i).getTimeOfArrival());
else busData[i][5] = "NOT Arrived";
}
table.setModel(new DefaultTableModel(busData ,busColNames));
}
public void updateVehicles(ArrayList<Vehicle> vehiclesDistrict) {
vehicles.clear();
vehicles.addAll(vehiclesDistrict);
lblDistrictValue.setText(((Bus)vehiclesDistrict.get(0)).getCampaign().getHotelDistrict().name());
lblDate.setText(currenttimeManager.toString());
updateTable();
}
private String getShortTime(Date time) {
Calendar cal = new GregorianCalendar();
cal.setTime(time);
return String.format("%02d:%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE));
}
}

127
src/GUI_ViewRoute.java Normal file
View File

@ -0,0 +1,127 @@
import java.awt.Color;
import java.awt.Font;
import java.util.Date;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTextField;
import javax.swing.JScrollBar;
public class GUI_ViewRoute {
JFrame frame;
private String[] routeColNames = {"Num", "Status", "Length","Capacity", "Best Time", "Used By"};
private Object[][] routeData;
private JTable table;
private Route[] stdRoute;
private Date currenttimeManager;
private ArrayList<Campaign> listOfCampaigns;
private JTextField txtStreets;
private JLabel lblDate;
private JLabel lblTime;
public GUI_ViewRoute(Route[] stdRoute, ArrayList<Campaign> listOfCampaigns, Date currenttimeManager) {
this.stdRoute = stdRoute;
this.listOfCampaigns = listOfCampaigns;
this.currenttimeManager = currenttimeManager;
makeFrame();
}
private void makeFrame() {
frame = new JFrame("Routes");
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,815,480);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
routeData = new Object[stdRoute.length][6];
for (int i = 0; i < stdRoute.length; i++) {
routeData[i][0] = i;
routeData[i][1] = String.format("%s : %s",stdRoute[i].getHotelArea(),stdRoute[i].getMashier());
routeData[i][2] = stdRoute[i].getTotalLength();
routeData[i][3] = String.format("%.2f",stdRoute[i].capcity());
routeData[i][4] = stdRoute[i].getFastestTimeOfTravel(new Bus());
int count = 0;
for (Campaign campaign : listOfCampaigns)
if (campaign.getRoute() == stdRoute[i])
count += campaign.getVehicles().size();
routeData[i][5] = String.format("%d buses", count);
}
table = new JTable(routeData,routeColNames);
table.setModel(new DefaultTableModel(routeData,routeColNames));
table.getColumnModel().getColumn(0).setPreferredWidth(30);
table.getColumnModel().getColumn(1).setPreferredWidth(190);
table.getColumnModel().getColumn(2).setPreferredWidth(55);
table.getColumnModel().getColumn(3).setPreferredWidth(57);
table.getColumnModel().getColumn(5).setPreferredWidth(75);
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(routeColNames);
ListSelectionModel model2 = table.getSelectionModel();
model2.addListSelectionListener(e -> {
int row = model2.getMinSelectionIndex();
String streets = "";
for (Street street : stdRoute[row].getStreets())
streets += street.getName().name() +" >> ";
if (stdRoute[row].getMashier() == Mashier.ARAFAT)
txtStreets.setText(stdRoute[row].getHotelArea().name()+" >> "+streets+stdRoute[row].getMashier().name());
else txtStreets.setText(stdRoute[row].getMashier().name()+" >> "+streets+stdRoute[row].getHotelArea().name());
});
table.getTableHeader().setBackground(new Color(17,17,17));
table.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
table.getTableHeader().setForeground(Color.WHITE);
table.setBackground(new Color(17,17,17));
table.setForeground(Color.WHITE);
table.setGridColor(new Color(102, 102, 102));
table.setFont(new Font("Rockwell", Font.PLAIN, 18));
table.setRowHeight(25);
table.setAutoCreateRowSorter(true);
table.revalidate();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(10, 44, 755, 300);
frame.getContentPane().add(scrollPane);
txtStreets = new JTextField("Select Route");
txtStreets.setBackground(Color.BLACK);
txtStreets.setForeground(Color.WHITE);
txtStreets.setFont(new Font("Rockwell", Font.PLAIN, 17));
txtStreets.setBounds(10, 382, 755, 48);
frame.getContentPane().add(txtStreets);
txtStreets.setColumns(10);
lblTime = new JLabel("Time:");
lblTime.setForeground(Color.WHITE);
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setBounds(10, 11, 72, 20);
frame.getContentPane().add(lblTime);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setForeground(Color.WHITE);
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setBounds(61, 11, 326, 20);
frame.getContentPane().add(lblDate);
JLabel lblStreets = new JLabel("Streets :");
lblStreets.setForeground(Color.WHITE);
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStreets.setBounds(10, 355, 72, 20);
frame.getContentPane().add(lblStreets);
frame.setVisible(true);
}
}

272
src/GUI_ViewStreet.java Normal file
View File

@ -0,0 +1,272 @@
import java.awt.Color;
import java.awt.Font;
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.JTextField;
import javax.swing.JLabel;
public class GUI_ViewStreet {
private JFrame frame;
private Street street;
private ArrayList<Vehicle> vehicles = new ArrayList<>();
private Street[] stdStreet = new Street[StreetNames.values().length];
private Date currenttimeManager;
private Object[][] vehicleData;
private String[] vehicleColNames = {"ID", "District", "location","Progress", "trip time"};
private JTable table;
private JLabel lblCapcityValue;
private JLabel lblDate;
private JLabel lblLanesValue;
private JLabel lblNumVehicles;
private JLabel lblLengthValue;
private JTextField txtLow;
private JTextField[] textFieldArray = new JTextField[20];
private JTextField txtHigh;
public GUI_ViewStreet(Street[] streets, Date currenttimeManager) {
stdStreet = streets.clone();
this.currenttimeManager = (Date) currenttimeManager.clone();
makeFrame();
}
private void makeFrame() {
//street = stdStreet[0];
frame = new JFrame("Streets");
frame.getContentPane().setBackground(new Color(50,50,50));
frame.getContentPane().setForeground(new Color(0, 0, 0));
frame.setBounds(100,100,815,480);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
vehicleData = new Object[vehicles.size()][6];
for (int i = 0; i < vehicles.size(); i++) {
vehicleData[i][0] = vehicles.get(i).getUID();
if (vehicles.get(i) instanceof Bus)
vehicleData[i][1] = ((Bus)vehicles.get(i)).getCampaign().getHotelDistrict().name();
else vehicleData[i][1] = "Local Vehicle";
vehicleData[i][2] = vehicles.get(i).getCurrentLocation();
vehicleData[i][3] = vehicles.get(i).getProgress();
vehicleData[i][4] = vehicles.get(i).getTripTime();
}
table = new JTable(vehicleData,vehicleColNames);
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(vehicleColNames);
table.getTableHeader().setBackground(new Color(17,17,17));
table.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
table.getTableHeader().setForeground(Color.WHITE);
table.setModel(new DefaultTableModel(vehicleData ,vehicleColNames));
table.setBackground(new Color(17,17,17));
table.setForeground(Color.WHITE);
table.setGridColor(new Color(102, 102, 102));
table.setFont(new Font("Rockwell", Font.PLAIN, 18));
table.setRowHeight(25);
table.setAutoCreateRowSorter(true);
table.revalidate();
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(10, 194, 755, 236);
frame.getContentPane().add(scrollPane);
JList list = new JList();
list.setFont(new Font("Tahoma", Font.PLAIN, 14));
list.setBackground(Color.GRAY);
list.setModel(new AbstractListModel() {
Street[] streets = stdStreet;
public int getSize() {
return stdStreet.length;
}
public Object getElementAt(int index) {
return streets[index].getName().name();
}
});
list.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
street = stdStreet[list.getSelectedIndex()];
vehicles = street.getVehicles();
updateTable();
for (int i = 0; i < textFieldArray.length; i++) {
int colorFactor = (int)((1-capcityPoint(i))*255);
textFieldArray[i].setBackground(new Color(255,colorFactor,0));
}
lblCapcityValue.setText(String.format("%%%d", street.getPercentRemainingCapacity()));
lblDate.setText(currenttimeManager.toString());
lblNumVehicles.setText(String.format("%d", street.getVehicles().size()));
lblLengthValue.setText(String.format("%.2f", street.getLength()));
lblLanesValue.setText(String.format("%d", street.getNumberOfLanes()));
}
});
list.setBounds(10, 11, 118, 146);
JScrollPane scrollList = new JScrollPane(list);
scrollList.setBounds(10, 11, 173, 172);
frame.getContentPane().add(scrollList);
txtLow = new JTextField("Low");
txtLow.setFont(new Font("Rockwell", Font.BOLD, 13));
txtLow.setDisabledTextColor(Color.BLACK);
txtLow.setEnabled(false);
txtLow.setEditable(false);
txtLow.setBackground(Color.YELLOW);
txtLow.setBounds(710, 105, 40, 20);
frame.getContentPane().add(txtLow);
txtHigh = new JTextField("High");
txtHigh.setFont(new Font("Rockwell", Font.BOLD, 13));
txtHigh.setDisabledTextColor(Color.BLACK);
txtHigh.setEnabled(false);
txtHigh.setEditable(false);
txtHigh.setColumns(0);
txtHigh.setBackground(Color.RED);
txtHigh.setBounds(710, 80, 40, 20);
frame.getContentPane().add(txtHigh);
JLabel lblTime = new JLabel("Time:");
lblTime.setForeground(Color.WHITE);
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setBounds(193, 11, 72, 20);
frame.getContentPane().add(lblTime);
lblDate = new JLabel(currenttimeManager.toString());
lblDate.setForeground(Color.WHITE);
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setBounds(243, 11, 326, 20);
frame.getContentPane().add(lblDate);
JLabel lblStatus = new JLabel("Status:");
lblStatus.setForeground(Color.WHITE);
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(511, 11, 72, 20);
frame.getContentPane().add(lblStatus);
JLabel lblDestination = new JLabel();
lblDestination.setForeground(Color.WHITE);
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(568, 11, 184, 20);
Calendar cal = new GregorianCalendar();
cal.setTime(currenttimeManager);
if (cal.get(Calendar.DAY_OF_MONTH) == 9)
lblDestination.setText("Heading to Arafat");
else lblDestination.setText("Heading to Hotels");
frame.getContentPane().add(lblDestination);
JLabel lblCapcity = new JLabel("Capcity:");
lblCapcity.setForeground(Color.WHITE);
lblCapcity.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblCapcity.setBounds(193, 45, 72, 20);
frame.getContentPane().add(lblCapcity);
lblCapcityValue = new JLabel();
lblCapcityValue.setForeground(Color.WHITE);
lblCapcityValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblCapcityValue.setBounds(258, 45, 48, 20);
frame.getContentPane().add(lblCapcityValue);
JLabel lblVehicles = new JLabel("Vehicles: ");
lblVehicles.setForeground(Color.WHITE);
lblVehicles.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblVehicles.setBounds(370, 45, 72, 20);
frame.getContentPane().add(lblVehicles);
lblNumVehicles = new JLabel();
lblNumVehicles.setForeground(Color.WHITE);
lblNumVehicles.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumVehicles.setBounds(441, 45, 61, 20);
frame.getContentPane().add(lblNumVehicles);
JLabel lblLength = new JLabel("Length:");
lblLength.setForeground(Color.WHITE);
lblLength.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLength.setBounds(193, 85, 61, 20);
frame.getContentPane().add(lblLength);
lblLengthValue = new JLabel();
lblLengthValue.setForeground(Color.WHITE);
lblLengthValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLengthValue.setBounds(253, 85, 93, 20);
frame.getContentPane().add(lblLengthValue);
JLabel lblLanes = new JLabel("Lanes");
lblLanes.setForeground(Color.WHITE);
lblLanes.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLanes.setBounds(370, 85, 61, 20);
frame.getContentPane().add(lblLanes);
lblLanesValue = new JLabel();
lblLanesValue.setForeground(Color.WHITE);
lblLanesValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblLanesValue.setBounds(431, 85, 26, 20);
frame.getContentPane().add(lblLanesValue);
JLabel lbl100 = new JLabel();
lbl100.setText("%100");
lbl100.setForeground(Color.WHITE);
lbl100.setFont(new Font("Rockwell", Font.PLAIN, 16));
lbl100.setBounds(715, 170, 45, 15);
frame.getContentPane().add(lbl100);
JLabel lbl0 = new JLabel();
lbl0.setText("%0");
lbl0.setForeground(Color.WHITE);
lbl0.setFont(new Font("Rockwell", Font.PLAIN, 16));
lbl0.setBounds(193, 170, 25, 15);
frame.getContentPane().add(lbl0);
JLabel lblCapcityPoint = new JLabel("CapcityPoint:");
lblCapcityPoint.setForeground(Color.WHITE);
lblCapcityPoint.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblCapcityPoint.setBounds(193, 120, 101, 20);
frame.getContentPane().add(lblCapcityPoint);
for (int i = 0; i < textFieldArray.length; i++) {
textFieldArray[i] = new JTextField();
textFieldArray[i].setEnabled(false);
textFieldArray[i].setEditable(false);
textFieldArray[i].setBackground(new Color(70, 70, 70));
textFieldArray[i].setBounds(190+i*28, 142, 28, 20);
frame.getContentPane().add(textFieldArray[i]);
textFieldArray[i].setColumns(0);
}
frame.setVisible(true);
}
public void updateTable() {
if (vehicles.isEmpty()) return;
vehicleData = new Object[vehicles.size()][6];
for (int i = 0; i < vehicles.size(); i++) {
vehicleData[i][0] = vehicles.get(i).getUID();// TODO: There is an Exception error here;
if (vehicles.get(i) instanceof Bus)
vehicleData[i][1] = ((Bus)vehicles.get(i)).getCampaign().getHotelDistrict().name();
else vehicleData[i][1] = "Local Vehicle";
vehicleData[i][2] = vehicles.get(i).getCurrentLocation();
vehicleData[i][3] = vehicles.get(i).getProgress();
vehicleData[i][4] = vehicles.get(i).getTripTime();
}
table.setModel(new DefaultTableModel(vehicleData ,vehicleColNames));
}
public double capcityPoint(int x) {
double part = street.getLength()/20;
double capcity = street.capcityPoint(x*part, (x+1)*part);
return capcity;
}
}

View File

@ -1,7 +1,11 @@
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*; import java.util.*;
public class MakkahCity { public class MakkahCity {
private static final ArrayList<Campaign> listOfCampaigns = new ArrayList<>(); private static final ArrayList<Campaign> listOfCampaigns = new ArrayList<>();
@ -26,9 +30,33 @@ public class MakkahCity {
private static final InputListener inputListener = new InputListener(); private static final InputListener inputListener = new InputListener();
private static final Thread t = new Thread(inputListener,"InputThread-Makkah"); private static final Thread t = new Thread(inputListener,"InputThread-Makkah");
private static boolean isAllRoutSet;
private static final DataManeger dataManeger = new DataManeger();
private static volatile boolean done_flag;
//GUI
private static boolean exit_flag;
private static boolean pause_flag;
private static Checkbox autoModeCheckBox;
private static JFrame makkahFrame;
private static JTable streetTable;
private static JTable districtTable;
private static JLabel lblDate;
private static JLabel lblDestination;
private static JLabel lblNumOfBuses;
private static JLabel lblNumOfDonebuses;
private static JLabel lblMaximumTripValue;
private static JLabel lblMinimumTripValue;
private static JLabel lblBusesArrivedInTheLastHourValue;
private static JLabel lblAverageTripForLastHourValue;
private static JButton btnPause;
private static JLabel lblAverageTimeForTheTrip;
private static JLabel lblArrivedToArafatTime;
private static JLabel lblArrivedToHotelsTime;
public static void main(String[] args) { public static void main(String[] args) {
//TODO: fix state errors
t.start(); t.start();
//Gen Camp //Gen Camp
campPerDistrict[District.ALMANSOOR.ordinal()] = new ArrayList<>(); campPerDistrict[District.ALMANSOOR.ordinal()] = new ArrayList<>();
@ -38,6 +66,8 @@ public class MakkahCity {
generateCamps(District.ALMANSOOR, (int)getRandom(1600, 1800)); generateCamps(District.ALMANSOOR, (int)getRandom(1600, 1800));
generateCamps(District.ALHIJRA, (int)getRandom(1400, 1600)); generateCamps(District.ALHIJRA, (int)getRandom(1400, 1600));
Collections.shuffle(listOfCampaigns);
fillBusesToList(); fillBusesToList();
makeStreets(); makeStreets();
@ -46,22 +76,375 @@ public class MakkahCity {
makeRoutes(); makeRoutes();
//GUI
autoModeCheckBox = new Checkbox();
makkahFrame = new JFrame("Hajj Simulation");
//Street data and district for GUI table
//Street data
Object[][] streetData = new Object[stdStreet.length][6];
String[] streetColNames = {"Street Name", "Street Load %", "Total", "Buses",
"Local Vehicles","Avg. Time"};
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = avgTimeOnStreet(stdStreet[i]);
}
//District data
Object[][] districtData = new Object[campPerDistrict.length][7];
String[] districtColNames = {"District", "Campaigns", "Busses", "Arrival %",
"Avg. Time", "Best time to Arafat", "Best time to District"};
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = busesInDistrict(District.values()[i]);
districtData[i][3] = getPercentArrival(District.values()[i]);
districtData[i][4] = getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
//tables
//Street table
streetTable = new JTable(streetData,streetColNames);
streetTable.setEnabled(false);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(streetColNames);
streetTable.getTableHeader().setBackground(new Color(17,17,17));
streetTable.getTableHeader().setForeground(Color.WHITE);
streetTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setBackground(new Color(17,17,17));
streetTable.setForeground(Color.white);
streetTable.setSelectionBackground(Color.RED);
streetTable.setGridColor(new Color(102, 102, 102));
streetTable.setSelectionForeground(Color.white);
streetTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
streetTable.setRowHeight(20);
streetTable.setAutoCreateRowSorter(true);
streetTable.getColumnModel().getColumn(0).setPreferredWidth(111);
streetTable.getColumnModel().getColumn(1).setPreferredWidth(46);
streetTable.getColumnModel().getColumn(2).setPreferredWidth(1);
streetTable.getColumnModel().getColumn(3).setPreferredWidth(0);
streetTable.getColumnModel().getColumn(4).setPreferredWidth(60);
streetTable.getColumnModel().getColumn(5).setPreferredWidth(0);
JScrollPane streetScroll = new JScrollPane(streetTable);
streetScroll.setBounds(22,100,809,269);
//District table
districtTable = new JTable(districtData,districtColNames);
districtTable.setEnabled(false);
districtTable.setForeground(new Color(255, 255, 255));
districtTable.getTableHeader().setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.getTableHeader().setBackground(new Color(17,17,17));
districtTable.getTableHeader().setForeground(Color.WHITE);
districtTable.setBackground(new Color(17,17,17));
districtTable.setSelectionBackground(Color.RED);
model.setColumnIdentifiers(districtColNames);
districtTable.setSelectionForeground(Color.white);
districtTable.setFont(new Font("Rockwell", Font.PLAIN, 18));
districtTable.setGridColor(new Color(102, 102, 102));
JScrollPane districtScroll = new JScrollPane(districtTable);
districtScroll.setEnabled(false);
districtTable.setAutoCreateRowSorter(true);
districtTable.setRowHeight(20);
districtTable.getColumnModel().getColumn(0).setPreferredWidth(43);
districtTable.getColumnModel().getColumn(1).setPreferredWidth(30);
districtTable.getColumnModel().getColumn(2).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(3).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(4).setPreferredWidth(0);
districtTable.getColumnModel().getColumn(5).setPreferredWidth(85);
districtTable.getColumnModel().getColumn(6).setPreferredWidth(93);
districtTable.revalidate();
districtScroll.setBounds(22,420,809,89);
//Buttons
JButton btnViewRoutes = new JButton("View Routes");
btnViewRoutes.setBounds(888, 33, 166, 29);
btnViewRoutes.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewRoutes.setBackground(new Color(9,9,9));
btnViewRoutes.setForeground(Color.white);
btnViewRoutes.addActionListener(e -> {
GUI_ViewRoute r = new GUI_ViewRoute(stdRoutes ,listOfCampaigns,currenttimeManager.getCurrentTime());
pause_flag = true;
btnPause.setText("Unpause");
});
JButton btnViewBuses = new JButton("View Buses");
btnViewBuses.setBounds(888, 73, 166, 29);
btnViewBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewBuses.setBackground(new Color(9,9,9));
btnViewBuses.setForeground(Color.white);
btnViewBuses.addActionListener(e -> {
GUI_ViewBuses t = new GUI_ViewBuses(listOfCampaigns , currenttimeManager.getCurrentTime());
pause_flag = true;
btnPause.setText("Unpause");
});
JButton btnViewReport = new JButton("View Report");
btnViewReport.setBounds(888, 153, 166, 29);
btnViewReport.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewReport.setBackground(new Color(9,9,9));
btnViewReport.setForeground(Color.white);
btnViewReport.addActionListener(e -> {
GUI_Report r = new GUI_Report(listOfCampaigns, stdRoutes, stdStreet, campPerDistrict, currenttimeManager.getCurrentTime());
pause_flag = true;
btnPause.setText("Unpause");
});
JButton btnViewStreet = new JButton("View Street");
btnViewStreet.setBounds(888, 113, 166, 29);
btnViewStreet.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnViewStreet.setBackground(new Color(9,9,9));
btnViewStreet.setForeground(Color.white);
btnViewStreet.addActionListener(e -> {
GUI_ViewStreet t = new GUI_ViewStreet(stdStreet,currenttimeManager.getCurrentTime());
pause_flag = true;
btnPause.setText("Unpause");
});
JButton btnExit = new JButton("Exit");
btnExit.setBackground(new Color(9,9,9));
btnExit.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnExit.setForeground(Color.white);
btnExit.setBounds(888, 623, 166, 29);
btnExit.addActionListener(actionEvent -> {
if (pause_flag || done_flag) System.exit(0);
else exit_flag = true;
});
btnPause = new JButton("Pause");
btnPause.setBackground(new Color(9,9,9));
btnPause.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnPause.setForeground(Color.white);
btnPause.setBounds(888, 233, 166, 29);
btnPause.addActionListener(actionEvent -> {
if (!pause_flag) {
pause_flag = true;
btnPause.setText("Unpause");
}
else {
pause_flag = false;
btnPause.setText("Pause");
}
});
JButton btnBrowseHistory = new JButton("Browse History");
btnBrowseHistory.setBounds(888, 193, 166, 29);
btnBrowseHistory.setBackground(new Color(9,9,9));
btnBrowseHistory.setFont(new Font("Rockwell", Font.PLAIN, 16));
btnBrowseHistory.setForeground(Color.white);
btnBrowseHistory.addActionListener(e -> {
GUI_History hist = new GUI_History(dataManeger.getStates());
pause_flag = true;
btnPause.setText("Unpause");
});
//Label
JLabel lblStreets = new JLabel("Streets");
lblStreets.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblStreets.setForeground(new Color(255, 255, 255));
lblStreets.setBounds(22, 59, 208, 30);
JLabel lblDistrict = new JLabel("District");
lblDistrict.setFont(new Font("Rockwell", Font.PLAIN, 24));
lblDistrict.setForeground(new Color(255, 255, 255));
lblDistrict.setBounds(22, 380, 166, 29);
JLabel lblTime = new JLabel("Time:");
lblTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblTime.setForeground(new Color(255, 255, 255));
lblTime.setBounds(22, 11, 72, 14);
JLabel lblStatus = new JLabel("Status:");
lblStatus.setForeground(new Color(255, 255, 255));
lblStatus.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblStatus.setBounds(343, 9, 72, 18);
lblDestination = new JLabel();
lblDestination.setForeground(new Color(255, 255, 255));
lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDestination.setBounds(408, 9, 184, 18);
lblDate = new JLabel(currenttimeManager.getCurrentTime().toString());
lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblDate.setForeground(Color.WHITE);
lblDate.setBounds(69, 8, 326, 21);
JLabel lblBuses = new JLabel("Buses: ");
lblBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBuses.setForeground(new Color(255, 255, 255));
lblBuses.setBackground(new Color(192, 192, 192));
lblBuses.setBounds(22, 532, 56, 14);
lblNumOfBuses = new JLabel();
lblNumOfBuses.setText("0");
lblNumOfBuses.setBackground(new Color(0, 0, 0));
lblNumOfBuses.setForeground(new Color(255, 255, 255));
lblNumOfBuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumOfBuses.setBounds(69, 533, 90, 12);
JLabel lblBusesDone = new JLabel("Buses Done:");
lblBusesDone.setForeground(new Color(255, 255, 255));
lblBusesDone.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesDone.setBounds(143, 533, 101, 12);
lblNumOfDonebuses = new JLabel();
lblNumOfDonebuses.setText("0");
lblNumOfDonebuses.setForeground(new Color(255, 255, 255));
lblNumOfDonebuses.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblNumOfDonebuses.setBounds(234, 531, 80, 16);
JLabel lblMaximumTrip = new JLabel("Maximum Trip:");
lblMaximumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMaximumTrip.setForeground(new Color(255, 255, 255));
lblMaximumTrip.setBounds(22, 557, 112, 22);
lblMaximumTripValue = new JLabel();
lblMaximumTripValue.setText("-:--");
lblMaximumTripValue.setForeground(new Color(255, 255, 255));
lblMaximumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMaximumTripValue.setBounds(142, 559, 46, 18);
JLabel lblMinimumTrip = new JLabel("Minimum Trip:");
lblMinimumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMinimumTrip.setForeground(Color.WHITE);
lblMinimumTrip.setBounds(22, 587, 112, 18);
lblMinimumTripValue = new JLabel("-:--");
lblMinimumTripValue.setForeground(Color.WHITE);
lblMinimumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblMinimumTripValue.setBounds(143, 589, 90, 14);
JLabel lblBusesArrivedInTheLastHour = new JLabel("Buses Arrived In The Last Hour:");
lblBusesArrivedInTheLastHour.setForeground(Color.WHITE);
lblBusesArrivedInTheLastHour.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesArrivedInTheLastHour.setBounds(333, 532, 237, 14);
lblBusesArrivedInTheLastHourValue = new JLabel();
lblBusesArrivedInTheLastHourValue.setText("0");
lblBusesArrivedInTheLastHourValue.setForeground(Color.WHITE);
lblBusesArrivedInTheLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblBusesArrivedInTheLastHourValue.setBounds(566, 532, 90, 14);
JLabel lblAverageTripForLastHour = new JLabel("Average Trip For Last Hour:");
lblAverageTripForLastHour.setForeground(Color.WHITE);
lblAverageTripForLastHour.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTripForLastHour.setBackground(Color.BLACK);
lblAverageTripForLastHour.setBounds(198, 559, 208, 18);
lblAverageTripForLastHourValue = new JLabel("(No Arrivals) In Last Hour");
lblAverageTripForLastHourValue.setForeground(Color.WHITE);
lblAverageTripForLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTripForLastHourValue.setBounds(408, 557, 216, 18);
JLabel lblAvgTime = new JLabel("Average Time For The Trip:");
lblAvgTime.setForeground(Color.WHITE);
lblAvgTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAvgTime.setBounds(198, 582, 208, 29);
lblAverageTimeForTheTrip = new JLabel("-:--");
lblAverageTimeForTheTrip.setForeground(Color.WHITE);
lblAverageTimeForTheTrip.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblAverageTimeForTheTrip.setBounds(408, 589, 101, 14);
JLabel lblArrivedToArafat = new JLabel("All Arrived To Arafat At:");
lblArrivedToArafat.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblArrivedToArafat.setForeground(Color.WHITE);
lblArrivedToArafat.setBounds(18, 613, 216, 14);
makkahFrame.getContentPane().add(lblArrivedToArafat);
JLabel lblArrivedToHotels = new JLabel("All Arrived To Hotels At:");
lblArrivedToHotels.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblArrivedToHotels.setForeground(Color.WHITE);
lblArrivedToHotels.setBounds(18, 638, 184, 14);
makkahFrame.getContentPane().add(lblArrivedToHotels);
lblArrivedToArafatTime = new JLabel("N/A");
lblArrivedToArafatTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblArrivedToArafatTime.setForeground(Color.WHITE);
lblArrivedToArafatTime.setBounds(208, 613, 358, 14);
makkahFrame.getContentPane().add(lblArrivedToArafatTime);
lblArrivedToHotelsTime = new JLabel("N/A");
lblArrivedToHotelsTime.setFont(new Font("Rockwell", Font.PLAIN, 16));
lblArrivedToHotelsTime.setForeground(Color.WHITE);
lblArrivedToHotelsTime.setBounds(208, 638, 358, 14);
//Add Elements
makkahFrame.getContentPane().add(streetScroll);
makkahFrame.getContentPane().add(lblAverageTimeForTheTrip);
makkahFrame.getContentPane().add(lblAverageTripForLastHourValue);
makkahFrame.getContentPane().add(lblBusesArrivedInTheLastHourValue);
makkahFrame.getContentPane().add(lblStatus);
makkahFrame.getContentPane().add(lblDestination);
makkahFrame.getContentPane().add(lblBuses);
makkahFrame.getContentPane().add(lblNumOfBuses);
makkahFrame.getContentPane().add(lblBusesDone);
makkahFrame.getContentPane().add(lblNumOfDonebuses);
makkahFrame.getContentPane().add(btnExit);
makkahFrame.getContentPane().add(btnViewStreet);
makkahFrame.getContentPane().add(btnViewReport);
makkahFrame.getContentPane().add(btnViewBuses);
makkahFrame.getContentPane().add(btnViewRoutes);
makkahFrame.getContentPane().add(lblAverageTripForLastHour);
makkahFrame.getContentPane().add(lblAvgTime);
makkahFrame.getContentPane().add(districtScroll);
makkahFrame.getContentPane().add(lblDistrict);
makkahFrame.getContentPane().add(lblStreets);
makkahFrame.getContentPane().add(lblTime);
makkahFrame.getContentPane().add(lblDate);
makkahFrame.getContentPane().add(lblBusesArrivedInTheLastHour);
makkahFrame.getContentPane().add(lblMaximumTripValue);
makkahFrame.getContentPane().add(lblMinimumTripValue);
makkahFrame.getContentPane().add(lblMaximumTrip);
makkahFrame.getContentPane().add(lblMinimumTrip);
makkahFrame.getContentPane().add(btnBrowseHistory);
makkahFrame.getContentPane().add(btnPause);
//Frame Settings
makkahFrame.getContentPane().setBackground(new Color(50,50,50));
makkahFrame.getContentPane().setForeground(new Color(0, 0, 0));
makkahFrame.setBounds(100,100,1089,714);
makkahFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
makkahFrame.getContentPane().setLayout(null);
makkahFrame.getContentPane().add(lblArrivedToHotelsTime);
makkahFrame.setLocationRelativeTo(null);
makkahFrame.revalidate();
makkahFrame.setLocation(200,150);
makkahFrame.setAutoRequestFocus(false);
makkahFrame.setVisible(true);
//Set Routes for Campaigns //Set Routes for Campaigns
setRoutesForCampaigns(Mashier.ARAFAT);
while(!firstDayTimeMan.isEnded()) { while(!firstDayTimeMan.isEnded()) {
checkInput(); checkInput();
if (!isAllRoutSet) {
isAllRoutSet = true;
setRoutesForCampaigns(Mashier.ARAFAT);
}
//Start of Every hour //Start of Every hour
if (firstDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) == 0){ if (firstDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) == 0){
System.out.println("\n\n" + getStreetsReport()); System.out.println("\n\n" + getStreetsReport());
updateStreetFrame();
saveState();
} }
else System.out.print("."); else System.out.print(".");
clearDoneCivilVehicles(); clearDoneCivilVehicles();
addCivilVehicleNoise(); addCivilVehicleNoise();
for (Vehicle vehicle : listOfVehicles) { for (Vehicle vehicle : listOfVehicles) {
if (vehicle.getRoute() == null)
continue;
Route route = vehicle.getRoute(); Route route = vehicle.getRoute();
double currentLocation = vehicle.getCurrentLocation(); double currentLocation = vehicle.getCurrentLocation();
if (vehicle.getCurrentStreet() == null && if (vehicle.getCurrentStreet() == null &&
firstDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) % 2 == 0 &&
route.getStreets()[0].capcityPoint(0,1000) < 1) { route.getStreets()[0].capcityPoint(0,1000) < 1) {
vehicle.setCurrentStreet(route.getStreets()[0]); vehicle.setCurrentStreet(route.getStreets()[0]);
} }
@ -82,13 +465,16 @@ public class MakkahCity {
} }
} }
} }
if (isAllArrived()) allArrivedToArafatTime = (Date)currenttimeManager.getCurrentTime().clone(); if (isAllArrived() && allArrivedToArafatTime == null) allArrivedToArafatTime = (Date)currenttimeManager.getCurrentTime().clone();
firstDayTimeMan.step(Calendar.MINUTE, 1); firstDayTimeMan.step(Calendar.MINUTE, 1);
lblDate.setText(currenttimeManager.getCurrentTime().toString());
//lblArrivedToArafatTime.setText(getDistTimeForLbl());
} }
//TODO make report
currenttimeManager = lastDayTimeMan; currenttimeManager = lastDayTimeMan;
System.out.println("\n***************FINSHIED ARAFAT DAY***************"); System.out.println("\n***************FINSHIED ARAFAT DAY***************");
setRoutesForCampaigns(Mashier.MINA); //Collections.shuffle(listOfVehicles);
isAllRoutSet = false;
for (Vehicle vehicle : listOfVehicles) { for (Vehicle vehicle : listOfVehicles) {
vehicle.setCurrentStreet(null); vehicle.setCurrentStreet(null);
} }
@ -97,17 +483,28 @@ public class MakkahCity {
addCivilVehicleNoise(); addCivilVehicleNoise();
System.out.println("***************STARTING LAST DAY***************"); System.out.println("***************STARTING LAST DAY***************");
setRoutesForCampaigns(Mashier.MINA);
while(!lastDayTimeMan.isEnded()) { while(!lastDayTimeMan.isEnded()) {
checkInput(); checkInput();
if (!isAllRoutSet) {
isAllRoutSet = true;
setRoutesForCampaigns(Mashier.MINA);
}
//Start of Every hour //Start of Every hour
if (lastDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) == 0){ if (lastDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) == 0){
System.out.println("\n\n" + getStreetsReport()); System.out.println("\n\n" + getStreetsReport());
updateStreetFrame();
saveState();
} }
else System.out.print("."); else System.out.print(".");
clearDoneCivilVehicles(); clearDoneCivilVehicles();
addCivilVehicleNoise(); addCivilVehicleNoise();
for (Vehicle vehicle : listOfVehicles) { for (Vehicle vehicle : listOfVehicles) {
if (vehicle.getRoute() == null)
continue;
Route route = vehicle.getRoute(); Route route = vehicle.getRoute();
double currentLocation = vehicle.getCurrentLocation(); double currentLocation = vehicle.getCurrentLocation();
if (vehicle.getCurrentStreet() == null && if (vehicle.getCurrentStreet() == null &&
@ -131,16 +528,29 @@ public class MakkahCity {
} }
} }
} }
if (isAllArrived()) allArrivedToHotelsTime = (Date)currenttimeManager.getCurrentTime().clone(); if (isAllArrived() && allArrivedToHotelsTime == null) allArrivedToHotelsTime = (Date)currenttimeManager.getCurrentTime().clone();
lastDayTimeMan.step(Calendar.MINUTE, 1); lastDayTimeMan.step(Calendar.MINUTE, 1);
lblDate.setText(currenttimeManager.getCurrentTime().toString());
//lblArrivedToHotelsTime.setText(getDistTimeForLbl());
} }
//When done show menu to analyze. Exit from menu too. //When done show menu to analyze. Exit from menu too.
done_flag = true;
inputListener.pause(); inputListener.pause();
startMenu(); startMenu();
} }
private static void checkInput() { private static void checkInput() {
String input = ""; String input = "";
if (exit_flag) System.exit(0);
if (pause_flag) {
while (pause_flag) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
if (inputListener.hasNew()){ if (inputListener.hasNew()){
input = inputListener.getInput(); input = inputListener.getInput();
if (input.equals("m")){ if (input.equals("m")){
@ -153,8 +563,6 @@ public class MakkahCity {
} }
private static void startMenu() { private static void startMenu() {
//TODO: add used by (District) in street menu as option
//TODO: add capacity to street list output avg time too?
Scanner in = new Scanner(System.in); Scanner in = new Scanner(System.in);
System.out.println("\n"+currenttimeManager.getCurrentTime()+"\n"+ System.out.println("\n"+currenttimeManager.getCurrentTime()+"\n"+
"---------------------------\n" + "---------------------------\n" +
@ -163,8 +571,9 @@ public class MakkahCity {
"[3] View Campaigns\n" + "[3] View Campaigns\n" +
"[4] View Routes\n" + "[4] View Routes\n" +
"[5] Print report\n" + "[5] Print report\n" +
"[6] Continue\n" + "[6] Browse History\n" +
"[7] Exit"); "[7] Continue\n" +
"[8] Exit");
String choice = in.next(); String choice = in.next();
//Split into methods? //Split into methods?
if (choice.equals("1")){ if (choice.equals("1")){
@ -197,8 +606,9 @@ public class MakkahCity {
} }
} }
if (choice.equals("5")) System.out.println(getStreetsReport()); if (choice.equals("5")) System.out.println(getStreetsReport());
if (choice.equals("6")) return; if (choice.equals("6")) browseHistory();
if (choice.equals("7")) { if (choice.equals("7")) return;
if (choice.equals("8")) {
inputListener.stop(); inputListener.stop();
t.interrupt(); t.interrupt();
System.exit(0); System.exit(0);
@ -275,6 +685,46 @@ public class MakkahCity {
System.out.println(route.toString()); System.out.println(route.toString());
} }
private static void browseHistory() {
Calendar dummyCal = new GregorianCalendar();
dummyCal.setTime(currenttimeManager.getCurrentTime());
//dummyCal.roll(Calendar.HOUR, -1);
dummyCal.set(Calendar.MINUTE, 0);//Go down to last hour.
Scanner in = new Scanner(System.in);
boolean selected = false;
while (!selected){
System.out.println(new HijriDate(dummyCal.getTimeInMillis()));
System.out.print("[1] Forward\n" +
"[2] Backward\n" +
"[3] Select\n" +
"[4] Return\n");
String choice = in.next();
if (choice.equals("1")) dummyCal.roll(Calendar.HOUR, 1);
if (choice.equals("2")) dummyCal.roll(Calendar.HOUR, -1);
if (choice.equals("3")) {
selected = true;
DataManeger dataManeger = new DataManeger();
if (dataManeger.stateAvailable(dummyCal.getTime())) {
State state = dataManeger.loadState(dummyCal.getTime());
System.out.print(dummyCal.getTime() + " (History)\n");
System.out.println("\n"+
"---------------------------\n" +
"[1] View Buses\n" +
"[2] View Streets\n" +
"[3] View Campaigns\n" +
"[4] View Routes\n");
choice = in.next();
if (choice.equals("1")){
System.out.print("0 - "+state.getListOfVehicles().size());
choice = in.next();
showVehicle(state.getListOfVehicles().get(Integer.parseInt(choice)));
}
} else System.out.print("Not saved");
}
}
}
private static void clearDoneCivilVehicles() { private static void clearDoneCivilVehicles() {
//Clear civil cars from list //Clear civil cars from list
for (int i = 0; i < listOfVehicles.size();){ for (int i = 0; i < listOfVehicles.size();){
@ -288,7 +738,10 @@ public class MakkahCity {
private static void setRoutesForCampaigns(Mashier mashier) { private static void setRoutesForCampaigns(Mashier mashier) {
for (Campaign camp : listOfCampaigns){ for (Campaign camp : listOfCampaigns){
camp.setRoute(getShortestRoute(camp, mashier)); if(camp.getVehicles().get(0).getCurrentStreet() == null) {
isAllRoutSet = false;
camp.setRoute(getBestRoute(camp, mashier));
}
} }
} }
@ -310,7 +763,7 @@ public class MakkahCity {
stdStreet[StreetNames.FOURTH_HIGHWAY2.ordinal()] = new Street(4850,4, StreetNames.FOURTH_HIGHWAY2); stdStreet[StreetNames.FOURTH_HIGHWAY2.ordinal()] = new Street(4850,4, StreetNames.FOURTH_HIGHWAY2);
stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()] = new Street(4500,4, StreetNames.FOURTH_HIGHWAY3); stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()] = new Street(4500,4, StreetNames.FOURTH_HIGHWAY3);
stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()] = new Street(8200,3, StreetNames.THIRD_HIGHWAY); stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()] = new Street(8200,3, StreetNames.THIRD_HIGHWAY);
stdStreet[StreetNames.STREET1.ordinal()] = new Street(7800,3, StreetNames.STREET1); stdStreet[StreetNames.STREET1.ordinal()] = new Street(7800,4, StreetNames.STREET1);
stdStreet[StreetNames.STREET2.ordinal()] = new Street(2400,3,StreetNames.STREET2); stdStreet[StreetNames.STREET2.ordinal()] = new Street(2400,3,StreetNames.STREET2);
stdStreet[StreetNames.STREET3.ordinal()] = new Street(4800,2, StreetNames.STREET3); stdStreet[StreetNames.STREET3.ordinal()] = new Street(4800,2, StreetNames.STREET3);
stdStreet[StreetNames.JABAL_THAWR_STREET.ordinal()] = new Street(3800,3,StreetNames.JABAL_THAWR_STREET); stdStreet[StreetNames.JABAL_THAWR_STREET.ordinal()] = new Street(3800,3,StreetNames.JABAL_THAWR_STREET);
@ -441,7 +894,7 @@ public class MakkahCity {
private static void addCivilVehicleNoise() { private static void addCivilVehicleNoise() {
for (Street street: stdStreet) { for (Street street: stdStreet) {
if (street.getPercentRemainingCapacity() >= 100) if (street.getPercentRemainingCapacity() >= 80)
continue; continue;
int numOfSedan = (int)getRandom(10,15); int numOfSedan = (int)getRandom(10,15);
@ -510,7 +963,43 @@ public class MakkahCity {
* @param campaign * @param campaign
* @return * @return
*/ */
private static Route getShortestRoute(Campaign campaign, Mashier mashier) {
private static Route getBestRoute(Campaign campaign , Mashier mashier) {
//ArrayList<Route> routes = (ArrayList<Route>) Arrays.asList(getRoutesToDistrict(campaign.getHotelDistrict()));
Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict());
routes = sortRoutes(routes);
for (Route r : routes) {
if(r.getMashier() == Mashier.ARAFAT && r.getHotelArea() == District.ALHIJRA) {
return r;
}
if (r.getMashier() == mashier){
if (r.capcity() < 70) {
return r;
}
else if (r.getHotelArea() == District.ALAZIZIYA)
return r;
}
}
return null;
}
private static Route[] sortRoutes(Route[] routes) {
Route[] sortingRoute = new Route[routes.length];
double[] lengthes = new double[routes.length];
for (int i = 0; i < lengthes.length ; i++)
lengthes[i] = routes[i].getTotalLength();
Arrays.sort(lengthes);
for (int i = 0; i < lengthes.length ; i++) {
for (Route r : routes)
if (lengthes[i] == r.getTotalLength())
sortingRoute[i] = r;
}
return sortingRoute;
}
public static Route getShortestRoute(Campaign campaign, Mashier mashier) {
Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict()); Route[] routes = getRoutesToDistrict(campaign.getHotelDistrict());
Route route = null; Route route = null;
double min = Double.MAX_VALUE; double min = Double.MAX_VALUE;
@ -576,7 +1065,7 @@ public class MakkahCity {
//Redundant loops slow down execution. find better sol. //Redundant loops slow down execution. find better sol.
for (Campaign campaign : listOfCampaigns) { for (Campaign campaign : listOfCampaigns) {
numberOfBusses += campaign.getNumberOfBusses(); numberOfBusses += campaign.getNumberOfBusses();
} //TODO Add max min time. }
String fFormat = "All arrived to %s at: %s"; String fFormat = "All arrived to %s at: %s";
boolean arr = isAllArrived();//since it has looping. use once. boolean arr = isAllArrived();//since it has looping. use once.
if (arr && allArrivedToArafatTime != null) if (arr && allArrivedToArafatTime != null)
@ -601,7 +1090,7 @@ public class MakkahCity {
* Calculate average trip time for last 10 minutes * Calculate average trip time for last 10 minutes
* @return "hh:mm" * @return "hh:mm"
*/ */
private static String avgTimeOfTrip() { public static String avgTimeOfTrip() {
//TODO: does output diff value even after all have arrived. //TODO: does output diff value even after all have arrived.
Calendar now = currenttimeManager.getCurrentCalendar(); Calendar now = currenttimeManager.getCurrentCalendar();
Calendar from = (GregorianCalendar)now.clone(); Calendar from = (GregorianCalendar)now.clone();
@ -621,11 +1110,11 @@ public class MakkahCity {
sum = sum /counter; sum = sum /counter;
int hours = sum / 60; int hours = sum / 60;
int minutes = sum % 60; int minutes = sum % 60;
if (hours == 0 && minutes == 0) return "(No arrivals) in last Hour"; if (hours == 0 && minutes == 0) return "(No Arrivals) In Last Hour";
return String.format("%2d:%02d", hours, minutes); return String.format("%2d:%02d", hours, minutes);
} }
private static int getPercentArrival(District district) { public static int getPercentArrival(District district) {
int sum = 0; int sum = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]) { for (Campaign campaign : campPerDistrict[district.ordinal()]) {
sum += campaign.getPercentArrived(); sum += campaign.getPercentArrived();
@ -633,7 +1122,7 @@ public class MakkahCity {
return sum/campPerDistrict[district.ordinal()].size(); return sum/campPerDistrict[district.ordinal()].size();
} }
private static String getAvgTimeOfTrip(District district){ public static String getAvgTimeOfTrip(District district){
int sum = 0; int sum = 0;
int counter = 1; int counter = 1;
for (Campaign campaign : campPerDistrict[district.ordinal()]) { for (Campaign campaign : campPerDistrict[district.ordinal()]) {
@ -652,7 +1141,7 @@ public class MakkahCity {
return String.format("%2d:%02d", hours,minutes); return String.format("%2d:%02d", hours,minutes);
} }
private static int getNumberOfArrivedBusses() { public static int getNumberOfArrivedBusses() {
int num = 0; int num = 0;
for (Campaign campaign : listOfCampaigns) { for (Campaign campaign : listOfCampaigns) {
for (Vehicle vehicle : campaign.getVehicles()){ for (Vehicle vehicle : campaign.getVehicles()){
@ -663,7 +1152,7 @@ public class MakkahCity {
return num; return num;
} }
private static int getNumberOfArrivedBussesPerHour() { public static int getNumberOfArrivedBussesPerHour() {
Calendar now = currenttimeManager.getCurrentCalendar(); Calendar now = currenttimeManager.getCurrentCalendar();
Calendar from = (GregorianCalendar)now.clone(); Calendar from = (GregorianCalendar)now.clone();
from.roll(Calendar.HOUR, -1); from.roll(Calendar.HOUR, -1);
@ -702,7 +1191,7 @@ public class MakkahCity {
report.append(String.format(" %-20s|", getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus()))); report.append(String.format(" %-20s|", getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus())));
report.append(String.format(" %-22s|", getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus()))); report.append(String.format(" %-22s|", getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus())));
//Calc values per dist here. //Calc values per dist here.
//TODO: add arrived buses colum (NO NEED)
report.append("\n"); report.append("\n");
} }
return report.toString(); return report.toString();
@ -725,11 +1214,139 @@ public class MakkahCity {
return String.format("%02d:%02d", hours, minutes); return String.format("%02d:%02d", hours, minutes);
} }
private static int busesInDistrict(District district){ public static int busesInDistrict(District district){
int buses = 0; int buses = 0;
for (Campaign campaign : campPerDistrict[district.ordinal()]){ for (Campaign campaign : campPerDistrict[district.ordinal()]){
buses += campaign.getNumberOfBusses(); buses += campaign.getNumberOfBusses();
} }
return buses; return buses;
} }
private static void saveState(){
State s = new State(listOfCampaigns,
listOfVehicles,
campPerDistrict,
stdRoutes,
stdStreet,
allArrivedToArafatTime,
allArrivedToHotelsTime,
currenttimeManager.getCurrentTime());
dataManeger.saveState(s, currenttimeManager.getCurrentTime());
boolean result = dataManeger.saveState(s, currenttimeManager.getCurrentTime());
if (!result) System.out.println("Could not save state "+currenttimeManager.getCurrentTime().getTime());
} }
private static void updateStreetFrame() {
Object[][] streetData = new Object[stdStreet.length][6];
for (int i = 0; i < stdStreet.length; i++) {
streetData[i][0] = stdStreet[i].getName().name();
streetData[i][1] = stdStreet[i].getPercentRemainingCapacity();
streetData[i][2] = stdStreet[i].getVehicles().size();
streetData[i][3] = stdStreet[i].getNumberOfBuses();
streetData[i][4] = stdStreet[i].getNumberOfLocalCars();
streetData[i][5] = avgTimeOnStreet(stdStreet[i]);
}
for (int i = 0; i < streetData.length; i++) {
for (int j = 0; j < streetData[i].length; j++) {
streetTable.setValueAt(streetData[i][j], i, j);
}
}
Object[][] districtData = new Object[campPerDistrict.length][7];
for (int i = 0; i < campPerDistrict.length; i++) {
districtData[i][0] = campPerDistrict[i].get(0).getHotelDistrict().name();
districtData[i][1] = campPerDistrict[i].size();
districtData[i][2] = busesInDistrict(District.values()[i]);
districtData[i][3] = getPercentArrival(District.values()[i]);
districtData[i][4] = getAvgTimeOfTrip(District.values()[i]);
districtData[i][5] = getShortestRoute(campPerDistrict[i].get(0), Mashier.ARAFAT).getFastestTimeOfTravel(new Bus());
districtData[i][6] = getShortestRoute(campPerDistrict[i].get(0), Mashier.MINA).getFastestTimeOfTravel(new Bus());
}
for (int i = 0; i < districtData.length; i++) {
for (int j = 0; j < districtData[i].length; j++) {
districtTable.setValueAt(districtData[i][j], i, j);
}
}
lblDate.setText(currenttimeManager.getCurrentTime().toString());
if (lblArrivedToArafatTime.getText().equalsIgnoreCase("N/A"))
if (allArrivedToArafatTime != null) {
lblArrivedToArafatTime.setText(allArrivedToArafatTime.toString());
}
if (lblArrivedToHotelsTime.getText().equalsIgnoreCase("N/A"))
if (allArrivedToHotelsTime != null) {
lblArrivedToHotelsTime.setText(allArrivedToHotelsTime.toString());
}
String status = "";
if (currenttimeManager == firstDayTimeMan) {
status = "Heading to Arafat";
}
else{
status = "Heading to Hotels";
}
lblDestination.setText(status);
int numberOfBusses = 0;
for (Campaign campaign : listOfCampaigns) {
numberOfBusses += campaign.getNumberOfBusses();
}
String bus = String.format("%d", numberOfBusses);
lblNumOfBuses.setText(bus);
String numOfdoneBuses = String.format("%d",getNumberOfArrivedBusses());
lblNumOfDonebuses.setText(numOfdoneBuses);
if (Vehicle.getMaxArrived() != null && Vehicle.getMinArrived() != null) {
lblMaximumTripValue.setText(Vehicle.getMaxArrived().getTripTime().toString());
lblMinimumTripValue.setText(Vehicle.getMinArrived().getTripTime().toString());
}
String NumberOfBussPerHour = String.format("%d", getNumberOfArrivedBussesPerHour());
lblBusesArrivedInTheLastHourValue.setText(NumberOfBussPerHour);
lblAverageTripForLastHourValue.setText(avgTimeOfTrip());
lblAverageTimeForTheTrip.setText(getAvgTripForAllDis());
}
public static String getAvgTripForAllDis() {
int sum = 0;
int counter = 1;
for (Campaign campaign : listOfCampaigns) {
for (Vehicle vehicle : campaign.getVehicles()) {
if (vehicle.isArrivedToDest()) {
long minutes = (vehicle.getTimeOfArrival().getTime() - vehicle.getTimeStartedMoving().getTime())/60000;
sum+= minutes;
counter++;
}
}
}//Make the following a method since it is the same other method
sum = sum /counter;
int hours = sum / 60;
int minutes = sum % 60;
if (hours == 0 && minutes == 0) return "-:--";
return String.format("%2d:%02d", hours,minutes);
}
private static String getDistTimeForLbl() {
int numberOfBusses = 0;
int numberOfArrivedBuses = getNumberOfArrivedBusses();
for (Campaign campaign : listOfCampaigns) {
numberOfBusses += campaign.getNumberOfBusses();
}
boolean Done = isAllArrived();
if (Done && allArrivedToArafatTime != null) {
return String.format("%s", allArrivedToArafatTime);
}
if (Done && allArrivedToHotelsTime != null) {
return String.format("%s",allArrivedToHotelsTime);
}
return "N/A";
}
}

View File

@ -1,4 +1,6 @@
public class Route implements Travelable { import java.io.Serializable;
public class Route implements Travelable, Serializable {
private Street[] streets; private Street[] streets;
private District hotelArea; private District hotelArea;
@ -50,6 +52,8 @@ public class Route implements Travelable {
.append("\n") .append("\n")
.append("Length: ").append(getTotalLength()) .append("Length: ").append(getTotalLength())
.append("\n") .append("\n")
.append("Capacity: ").append(String.format("%.2f", capcity()))
.append("\n")
.append("Streets: "); .append("Streets: ");
for (Street street : this.getStreets()) for (Street street : this.getStreets())
s.append(street.getName().name()).append(" "); s.append(street.getName().name()).append(" ");
@ -65,6 +69,15 @@ public class Route implements Travelable {
return mashier; return mashier;
} }
public double capcity() {
double capcity = 0;
for (Street str : getStreets()) {
capcity += str.getPercentRemainingCapacity();
}
double c = capcity/(getStreets().length);
return c;
}
private void setStreets(Street[] streets) { private void setStreets(Street[] streets) {
if (streets != null) this.streets = streets; if (streets != null) this.streets = streets;
else throwIllegal(); else throwIllegal();

View File

@ -1,33 +1,24 @@
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
public class Street implements Travelable { public class Street implements Travelable, Serializable {
private double length; private double length;
private int numberOfLanes; private int numberOfLanes;
private ArrayList<Vehicle> vehicles; //Current private ArrayList<Vehicle> vehicles; //Current
private HashMap<Vehicle, ArrayList<Date>> vehiclesHistory;//History of vehicles
private StreetNames name; private StreetNames name;
public Street(double length, int numberOfLanes, StreetNames name) { public Street(double length, int numberOfLanes, StreetNames name) {
vehicles = new ArrayList<>(); vehicles = new ArrayList<>();
vehiclesHistory = new HashMap<>();
setLength(length); setLength(length);
setNumberOfLanes(numberOfLanes); setNumberOfLanes(numberOfLanes);
this.name = name; this.name = name;
} }
public Date[] getHistoryForVehicle(Vehicle vehicle){
if (vehiclesHistory.containsKey(vehicle)){
Date[] hist = new Date[vehiclesHistory.get(vehicle).size()];
return vehiclesHistory.get(vehicle).toArray(hist);
}
return null;
}
private void setLength(double length) { private void setLength(double length) {
if (length >= 0) this.length = length; if (length >= 0) this.length = length;
else throw new IllegalArgumentException("Can not make a negative length street"); else throw new IllegalArgumentException("Can not make a negative length street");
@ -96,14 +87,6 @@ public class Street implements Travelable {
public void addVehicle(Vehicle vehicle) { public void addVehicle(Vehicle vehicle) {
vehicles.add(vehicle); vehicles.add(vehicle);
addHistoryEntry(vehicle);
}
private void addHistoryEntry(Vehicle vehicle) {
if (!vehiclesHistory.containsKey(vehicle)) {
vehiclesHistory.put(vehicle, new ArrayList<>());
}
vehiclesHistory.get(vehicle).add(MakkahCity.getTimeMan().getCurrentTime());//Add time
} }
public double capcityPoint(double min, double max) { public double capcityPoint(double min, double max) {

View File

@ -1,7 +1,8 @@
import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
public abstract class Vehicle { public abstract class Vehicle implements Serializable {
private double vehicleSize; private double vehicleSize;
private Route route; private Route route;