package betsy.common.timeouts.calibration; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import betsy.common.timeouts.CSV; import betsy.common.timeouts.Properties; import betsy.common.timeouts.timeout.Timeout; /** * @author Christoph Broeker * @version 1.0 */ public class CalibrationTimeouts { private List<CalibrationTimeout> calibrationTimeouts = new ArrayList<>(); private Path properties = Paths.get("timeout.properties"); private Path csv = Paths.get("calibration_timeouts.csv"); /** * */ public CalibrationTimeouts() { } /** * @param calibrationTimeouts The calibrationTimeouts, which should be managed by the {@link CalibrationTimeouts}. * @param nameOfProperties The name of the properties file. * @param nameOfCSV The name of the csv file. */ public CalibrationTimeouts(ArrayList<CalibrationTimeout> calibrationTimeouts, String nameOfProperties, String nameOfCSV) { Objects.requireNonNull(nameOfProperties, "nameOfProperties can't be null."); if (nameOfProperties.length() > 0) { this.properties = Paths.get(nameOfProperties); } Objects.requireNonNull(nameOfCSV, "nameOfCCSV can't be null."); if (nameOfCSV.length() > 0) { this.csv = Paths.get(nameOfCSV + ".csv"); } this.calibrationTimeouts = Objects.requireNonNull(calibrationTimeouts, "calibrationTimeouts can't be null."); } /** * @param nameOfProperties The name of the properties file. * @param nameOfCSV The name of the csv file. */ public CalibrationTimeouts(String nameOfProperties, String nameOfCSV) { Objects.requireNonNull(nameOfProperties, "nameOfProperties can't be null."); if (nameOfProperties.length() > 0) { this.properties = Paths.get(nameOfProperties); } Objects.requireNonNull(nameOfCSV, "nameOfCCSV can't be null."); if (nameOfCSV.length() > 0) { this.csv = Paths.get(nameOfCSV + ".csv"); } } /** * @param calibrationTimeouts The calibrationTimeouts, which should be managed by the {@link CalibrationTimeouts}. */ public CalibrationTimeouts(ArrayList<CalibrationTimeout> calibrationTimeouts) { this.calibrationTimeouts = Objects.requireNonNull(calibrationTimeouts, "calibrationTimeouts can't be null."); } /** * With this method it is possible to add a {@link CalibrationTimeout}. * * @param calibrationTimeout The {@link CalibrationTimeout} to add to the {@link CalibrationTimeouts}. */ public void addCalibrationTimeout(CalibrationTimeout calibrationTimeout) { calibrationTimeouts.add(calibrationTimeout); } /** * This method returns the {@link CalibrationTimeout} for given key. * * @param key The key of the {@link CalibrationTimeout}. * @return The {@link CalibrationTimeout] for the given key. */ public CalibrationTimeout getCalibrationTimeout(String key) { return getAllCalibrationTimeouts().get(key); } /** * This method returns all {@link CalibrationTimeout}. * * @return A {@link HashMap} with the key of {@link CalibrationTimeout} and the {@link CalibrationTimeout}. */ public HashMap<String, CalibrationTimeout> getAllCalibrationTimeouts() { HashMap<String, CalibrationTimeout> calibrationTimeoutsHashMap = new HashMap<>(); for (CalibrationTimeout timeout : calibrationTimeouts) { calibrationTimeoutsHashMap.put(timeout.getCalibrationTimeoutKey(), timeout); } return calibrationTimeoutsHashMap; } /** * This method returns all CalibrationTimeouts once only. * * @return A {@link HashMap} with the timeouts. */ public HashMap<String, CalibrationTimeout> getAllNonRedundantTimeouts() { HashMap<String, CalibrationTimeout> timeouts = getAllCalibrationTimeouts(); HashMap<String, CalibrationTimeout> calibrationTimeouts = new HashMap<>(); for (CalibrationTimeout calibrationTimeout : timeouts.values()) { if (!calibrationTimeouts.containsKey(calibrationTimeout.getKey())) { calibrationTimeouts.put(calibrationTimeout.getKey(), calibrationTimeout); } else if (calibrationTimeout.getStatus() == CalibrationTimeout.Status.EXCEEDED) { calibrationTimeouts.remove(calibrationTimeout.getKey()); calibrationTimeouts.put(calibrationTimeout.getKey(), calibrationTimeout); } } return calibrationTimeouts; } /** * This method writes all given {@link CalibrationTimeout} to the properties. */ public void writeAllCalibrationTimeoutsToProperties() { List<CalibrationTimeout> timeouts = new ArrayList<>(getAllNonRedundantTimeoutsProperties().values()); Properties.write(properties, convertCalibrationTimeoutListToTimeoutList(timeouts)); } /** * The method writes all timeouts to a csv file. * * @param csv The csv path, where the timeout values should be saved. * @param numberOfDuration The number of calibration iterations. */ public void writeToCSV(Path csv, int numberOfDuration) { Objects.requireNonNull(csv, "The csv file can't be null."); CSV.write(csv, calibrationTimeouts, numberOfDuration); } /** * The method writes all timeouts to a csv file. */ public void writeToCSV() { CSV.write(csv, calibrationTimeouts); } /** * This method removes all values from the timeout list. */ public void clean() { calibrationTimeouts = new ArrayList<>(); } private List<Timeout> convertCalibrationTimeoutListToTimeoutList(List<CalibrationTimeout> calibrationTimeouts) { return calibrationTimeouts.stream().collect(Collectors.toCollection(ArrayList::new)); } private HashMap<String, CalibrationTimeout> getAllNonRedundantTimeoutsProperties() { HashMap<String, CalibrationTimeout> timeouts = getAllCalibrationTimeouts(); HashMap<String, CalibrationTimeout> calibrationTimeouts = new HashMap<>(); //write only kept and highest timeouts to the properties timeouts.values().stream().filter(calibrationTimeout -> calibrationTimeout.getStatus() == CalibrationTimeout.Status.KEPT).forEach(calibrationTimeout -> { if (!calibrationTimeouts.containsKey(calibrationTimeout.getKey())) { calibrationTimeouts.put(calibrationTimeout.getKey(), calibrationTimeout); } else if (calibrationTimeout.getTimeoutInMs() > calibrationTimeouts.get(calibrationTimeout.getKey()).getTimeoutInMs()) { calibrationTimeouts.remove(calibrationTimeout.getKey()); calibrationTimeouts.put(calibrationTimeout.getKey(), calibrationTimeout); } }); return calibrationTimeouts; } }