2020-12-06 02:07:49 +01:00
|
|
|
import java.io.*;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Date;
|
2020-12-16 14:51:45 +01:00
|
|
|
import java.util.List;
|
2020-12-06 02:07:49 +01:00
|
|
|
|
|
|
|
public class DataManeger {
|
|
|
|
|
2020-12-14 04:28:18 +01:00
|
|
|
private File workingDir;
|
2020-12-06 02:07:49 +01:00
|
|
|
|
2020-12-14 04:28:18 +01:00
|
|
|
public DataManeger(){
|
2020-12-16 14:26:40 +01:00
|
|
|
workingDir = new File("./data/");
|
|
|
|
workingDir.mkdir();
|
|
|
|
clearData();
|
2020-12-06 02:07:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean stateAvailable(Date time) {
|
2020-12-16 14:26:40 +01:00
|
|
|
File f = new File(String.format("./data/%s.bin", time.getTime()));
|
2020-12-06 02:07:49 +01:00
|
|
|
return f.exists();
|
|
|
|
}
|
|
|
|
|
2020-12-16 14:26:40 +01:00
|
|
|
public State loadState(Date time){
|
2020-12-06 02:07:49 +01:00
|
|
|
State state = null;
|
|
|
|
if (stateAvailable(time)){
|
|
|
|
try {
|
|
|
|
ObjectInputStream objectInputStream = new ObjectInputStream(
|
2020-12-16 14:26:40 +01:00
|
|
|
new FileInputStream(String.format("./data/%s.bin", time.getTime())));
|
2020-12-06 02:07:49 +01:00
|
|
|
state = (State)objectInputStream.readObject();
|
|
|
|
objectInputStream.close();
|
|
|
|
} catch (IOException | ClassNotFoundException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean saveState(State state, Date time){
|
|
|
|
try {
|
2020-12-16 14:26:40 +01:00
|
|
|
FileOutputStream fs = new FileOutputStream(String.format("./data/%s.bin", time.getTime()));
|
2020-12-06 02:07:49 +01:00
|
|
|
BufferedOutputStream bfs = new BufferedOutputStream(fs);
|
|
|
|
ObjectOutputStream objectOutputStream = new ObjectOutputStream(bfs);
|
|
|
|
objectOutputStream.writeObject(state);
|
|
|
|
objectOutputStream.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2020-12-14 04:28:18 +01:00
|
|
|
|
|
|
|
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;
|
2020-12-16 14:26:40 +01:00
|
|
|
long time = Long.parseLong(timeInName);
|
2020-12-14 04:28:18 +01:00
|
|
|
timesList.add(new HijriDate(time));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Date[] times = new Date[timesList.size()];
|
|
|
|
times = timesList.toArray(times);
|
|
|
|
return times;
|
|
|
|
}
|
2020-12-16 14:26:40 +01:00
|
|
|
|
2020-12-16 14:51:45 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2020-12-16 14:26:40 +01:00
|
|
|
private void clearData() {
|
|
|
|
for (File file : savedStateFiles()) {
|
|
|
|
if (file.getName().contains(".bin")){
|
|
|
|
file.delete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-12-06 02:07:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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 Route[] stdRoutes;
|
|
|
|
private Street[] stdStreet;
|
|
|
|
private Date allArrivedToArafatTime;
|
|
|
|
private Date allArrivedToHotelsTime;
|
2020-12-16 14:51:45 +01:00
|
|
|
private Date stateTime;
|
|
|
|
|
|
|
|
public State(ArrayList<Campaign> listOfCampaigns,
|
|
|
|
ArrayList<Vehicle> listOfVehicles,
|
|
|
|
Route[] stdRoutes,
|
|
|
|
Street[] stdStreet,
|
|
|
|
Date allArrivedToArafatTime,
|
|
|
|
Date allArrivedToHotelsTime,
|
|
|
|
Date stateTime) {
|
2020-12-06 02:07:49 +01:00
|
|
|
//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.stdRoutes = stdRoutes.clone();
|
|
|
|
this.stdStreet = stdStreet.clone();
|
|
|
|
if (allArrivedToArafatTime != null) {
|
|
|
|
this.allArrivedToArafatTime = (Date) allArrivedToArafatTime.clone();
|
|
|
|
}
|
|
|
|
if (allArrivedToHotelsTime != null) {
|
|
|
|
this.allArrivedToHotelsTime = (Date) allArrivedToHotelsTime.clone();
|
|
|
|
}
|
2020-12-16 14:51:45 +01:00
|
|
|
this.stateTime = stateTime;
|
2020-12-06 02:07:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<Campaign> getListOfCampaigns() {
|
|
|
|
return listOfCampaigns;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<Vehicle> getListOfVehicles() {
|
|
|
|
return listOfVehicles;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Route[] getStdRoutes() {
|
|
|
|
return stdRoutes;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Street[] getStdStreet() {
|
|
|
|
return stdStreet;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Date getAllArrivedToArafatTime() {
|
|
|
|
return allArrivedToArafatTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Date getAllArrivedToHotelsTime() {
|
|
|
|
return allArrivedToHotelsTime;
|
|
|
|
}
|
2020-12-16 15:42:26 +01:00
|
|
|
|
|
|
|
public Date getStateTime() {
|
|
|
|
return stateTime;
|
|
|
|
}
|
|
|
|
|
2020-12-06 02:07:49 +01:00
|
|
|
}
|