/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy 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. * * Icy 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 Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.preferences; import icy.common.Version; import icy.math.MathUtil; import icy.network.NetworkUtil; import icy.system.SystemUtil; /** * @author Stephane */ public class ApplicationPreferences { /** * id */ private static final String PREF_ID = "icy"; public static final String ID_ICY_ID = "id"; public static final String ID_OS = "os"; public static final String ID_UPDATE_REPOSITORY_BASE = "updateRepositoryBase"; public static final String ID_UPDATE_REPOSITORY_FILE = "updateRepositoryFile"; public static final String ID_MAX_MEMORY = "maxMemory"; public static final String ID_STACK_SIZE = "stackSize"; public static final String ID_EXTRA_VMPARAMS = "extraVMParams"; public static final String ID_OS_EXTRA_VMPARAMS = "osExtraVMParams"; public static final String ID_APP_FOLDER = "appFolder"; public static final String ID_APP_PARAMS = "appParams"; public static final String ID_VERSION = "version"; public static final String ID_SINGLE_INSTANCE = "singleInstance"; private final static String DEFAULT_UPDATE_REPOSITORY_BASE = NetworkUtil.WEBSITE_URL + "update/"; private final static String DEFAULT_UPDATE_REPOSITORY_FILE = "update.php"; /** * preferences */ private static XMLPreferences preferences; public static void load() { // load preference preferences = IcyPreferences.root().node(PREF_ID); // set here settings which need to be initialized setMaxMemoryMB(getMaxMemoryMB()); } /** * @return the preferences */ public static XMLPreferences getPreferences() { return preferences; } public static String getOs() { return preferences.get(ID_OS, ""); } public static void setOs(String value) { preferences.put(ID_OS, value); } public static int getId() { return preferences.getInt(ID_ICY_ID, -1); } public static void setId(int value) { preferences.putInt(ID_ICY_ID, value); } public static String getUpdateRepositoryBase() { return preferences.get(ID_UPDATE_REPOSITORY_BASE, DEFAULT_UPDATE_REPOSITORY_BASE); } public static void setUpdateRepositoryBase(String value) { preferences.put(ID_UPDATE_REPOSITORY_BASE, value); } public static String getUpdateRepositoryFile() { return preferences.get(ID_UPDATE_REPOSITORY_FILE, DEFAULT_UPDATE_REPOSITORY_FILE); } public static void setUpdateRepositoryFile(String value) { preferences.put(ID_UPDATE_REPOSITORY_FILE, value); } static int memoryAlign(int memMB) { // arrange to get multiple of 32 MB return (int) MathUtil.prevMultiple(memMB, 32); } static int checkMem(int memMB) { // check we can allocate that much return Math.min(getMaxMemoryMBLimit(), memoryAlign(memMB)); } /** * Get max memory (in MB) */ public static int getMaxMemoryMB() { int result = preferences.getInt(ID_MAX_MEMORY, -1); // no value ? if (result == -1) result = getDefaultMemoryMB(); // arrange to get multiple of 32 MB return checkMem(result); } public static int getDefaultMemoryMB() { final long freeMemory = SystemUtil.getFreeMemory(); // take system total memory / 2 long calculatedMaxMem = SystemUtil.getTotalMemory() / 2; // current available memory is low ? if (calculatedMaxMem > freeMemory) // adjust max memory calculatedMaxMem -= (calculatedMaxMem - freeMemory) / 2; // get max memory in MB return checkMem((int) (calculatedMaxMem / (1024 * 1024))); } public static int getMaxMemoryMBLimit() { int result = (int) (SystemUtil.getTotalMemory() / (1024 * 1024)); // limit maximum memory to 1024 MB for 32 bits system if (SystemUtil.is32bits() && (result > 1024)) result = 1024; return memoryAlign(result); } /** * Get stack size (in KB) */ public static int getStackSizeKB() { // 2MB by default for VTK return preferences.getInt(ID_STACK_SIZE, 2048); } /** * Get extra JVM parameters string */ public static String getExtraVMParams() { // we want a big permgen space for the class loader return preferences.get(ID_EXTRA_VMPARAMS, "-XX:CompileCommand=exclude,plugins/kernel/importer/LociImporterPlugin.getImage " + "-XX:CompileCommand=exclude,plugins/kernel/importer/LociImporterPlugin.getImageInternal " + "-XX:MaxPermSize=128M"); } /** * Get OS specific extra JVM parameters string */ public static String getOSExtraVMParams() { final String os = SystemUtil.getOSNameId(); // we have different default extra VM parameters depending OS if (os.equals(SystemUtil.SYSTEM_WINDOWS)) return preferences.get(ID_OS_EXTRA_VMPARAMS + SystemUtil.SYSTEM_WINDOWS, ""); if (os.equals(SystemUtil.SYSTEM_MAC_OS)) return preferences.get(ID_OS_EXTRA_VMPARAMS + SystemUtil.SYSTEM_MAC_OS, "-Xdock:name=Icy"); if (os.equals(SystemUtil.SYSTEM_UNIX)) return preferences.get(ID_OS_EXTRA_VMPARAMS + SystemUtil.SYSTEM_UNIX, ""); return ""; } /** * Get Icy application folder */ public static String getAppFolder() { return preferences.get(ID_APP_FOLDER, ""); } /** * Get Icy application parameters string */ public static String getAppParams() { return preferences.get(ID_APP_PARAMS, ""); } /** * Get the stored version number (used to detect new installed version). */ public static Version getVersion() { return new Version(preferences.get(ID_VERSION, "1.0.0.0")); } /** * Set max memory (in MB) */ public static void setMaxMemoryMB(int value) { preferences.putInt(ID_MAX_MEMORY, Math.min(getMaxMemoryMBLimit(), value)); } /** * Set stack size (in KB) */ public static void setStackSizeKB(int value) { preferences.putInt(ID_STACK_SIZE, value); } /** * Set extra JVM parameters string */ public static void setExtraVMParams(String value) { preferences.put(ID_EXTRA_VMPARAMS, value); } /** * Set OS specific extra JVM parameters string */ public static void setOSExtraVMParams(String value) { preferences.put(ID_OS_EXTRA_VMPARAMS + SystemUtil.getOSNameId(), value); } /** * Set Icy application folder */ public static void setAppFolder(String value) { preferences.put(ID_APP_FOLDER, value); } /** * Set ICY application parameters string */ public static void setAppParams(String value) { preferences.put(ID_APP_PARAMS, value); } /** * Set the stored version number (used to detect new installed version) */ public static void setVersion(Version value) { preferences.put(ID_VERSION, value.toString()); } }