/*
Copywrite 2013-2016 Christian Moll, Will Winder, Bob Jones
This file is part of Universal Gcode Sender (UGS).
UGS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.universalgcodesender.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.willwinder.universalgcodesender.i18n.Localization;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
/**
*
* @author moll
*/
public class SettingsFactory {
private static final Logger logger = Logger.getLogger(SettingsFactory.class.getName());
private static final String USER_HOME = "user.home";
private static final String FALSE = "false";
public static final String SETTINGS_DIRECTORY_NAME = "ugs";
public static final String PROPERTIES_FILENAME = "UniversalGcodeSender.properties";
public static final String JSON_FILENAME = "UniversalGcodeSender.json";
public static final String MAC_LIBRARY = "/Library/Preferences/";
public static Settings loadSettings() {
migrateOldSettings();
// the defaults are now in the settings bean
Settings out = null;
File settingsFile = getSettingsFile();
if (!settingsFile.exists()) {
out = new Settings();
} else {
try {
//logger.log(Level.INFO, "{0}: {1}", new Object[]{Localization.getString("settings.log.location"), settingsFile});
logger.log(Level.INFO, "Log location: {0}", settingsFile.getAbsolutePath());
logger.info("Loading settings.");
out = new Gson().fromJson(new FileReader(settingsFile), Settings.class);
if (out != null) {
out.finalizeInitialization();
}
// Localized setting not available here.
//logger.info(Localization.getString("settings.log.loading"));
} catch (FileNotFoundException ex) {
//logger.warning(Localization.getString("settings.log.error"));
logger.log(Level.SEVERE, "Can't load settings, using defaults.", ex);
}
}
if (out == null) return new Settings();
return out;
}
public static void saveSettings(Settings settings) {
logger.info(Localization.getString("settings.log.saving"));
try {
// Save json file.
File jsonFile = getSettingsFile();
try (FileWriter fileWriter = new FileWriter(jsonFile)) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
fileWriter.write(gson.toJson(settings, Settings.class));
}
} catch (Exception e) {
e.printStackTrace();
logger.warning(Localization.getString("settings.log.saveerror"));
}
}
/**
* This is public in case other classes need to save settings somewhere.
*/
public static File getSettingsDirectory() {
String homeDir = System.getProperty(USER_HOME);
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("mac")) {
homeDir = homeDir + MAC_LIBRARY;
}
if (!homeDir.endsWith(File.separator)) {
homeDir = homeDir + File.separator + ".";
}
File dir = new File(homeDir + SETTINGS_DIRECTORY_NAME);
dir.mkdirs();
return dir;
}
/**
* Convert legacy property file to JSON, move files from top level setting
* directory to UGS settings directory.
*/
private static void migrateOldSettings() {
File newSettingsDir = getSettingsDirectory();
File oldSettingDir = newSettingsDir.getParentFile();
File oldPropertyFile = new File(oldSettingDir, PROPERTIES_FILENAME);
File oldJsonFile = new File(oldSettingDir, JSON_FILENAME);
// Convert property file in old location to json file in new location.
if (oldPropertyFile.exists()) {
try {
Settings out = new Settings();
//logger.log(Level.INFO, "{0}: {1}", new Object[]{Localization.getString("settings.log.location"), settingsFile});
logger.log(Level.INFO, "Log location: {0}", oldPropertyFile.getAbsolutePath());
Properties properties = new Properties();
properties.load(new FileInputStream(oldPropertyFile));
out.setLastOpenedFilename(properties.getProperty("last.dir", System.getProperty(USER_HOME)));
out.setPort(properties.getProperty("port", ""));
out.setPortRate(properties.getProperty("port.rate", "9600"));
out.setManualModeEnabled(Boolean.valueOf(properties.getProperty("manualMode.enabled", FALSE)));
out.setManualModeStepSize(Double.valueOf(properties.getProperty("manualMode.stepsize", "1")));
out.setScrollWindowEnabled(Boolean.valueOf(properties.getProperty("scrollWindow.enabled", "true")));
out.setVerboseOutputEnabled(Boolean.valueOf(properties.getProperty("verboseOutput.enabled", FALSE)));
out.setFirmwareVersion(properties.getProperty("firmwareVersion", "GRBL"));
out.setSingleStepMode(Boolean.valueOf(properties.getProperty("singleStepMode", FALSE)));
out.setStatusUpdatesEnabled(Boolean.valueOf(properties.getProperty("statusUpdatesEnabled", "true")));
out.setStatusUpdateRate(Integer.valueOf(properties.getProperty("statusUpdateRate", "200")));
out.setDisplayStateColor(Boolean.valueOf(properties.getProperty("displayStateColor", "true")));
out.updateMacro(1, null, null, properties.getProperty("customGcode1", "G0 X0 Y0;"));
out.updateMacro(2, null, null, properties.getProperty("customGcode2", "G0 G91 X10;G0 G91 Y10;"));
out.updateMacro(3, null, null, properties.getProperty("customGcode3", ""));
out.updateMacro(4, null, null, properties.getProperty("customGcode4", ""));
out.updateMacro(5, null, null, properties.getProperty("customGcode5", ""));
out.setLanguage(properties.getProperty("language", "en_US"));
saveSettings(out);
// Delete the old settings file if it exists.
oldPropertyFile.delete();
} catch (IOException ex) {
Logger.getLogger(SettingsFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
// Move old json file from old location to new location.
else if (oldJsonFile.exists()) {
try {
// If the new file doesn't exist, move the old one.
if (!getSettingsFile().exists()) {
FileUtils.moveFile(oldJsonFile, getSettingsFile());
}
// Delete the old settings file if it exists.
oldJsonFile.delete();
} catch (IOException ex) {
Logger.getLogger(SettingsFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private static File getSettingsFile() {
File settingDir = SettingsFactory.getSettingsDirectory();
File json = new File (settingDir, JSON_FILENAME);
return json;
}
}