import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; public class MakkahCity { private static final ArrayList listOfCampaigns = new ArrayList<>(); private static final ArrayList listOfVehicles = new ArrayList<>(); private static final ArrayList[] campPerDistrict = new ArrayList[District.values().length]; private static final Route[] stdRoutes = new Route[RouteName.values().length]; private static final Street[] stdStreet = new Street[StreetNames.values().length]; private static Date allArrivedToArafatTime; private static Date allArrivedToHotelsTime; private static final PDate firstDayTimeMan = new PDate( new GregorianCalendar(1442, Calendar.JANUARY, 9, 4, 0, 0), new GregorianCalendar(1442, Calendar.JANUARY, 9, 18, 0, 0) ); private static final PDate lastDayTimeMan = new PDate( new GregorianCalendar(1442, Calendar.JANUARY, 12, 12, 0, 0), new GregorianCalendar(1442, Calendar.JANUARY, 12, 23, 0, 0) ); private static PDate currenttimeManager = firstDayTimeMan; private static final InputListener inputListener = new InputListener(); private static final Thread t = new Thread(inputListener,"InputThread-Makkah"); private static boolean isAllRoutSet; private static final DataManeger dataManeger = new DataManeger(); //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) { //TODO: View camp >> View Report //TODO: History view //TODO: Arrival dates (Arafat, Mina) //TODO: fix state errors t.start(); //Gen Camp campPerDistrict[District.ALMANSOOR.ordinal()] = new ArrayList<>(); campPerDistrict[District.ALAZIZIYA.ordinal()] = new ArrayList<>(); campPerDistrict[District.ALHIJRA.ordinal()] = new ArrayList<>(); generateCamps(District.ALAZIZIYA, (int)getRandom(1200, 1400)); generateCamps(District.ALMANSOOR, (int)getRandom(1600, 1800)); generateCamps(District.ALHIJRA, (int)getRandom(1400, 1600)); Collections.shuffle(listOfCampaigns); fillBusesToList(); makeStreets(); addCivilVehicleNoise(); 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(25); streetTable.setAutoCreateRowSorter(true); JScrollPane streetScroll = new JScrollPane(streetTable); streetScroll.setBounds(50,100,1216,329); //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(50,478,1216,105); //Buttons JButton btnViewRoutes = new JButton("View Routes"); btnViewRoutes.setBounds(1307, 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(1307, 76, 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 btnViewCampaigns = new JButton("View Campaigns"); btnViewCampaigns.setBounds(1307, 119, 166, 29); btnViewCampaigns.setFont(new Font("Rockwell", Font.PLAIN, 16)); btnViewCampaigns.setBackground(new Color(9,9,9)); btnViewCampaigns.setForeground(Color.white); JButton btnViewStreet = new JButton("View Street"); btnViewStreet.setBounds(1307, 159, 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(1307, 623, 166, 29); btnExit.addActionListener(actionEvent -> 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(1307, 240, 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(1307, 199, 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(49, 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(49, 438, 166, 29); 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); 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); lblDestination = new JLabel(); lblDestination.setForeground(new Color(255, 255, 255)); lblDestination.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblDestination.setBounds(477, 9, 184, 18); lblDate = new JLabel(currenttimeManager.getCurrentTime().toString()); lblDate.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblDate.setForeground(Color.WHITE); lblDate.setBounds(100, 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(49, 605, 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(100, 606, 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(199, 606, 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(293, 604, 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(49, 666, 112, 22); lblMaximumTripValue = new JLabel(); lblMaximumTripValue.setText("-:--"); lblMaximumTripValue.setForeground(new Color(255, 255, 255)); lblMaximumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblMaximumTripValue.setBounds(169, 668, 46, 18); JLabel lblMinimumTrip = new JLabel("Minimum Trip:"); lblMinimumTrip.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblMinimumTrip.setForeground(Color.WHITE); lblMinimumTrip.setBounds(49, 699, 112, 18); lblMinimumTripValue = new JLabel("-:--"); lblMinimumTripValue.setForeground(Color.WHITE); lblMinimumTripValue.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblMinimumTripValue.setBounds(167, 701, 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(395, 605, 237, 14); lblBusesArrivedInTheLastHourValue = new JLabel(); lblBusesArrivedInTheLastHourValue.setText("0"); lblBusesArrivedInTheLastHourValue.setForeground(Color.WHITE); lblBusesArrivedInTheLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblBusesArrivedInTheLastHourValue.setBounds(628, 605, 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(287, 668, 208, 18); lblAverageTripForLastHourValue = new JLabel("(No Arrivals) In Last Hour"); lblAverageTripForLastHourValue.setForeground(Color.WHITE); lblAverageTripForLastHourValue.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblAverageTripForLastHourValue.setBounds(502, 668, 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(287, 694, 208, 29); lblAverageTimeForTheTrip = new JLabel("-:--"); lblAverageTimeForTheTrip.setForeground(Color.WHITE); lblAverageTimeForTheTrip.setFont(new Font("Rockwell", Font.PLAIN, 16)); lblAverageTimeForTheTrip.setBounds(502, 701, 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(724, 670, 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(724, 701, 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(908, 670, 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(908, 701, 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(btnViewCampaigns); 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(70, 70, 70)); makkahFrame.getContentPane().setForeground(new Color(0, 0, 0)); makkahFrame.setBounds(100,100,1519,777); 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 while(!firstDayTimeMan.isEnded()) { checkInput(); //Start of Every hour if (firstDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) == 0){ System.out.println("\n\n" + getStreetsReport()); updateStreetFrame(); saveState(); } else System.out.print("."); if (!isAllRoutSet) { isAllRoutSet = true; setRoutesForCampaigns(Mashier.ARAFAT); } clearDoneCivilVehicles(); addCivilVehicleNoise(); for (Vehicle vehicle : listOfVehicles) { if (vehicle.getRoute() == null) continue; Route route = vehicle.getRoute(); double currentLocation = vehicle.getCurrentLocation(); if (vehicle.getCurrentStreet() == null && firstDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) % 2 == 0 && route.getStreets()[0].capcityPoint(0,1000) < 1) { vehicle.setCurrentStreet(route.getStreets()[0]); } if (vehicle.getCurrentStreet() != null && vehicle.getCurrentStreet().capcityPoint(currentLocation, currentLocation+1000) < 1 ) { if (currentLocation >= vehicle.getCurrentStreet().getLength()) { //Move to next street vehicle.moveToNextStreet(); } if (!vehicle.isArrivedToDest()) { double factor = 1-(vehicle.getCurrentStreet().capcityPoint(vehicle.getCurrentLocation(), vehicle.getCurrentLocation()+1000,vehicle)) ; if (vehicle instanceof Bus) vehicle.move(Bus.MAX_FORWARD * factor ); else if (vehicle instanceof Sedan) vehicle.move(Sedan.MAX_FORWARD * factor ); else if (vehicle instanceof SUV) vehicle.move(SUV.MAX_FORWARD * factor ); else if (vehicle instanceof Truck) vehicle.move(Bus.MAX_FORWARD * factor ); } } } if (isAllArrived() && allArrivedToArafatTime == null) allArrivedToArafatTime = (Date)currenttimeManager.getCurrentTime().clone(); firstDayTimeMan.step(Calendar.MINUTE, 1); lblDate.setText(currenttimeManager.getCurrentTime().toString()); lblArrivedToArafatTime.setText(getDistTimeForLbl()); } currenttimeManager = lastDayTimeMan; System.out.println("\n***************FINSHIED ARAFAT DAY***************"); //Collections.shuffle(listOfVehicles); isAllRoutSet = false; for (Vehicle vehicle : listOfVehicles) { vehicle.setCurrentStreet(null); } Vehicle.resetMaxArrived(); Vehicle.resetMinArrived(); addCivilVehicleNoise(); System.out.println("***************STARTING LAST DAY***************"); setRoutesForCampaigns(Mashier.MINA); while(!lastDayTimeMan.isEnded()) { checkInput(); //Start of Every hour if (lastDayTimeMan.getCurrentCalendar().get(Calendar.MINUTE) == 0){ System.out.println("\n\n" + getStreetsReport()); updateStreetFrame(); saveState(); } else System.out.print("."); if (!isAllRoutSet) { isAllRoutSet = true; setRoutesForCampaigns(Mashier.MINA); } clearDoneCivilVehicles(); addCivilVehicleNoise(); for (Vehicle vehicle : listOfVehicles) { if (vehicle.getRoute() == null) continue; Route route = vehicle.getRoute(); double currentLocation = vehicle.getCurrentLocation(); if (vehicle.getCurrentStreet() == null && route.getStreets()[0].capcityPoint(0,1000) < 1) { vehicle.setCurrentStreet(route.getStreets()[0]); } if (vehicle.getCurrentStreet() != null && vehicle.getCurrentStreet().capcityPoint(currentLocation, currentLocation+1000) < 1 ) { if (currentLocation >= vehicle.getCurrentStreet().getLength()) { //Move to next street vehicle.moveToNextStreet(); } if (!vehicle.isArrivedToDest()) { double factor = 1-(vehicle.getCurrentStreet().capcityPoint(vehicle.getCurrentLocation(), vehicle.getCurrentLocation()+1000,vehicle)) ; if (vehicle instanceof Bus) vehicle.move(Bus.MAX_FORWARD * factor ); else if (vehicle instanceof Sedan) vehicle.move(Sedan.MAX_FORWARD * factor ); else if (vehicle instanceof SUV) vehicle.move(SUV.MAX_FORWARD * factor ); else if (vehicle instanceof Truck) vehicle.move(Bus.MAX_FORWARD * factor ); } } } if (isAllArrived() && allArrivedToHotelsTime == null) allArrivedToHotelsTime = (Date)currenttimeManager.getCurrentTime().clone(); lastDayTimeMan.step(Calendar.MINUTE, 1); lblDate.setText(currenttimeManager.getCurrentTime().toString()); lblArrivedToHotelsTime.setText(getDistTimeForLbl()); } //When done show menu to analyze. Exit from menu too. inputListener.pause(); startMenu(); } private static void checkInput() { 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()){ input = inputListener.getInput(); if (input.equals("m")){ System.out.println("PAUSED"); inputListener.pause(); startMenu(); inputListener.unpause(); } } } private static void startMenu() { Scanner in = new Scanner(System.in); System.out.println("\n"+currenttimeManager.getCurrentTime()+"\n"+ "---------------------------\n" + "[1] View Buses\n" + "[2] View Streets\n" + "[3] View Campaigns\n" + "[4] View Routes\n" + "[5] Print report\n" + "[6] Browse History\n" + "[7] Continue\n" + "[8] Exit"); String choice = in.next(); //Split into methods? if (choice.equals("1")){ ArrayList buses = new ArrayList<>(); for (Campaign campaign : listOfCampaigns) buses.addAll(campaign.getVehicles()); System.out.printf("choose from 0 to %d\n", buses.size()-1); String c = in.next(); Vehicle v = buses.get(Integer.parseInt(c)); showVehicle(v); //meybe add option here to go to members (Campaign, Street ...) } if (choice.equals("2")){ for (int i = 0; i < stdStreet.length; i++) { System.out.printf("[%d] %s (%%%d)\n",i, stdStreet[i].getName().name(), stdStreet[i].getPercentRemainingCapacity()); } String input = in.next(); int index = Integer.parseInt(input);//TODO: unhandled ex showStreet(stdStreet[index]); } if (choice.equals("4")){ for (int i = 0; i < stdRoutes.length; i++){ int count = 0; for (Campaign campaign : listOfCampaigns) if (campaign.getRoute() == stdRoutes[i]) count += campaign.getVehicles().size(); System.out.printf("[%d] %sUsed By %d buses\n\n", i, stdRoutes[i], count); } } if (choice.equals("5")) System.out.println(getStreetsReport()); if (choice.equals("6")) browseHistory(); if (choice.equals("7")) return; if (choice.equals("8")) { inputListener.stop(); t.interrupt(); System.exit(0); } startMenu(); } private static void showVehicle(Vehicle vehicle) { String choice = ""; Scanner in = new Scanner(System.in); StringBuilder menu = new StringBuilder(); int opCount = 0; menu.append("\n\n") .append(vehicle.getUID()) .append("\n") .append("---------------------------\n") .append(String.format("[%d] Details\n",++opCount)); if (vehicle instanceof Bus) { menu.append(String.format("[%d] Get Campaign\n", ++opCount)); } menu.append(String.format("[%d] Return", ++opCount)); System.out.println(menu.toString()); choice = in.next(); if (choice.equals("1")) System.out.println(vehicle.toString()); if (choice.equals("2") && opCount == 3) showCampaign(((Bus)vehicle).getCampaign()); else if (choice.equals("2")) return; else if (choice.equals("3")) return; showVehicle(vehicle); } private static void showCampaign(Campaign campaign){ String choice = ""; Scanner in = new Scanner(System.in); System.out.println("\n"+campaign.toString()); System.out.println("\n"+campaign.getUID()); System.out.println("---------------------------\n" + "[1] Details\n" + "[2] Select bus\n" + "[3] Get current Route\n" + "[4] Return"); choice = in.next(); if (choice.equals("1")) System.out.println(campaign.toString()); if (choice.equals("2")){ System.out.printf("Choose from 0 to %d", campaign.getNumberOfBusses()); choice = in.next(); showVehicle(campaign.getVehicles().get(Integer.parseInt(choice))); } if (choice.equals("3")) showRoute(campaign.getRoute()); if (choice.equals("4")) return; showCampaign(campaign); } private static void showStreet(Street street) { String choice = ""; Scanner in = new Scanner(System.in); System.out.println("\n"+street.getName().name()); System.out.println("---------------------------\n"+ "[1] Details\n" + "[2] Select vehicle\n" + "[3] Get history for vehicle (NOT IMPLEMENTED YET)\n" + "[4] Return"); choice = in.next(); if (choice.equals("1")) System.out.println("\n\n"+street.toString()); if (choice.equals("2")){ System.out.printf("Select from 0 to %d\n", street.getVehicles().size()); choice = in.next(); showVehicle(street.getVehicles().get(Integer.parseInt(choice))); } if (choice.equals("4")) return; showStreet(street); } private static void showRoute(Route route){ 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() { //Clear civil cars from list for (int i = 0; i < listOfVehicles.size();){ Vehicle vehicle = listOfVehicles.get(i); if (!(vehicle instanceof Bus) && vehicle.isArrivedToDest()) listOfVehicles.remove(vehicle); else i++; } } private static void setRoutesForCampaigns(Mashier mashier) { for (Campaign camp : listOfCampaigns){ if(camp.getVehicles().get(0).getCurrentStreet() == null) { isAllRoutSet = false; camp.setRoute(getBestRoute(camp, mashier)); } } } private static double getRandom(double min, double max) { return (Math.random() * (max - min) + min); } private static void generateCamps(District area, int count) { for (int i = 0; i < count; i++){ Campaign camp = new Campaign(area, (int)getRandom(10, 15)); listOfCampaigns.add(camp); campPerDistrict[area.ordinal()].add(camp); } } private static void makeStreets(){ stdStreet[StreetNames.KA_STREET.ordinal()] = new Street(4700,3, StreetNames.KA_STREET); stdStreet[StreetNames.FOURTH_HIGHWAY1.ordinal()] = new Street(4850,4, StreetNames.FOURTH_HIGHWAY1); 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.THIRD_HIGHWAY.ordinal()] = new Street(8200,3, StreetNames.THIRD_HIGHWAY); stdStreet[StreetNames.STREET1.ordinal()] = new Street(7800,4, StreetNames.STREET1); stdStreet[StreetNames.STREET2.ordinal()] = new Street(2400,3,StreetNames.STREET2); 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.IBRAHIM_ALKHALIL2.ordinal()] = new Street(3200,2, StreetNames.IBRAHIM_ALKHALIL2); stdStreet[StreetNames.IBRAHIM_ALKHALIL1.ordinal()] = new Street(4500,3, StreetNames.IBRAHIM_ALKHALIL1); stdStreet[StreetNames.KKH_STREET.ordinal()] = new Street(3300,3, StreetNames.KKH_STREET); } private static void makeRoutes() { //******Arafat day stdRoutes[RouteName.AlHijraToArafat1.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.STREET1.ordinal()]}, District.ALHIJRA, Mashier.ARAFAT); stdRoutes[RouteName.AlHijraToArafat2.ordinal()] = new Route(new Street[]{ stdStreet[StreetNames.JABAL_THAWR_STREET.ordinal()], stdStreet[StreetNames.FOURTH_HIGHWAY2.ordinal()], stdStreet[StreetNames.STREET1.ordinal()] },District.ALHIJRA, Mashier.ARAFAT); stdRoutes[RouteName.AlMansoorToArafat1.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.STREET3.ordinal()], stdStreet[StreetNames.KA_STREET.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.STREET1.ordinal()] },District.ALMANSOOR, Mashier.ARAFAT); stdRoutes[RouteName.AlMansoorToArafat2.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.IBRAHIM_ALKHALIL2.ordinal()], stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.STREET1.ordinal()] },District.ALMANSOOR, Mashier.ARAFAT); //Optimal for Almansoor stdRoutes[RouteName.AlMansoorToArafat3.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.IBRAHIM_ALKHALIL2.ordinal()], stdStreet[StreetNames.IBRAHIM_ALKHALIL1.ordinal()], stdStreet[StreetNames.FOURTH_HIGHWAY1.ordinal()], stdStreet[StreetNames.FOURTH_HIGHWAY2.ordinal()], stdStreet[StreetNames.STREET1.ordinal()] },District.ALMANSOOR, Mashier.ARAFAT); stdRoutes[RouteName.AlAziziToArafat1.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.KA_STREET.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.STREET1.ordinal()] },District.ALAZIZIYA, Mashier.ARAFAT); //******Arafat day end //******Mina Leave stdRoutes[RouteName.MinaToAlMansoor1.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.KKH_STREET.ordinal()], stdStreet[StreetNames.KA_STREET.ordinal()], stdStreet[StreetNames.STREET3.ordinal()] },District.ALMANSOOR, Mashier.MINA); stdRoutes[RouteName.MinaToAlMansoor2.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()], stdStreet[StreetNames.IBRAHIM_ALKHALIL2.ordinal()] },District.ALMANSOOR, Mashier.MINA); stdRoutes[RouteName.MinaToAlMansoor3.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()], stdStreet[StreetNames.FOURTH_HIGHWAY2.ordinal()], stdStreet[StreetNames.FOURTH_HIGHWAY1.ordinal()], stdStreet[StreetNames.IBRAHIM_ALKHALIL1.ordinal()], stdStreet[StreetNames.IBRAHIM_ALKHALIL2.ordinal()] },District.ALMANSOOR, Mashier.MINA); stdRoutes[RouteName.MinaToAlhijra1.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()] },District.ALHIJRA, Mashier.MINA); stdRoutes[RouteName.MinaToAlhijra2.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()], stdStreet[StreetNames.FOURTH_HIGHWAY2.ordinal()], stdStreet[StreetNames.JABAL_THAWR_STREET.ordinal()] },District.ALHIJRA, Mashier.MINA); stdRoutes[RouteName.MinaToAlhijra3.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.KKH_STREET.ordinal()], stdStreet[StreetNames.THIRD_HIGHWAY.ordinal()] },District.ALHIJRA, Mashier.MINA); stdRoutes[RouteName.MinaToAlaziziya1.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.KKH_STREET.ordinal()], stdStreet[StreetNames.KA_STREET.ordinal()], },District.ALAZIZIYA, Mashier.MINA); stdRoutes[RouteName.MinaToAlaziziya2.ordinal()] = new Route( new Street[]{ stdStreet[StreetNames.FOURTH_HIGHWAY3.ordinal()], stdStreet[StreetNames.STREET2.ordinal()], stdStreet[StreetNames.KA_STREET.ordinal()], },District.ALAZIZIYA, Mashier.MINA); //******Mina Leave end } private static void fillBusesToList() { for (Campaign camp : listOfCampaigns) { listOfVehicles.addAll(camp.getVehicles()); } } private static void addCivilVehicleNoise() { for (Street street: stdStreet) { if (street.getPercentRemainingCapacity() >= 80) continue; int numOfSedan = (int)getRandom(10,15); int numOfSUV = (int)getRandom(5,9); int numOfTruck = (int)getRandom(3,6); if (!street.isContainsBuses()) { numOfSedan *= 5; numOfSUV *= 5; numOfTruck *= 2; } if (street.getName() == StreetNames.FOURTH_HIGHWAY1) numOfSedan = (int) (numOfSedan * 0.5); if (street.getName() == StreetNames.FOURTH_HIGHWAY2) numOfSedan = (int) (numOfSedan * 0.5); if (street.getName() == StreetNames.STREET3) numOfSedan = (int) (numOfSedan * 1.5); if (street.getName() == StreetNames.IBRAHIM_ALKHALIL2) numOfSedan = (int) (numOfSedan * 1.2); for (int x = 0; x < numOfSedan; x++) { Sedan car = new Sedan(getRandom(4, 5)); double pointOfEntry = getRandom(0, street.getLength());//TODO: consider getLength - x if (street.capcityPoint(pointOfEntry, pointOfEntry+1500) < 1){ listOfVehicles.add(car); car.setCurrentLocation(pointOfEntry); car.setRoute(new Route(street)); car.setCurrentStreet(street); } } if (street.getName() == StreetNames.FOURTH_HIGHWAY1) numOfTruck = (int) (numOfTruck * 0.5); if (street.getName() == StreetNames.FOURTH_HIGHWAY2) numOfTruck = (int) (numOfTruck * 0.5); if (street.getName() == StreetNames.STREET3) numOfTruck = (int) (numOfTruck * 1.5); if (street.getName() == StreetNames.IBRAHIM_ALKHALIL2) numOfSedan = (int) (numOfSedan * 1.2); for (int x = 0; x < numOfTruck; x++) { Truck car = new Truck(getRandom(4, 5)); double pointOfEntry = getRandom(0, street.getLength()); if (street.capcityPoint(pointOfEntry, pointOfEntry+1500) < 1){ listOfVehicles.add(car); car.setCurrentLocation(pointOfEntry); car.setRoute(new Route(street)); car.setCurrentStreet(street); } } if (street.getName() == StreetNames.FOURTH_HIGHWAY1) numOfSUV = (int) (numOfSUV * 0.5); if (street.getName() == StreetNames.FOURTH_HIGHWAY2) numOfSUV = (int) (numOfSUV * 0.5); if (street.getName() == StreetNames.STREET3) numOfSUV = (int) (numOfSUV * 1.5); if (street.getName() == StreetNames.IBRAHIM_ALKHALIL2) numOfSUV = (int) (numOfSedan * 1.2); for (int x = 0; x < numOfSUV; x++) { SUV car = new SUV(getRandom(4, 5)); double pointOfEntry = getRandom(0, street.getLength()); if (street.capcityPoint(pointOfEntry, pointOfEntry+1500) < 1){ listOfVehicles.add(car); car.setCurrentLocation(pointOfEntry); car.setRoute(new Route(street)); car.setCurrentStreet(street); } } } } public static PDate getTimeMan() { return currenttimeManager; } /** * Find shortest path without respect to traffic * @param campaign * @return */ private static Route getBestRoute(Campaign campaign , Mashier mashier) { //ArrayList routes = (ArrayList) 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 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; } /** * Find routes that connect to a certain district. * @param district * @return Array of routes that connect to 'district' */ private static Route[] getRoutesToDistrict(District district) { ArrayList routes = new ArrayList<>(); for (Route route : stdRoutes) { if (route.getHotelArea() == district) { routes.add(route); } } Route[] routesArray = new Route[routes.size()]; return routes.toArray(routesArray); } private static String getStreetsReport() { String status = ""; if (currenttimeManager == firstDayTimeMan) status = " Status: Heading to Arafat"; else status = " Status: Heading to hotels"; String headerFormat = "******Streets report*****\n" + "Time: %s%s\n" + " Street name |Street Load| Total | Buses | Local Vehicles | Avg. Time |\n"; StringBuilder report = new StringBuilder(); report.append(String.format(headerFormat, currenttimeManager.getCurrentTime(), status)); String streetFormat = "%-18s | %%%-8s | %5d | %5d | %14d | %-10s|"; for (int i = 0; i < stdStreet.length; i++) { int cap = stdStreet[i].getPercentRemainingCapacity(); report.append(String.format(streetFormat, stdStreet[i].getName().name(), cap, stdStreet[i].getVehicles().size(), stdStreet[i].getNumberOfBuses(), stdStreet[i].getNumberOfLocalCars(), avgTimeOnStreet(stdStreet[i]))); report.append("\n"); } report.append("\n").append(getFinalRep()).append("\n"); report.append(preSimulationReport()).append("Type m+Enter to view menu"); return report.toString(); } private static String getFinalRep() { StringBuilder s = new StringBuilder(); int numberOfBusses = 0; int numberOfArrivedBuses = getNumberOfArrivedBusses(); //Redundant loops slow down execution. find better sol. for (Campaign campaign : listOfCampaigns) { numberOfBusses += campaign.getNumberOfBusses(); } String fFormat = "All arrived to %s at: %s"; boolean arr = isAllArrived();//since it has looping. use once. if (arr && allArrivedToArafatTime != null) s.append(String.format(fFormat,"Arafat",allArrivedToArafatTime)).append("\n"); if (arr && allArrivedToHotelsTime != null) s.append(String.format(fFormat,"Hotels",allArrivedToHotelsTime)).append("\n"); s.append(String.format("Buses: %d, Buses done: %d %s\nBuses arrived in the last hour: %d, Average trip in last hour: %s\n", numberOfBusses, numberOfArrivedBuses, minMaxRep() , getNumberOfArrivedBussesPerHour(), avgTimeOfTrip())); return s.toString(); } private static String minMaxRep() { StringBuilder report = new StringBuilder(); if (Vehicle.getMaxArrived() != null && Vehicle.getMinArrived() != null) { report.append(String.format(" Maximum trip %s,", Vehicle.getMaxArrived().timeToString())); report.append(String.format(" Minimum trip %s", Vehicle.getMinArrived().timeToString())); } return report.toString(); } /** * Calculate average trip time for last 10 minutes * @return "hh:mm" */ public static String avgTimeOfTrip() { //TODO: does output diff value even after all have arrived. Calendar now = currenttimeManager.getCurrentCalendar(); 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 static int getPercentArrival(District district) { int sum = 0; for (Campaign campaign : campPerDistrict[district.ordinal()]) { sum += campaign.getPercentArrived(); } return sum/campPerDistrict[district.ordinal()].size(); } public 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++; } } }//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 " n/a"; return String.format("%2d:%02d", hours,minutes); } public static int getNumberOfArrivedBusses() { int num = 0; for (Campaign campaign : listOfCampaigns) { for (Vehicle vehicle : campaign.getVehicles()){ if (vehicle instanceof Bus && vehicle.isArrivedToDest()) num++; } } return num; } public static int getNumberOfArrivedBussesPerHour() { Calendar now = currenttimeManager.getCurrentCalendar(); 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; } private static boolean isAllArrived() { for (Campaign campaign : listOfCampaigns) if (!campaign.isDone()) return false; return true; } private static String preSimulationReport() { StringBuilder report = new StringBuilder(); report.append("******************************District details******************************\n"); report.append(" District | Campaigns | Busses | Arrival | Avg Time | Best time to Arafat | Best time to District |\n"); for (int i = 0; i < campPerDistrict.length; i++) { //Per District, i denotes district index report.append(String.format("%-10s|",campPerDistrict[i].get(0).getHotelDistrict().name())); report.append(String.format(" %-10d|",campPerDistrict[i].size())); report.append(String.format(" %-7d|", busesInDistrict(District.values()[i]))); report.append(String.format(" %%%-7d|", getPercentArrival(District.values()[i]))); report.append(String.format(" %-9s|", getAvgTimeOfTrip(District.values()[i]))); 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()))); //Calc values per dist here. //TODO: add arrived buses colum (NO NEED) report.append("\n"); } return report.toString(); } //This is for ALL vehicles, should make it for last hour to be consistent with the report. 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); } public static int busesInDistrict(District district){ int buses = 0; for (Campaign campaign : campPerDistrict[district.ordinal()]){ buses += campaign.getNumberOfBusses(); } 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()); 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"; } }