/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program 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.
*
* This program 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 this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.platform.settings;
import com.google.common.base.Strings;
import com.jgoodies.binding.beans.Model;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.*;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Settings extends Model {
private static final String userPath = System.getProperty("user.home", ".");
public static final String CONFIG_PATH = userPath + File.separator + ".gitools";
private static final String configFileName = "ui.xml";
private static final String configFile = CONFIG_PATH + File.separator + configFileName;
private static Settings instance;
private static final int DEFAULT_EDITOR_TAB_LENGTH = 20;
private static final String DEFAULT_IGV_URL = "http://127.0.0.1:60151";
private static final String DEFAULT_WELCOME_URL = "http://www.gitools.org/welcome";
private static final int DEFAULT_SVG_BODY_LIMIT = 50000;
public static final String PROPERTY_USAGE_STATS = "allowUsageStatistics";
public static final String PROPERTY_TIPS = "showTipsAtStartup";
public static final String PROPERTY_PORT_ENABLED = "portEnabled";
public static final String PROPERTY_PORT = "defaultPort";
public static final String PROPERTY_IGV_ENABLED = "showIGVLink";
public static final String PROPERTY_IGV_URL = "igvUrl";
public static final String PROPERTY_AUTHOR_NAME = "authorName";
public static final String PROPERTY_AUTHOR_EMAIL = "authorEmail";
public static final String PROPERTY_RECENT_FILES_NUMBER = "recentFilesNumber";
public static final String PROPERTY_PROXY_ENABLED = "proxyEnabled";
public static final String PROPERTY_PROXY_PORT = "proxyPort";
public static final String PROPERTY_PROXY_HOST = "proxyHost";
private String authorName = System.getProperty("user.name");
private String authorEmail = "";
private String lastFilterPath = userPath;
private String lastAnnotationPath = userPath;
private String lastMapPath = userPath;
private String lastDataPath = userPath;
private String lastWorkPath = userPath;
private String lastExportPath = userPath;
private String lastImportPath = userPath;
private String lastPath = userPath;
@XmlElementWrapper(name = "recentFiles")
@XmlElement(name = "file")
private List<String> recentFiles = new ArrayList<>();
private int recentFilesNumber = 5;
private String version;
private String uuid;
private int editorTabLength = DEFAULT_EDITOR_TAB_LENGTH;
// Editable parameters
private boolean allowUsageStatistics = true;
private String statisticsConsentmentVersion = "";
private boolean showTipsAtStartup = true;
private boolean showMutualExclusionProgress = false;
private String welcomeUrl = DEFAULT_WELCOME_URL;
private boolean debugMode = false;
// Port parameters
private boolean portEnabled = true;
private int defaultPort = 50151;
// IGV parameters
private boolean showIGVLink = true;
private String igvUrl = DEFAULT_IGV_URL;
// Preview features
private boolean previewFeatures = false;
// SVG body bitmap limit
private int svgBodyLimit = DEFAULT_SVG_BODY_LIMIT;
// Proxy settings
private boolean proxyEnabled = false;
private String proxyHost = "";
private int proxyPort = 8080;
private Settings() {
}
public static Settings get() {
if (instance == null) {
instance = load();
}
return instance;
}
private static Settings load() {
Settings settings = null;
try {
Reader reader = new FileReader(configFile);
JAXBContext context = JAXBContext.newInstance(Settings.class);
Unmarshaller u = context.createUnmarshaller();
settings = (Settings) u.unmarshal(reader);
reader.close();
} catch (FileNotFoundException e) {
System.err.println("Settings file doesn't exist: " + configFile);
System.err.println("Created one with defaults.");
settings = new Settings();
settings.save();
} catch (Exception e) {
e.printStackTrace();
settings = new Settings();
}
return settings;
}
public void save() {
File path = new File(CONFIG_PATH);
if (!path.exists()) {
path.mkdirs();
}
try {
FileWriter writer = new FileWriter(configFile);
JAXBContext context = JAXBContext.newInstance(Settings.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(this, writer);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getAuthorEmail() {
return authorEmail;
}
public void setAuthorEmail(String authorEmail) {
this.authorEmail = authorEmail;
}
public String getLastPath() {
return lastPath;
}
public void setLastPath(String lastPath) {
this.lastPath = lastPath;
}
public String getLastImportPath() {
return lastImportPath;
}
public void setLastImportPath(String lastImportPath) {
this.lastImportPath = lastImportPath;
}
public String getLastExportPath() {
return lastExportPath;
}
public void setLastExportPath(String lastExportPath) {
this.lastExportPath = lastExportPath;
}
public String getLastWorkPath() {
return lastWorkPath;
}
public void setLastWorkPath(String lastWorkPath) {
this.lastWorkPath = lastWorkPath;
}
public String getLastDataPath() {
return lastDataPath;
}
public void setLastDataPath(String lastDataPath) {
this.lastDataPath = lastDataPath;
}
public String getLastMapPath() {
return lastMapPath;
}
public void setLastMapPath(String lastMapPath) {
this.lastMapPath = lastMapPath;
}
public String getLastAnnotationPath() {
return lastAnnotationPath;
}
public void setLastAnnotationPath(String lastAnnotationPath) {
this.lastAnnotationPath = lastAnnotationPath;
}
public String getLastFilterPath() {
return lastFilterPath;
}
public void setLastFilterPath(String lastFilterPath) {
this.lastFilterPath = lastFilterPath;
}
public boolean isShowTipsAtStartup() {
return showTipsAtStartup;
}
public void setShowTipsAtStartup(boolean showTipsAtStartup) {
boolean old = this.showTipsAtStartup;
this.showTipsAtStartup = showTipsAtStartup;
firePropertyChange(PROPERTY_TIPS, old, showTipsAtStartup);
}
public boolean isDebugMode() {
return debugMode;
}
public void setDebugMode(boolean debugMode) {
this.debugMode = debugMode;
}
public boolean isPortEnabled() {
return portEnabled;
}
public void setPortEnabled(boolean portEnabled) {
this.portEnabled = portEnabled;
}
public Integer getDefaultPort() {
return defaultPort;
}
public void setDefaultPort(Integer defaultPort) {
this.defaultPort = defaultPort;
}
public String getIgvUrl() {
return igvUrl;
}
public void setIgvUrl(String igvUrl) {
this.igvUrl = igvUrl;
}
public boolean isShowIGVLink() {
return showIGVLink;
}
public void setShowIGVLink(boolean showIGVLink) {
this.showIGVLink = showIGVLink;
}
public boolean isPreviewFeatures() {
return previewFeatures;
}
public void setPreviewFeatures(boolean previewFeatures) {
this.previewFeatures = previewFeatures;
}
public int getEditorTabLength() {
return editorTabLength;
}
public void setEditorTabLength(int editorTabLength) {
this.editorTabLength = editorTabLength;
}
public boolean isShowMutualExclusionProgress() {
return showMutualExclusionProgress;
}
public void setShowMutualExclusionProgress(boolean showMutualExclusionProgress) {
this.showMutualExclusionProgress = showMutualExclusionProgress;
}
public int getSvgBodyLimit() {
return svgBodyLimit;
}
public void setSvgBodyLimit(int svgBodyLimit) {
this.svgBodyLimit = svgBodyLimit;
}
public boolean isAllowUsageStatistics() {
return allowUsageStatistics;
}
public void setAllowUsageStatistics(boolean allowUsageStatistics) {
this.allowUsageStatistics = allowUsageStatistics;
}
public String getStatisticsConsentmentVersion() {
return statisticsConsentmentVersion;
}
public boolean isProxyEnabled() {
return proxyEnabled;
}
public void setProxyEnabled(boolean proxyEnabled) {
this.proxyEnabled = proxyEnabled;
}
public String getProxyHost() {
return proxyHost;
}
public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
public int getProxyPort() {
return proxyPort;
}
public void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
public void setStatisticsConsentmentVersion(String statisticsConsentmentVersion) {
this.statisticsConsentmentVersion = statisticsConsentmentVersion;
}
public String getWelcomeUrl() {
return welcomeUrl;
}
public void setWelcomeUrl(String welcomeUrl) {
this.welcomeUrl = welcomeUrl;
}
public String getUuid() {
if (Strings.isNullOrEmpty(uuid) && isAllowUsageStatistics()) {
uuid = UUID.randomUUID().toString();
}
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public void addRecentFile(String fileName) {
if (recentFiles.contains(fileName)) {
recentFiles.remove(fileName);
}
recentFiles.add(fileName);
while (recentFiles.size() > recentFilesNumber) {
recentFiles.remove(0);
}
}
public void setRecentFiles(List<String> recentFiles) {
this.recentFiles = recentFiles;
}
/**
* Returns a list of up to 5 last .heatmap files accessed
* in revers order (most recent last)
*
* @return
*/
public List<String> getRecentFiles() {
return recentFiles;
}
public int getRecentFilesNumber() {
return recentFilesNumber;
}
public void setRecentFilesNumber(int recentFilesNumber) {
this.recentFilesNumber = recentFilesNumber;
}
public Proxy getProxy() {
if (isProxyEnabled()) {
// Update system proxy
System.getProperties().put("http.proxyHost", getProxyHost());
System.getProperties().put("http.proxyPort", getProxyPort());
return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(getProxyHost(), getProxyPort()));
}
// Update system proxy
System.getProperties().put("http.proxyHost", "");
System.getProperties().put("http.proxyPort", "");
return Proxy.NO_PROXY;
}
}