Java tutorial
/* LanguageTool, a natural language style checker * Copyright (C) 2016 Daniel Naber (http://www.danielnaber.de) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ package org.languagetool.gui; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; /** * Helper class to store configuration * * @author Panagiotis Minos * @since 3.4 */ class LocalStorage { private static final String VENDOR_ID = "languagetool.org"; private static final String APPLICATION_ID = "LanguageTool"; private final File directory; LocalStorage() { String userHome = null; try { userHome = System.getProperty("user.home"); } catch (SecurityException ex) { } if (userHome == null) { directory = null; } else if (SystemUtils.IS_OS_WINDOWS) { File appDataDir = null; try { String appData = System.getenv("APPDATA"); if (!StringUtils.isEmpty(appData)) { appDataDir = new File(appData); } } catch (SecurityException ex) { } if (appDataDir != null && appDataDir.isDirectory()) { String path = VENDOR_ID + "\\" + APPLICATION_ID + "\\"; directory = new File(appDataDir, path); } else { String path = "Application Data\\" + VENDOR_ID + "\\" + APPLICATION_ID + "\\"; directory = new File(userHome, path); } } else if (SystemUtils.IS_OS_LINUX) { File appDataDir = null; try { String xdgConfigHome = System.getenv("XDG_CONFIG_HOME"); if (!StringUtils.isEmpty(xdgConfigHome)) { appDataDir = new File(xdgConfigHome); if (!appDataDir.isAbsolute()) { //https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html //All paths set in these environment variables must be absolute. //If an implementation encounters a relative path in any of these //variables it should consider the path invalid and ignore it. appDataDir = null; } } } catch (SecurityException ex) { } if (appDataDir != null && appDataDir.isDirectory()) { String path = APPLICATION_ID + "/"; directory = new File(appDataDir, path); } else { String path = ".config/" + APPLICATION_ID + "/"; directory = new File(userHome, path); } } else if (SystemUtils.IS_OS_MAC_OSX) { String path = "Library/Application Support/" + APPLICATION_ID + "/"; directory = new File(userHome, path); } else { String path = "." + APPLICATION_ID + "/"; directory = new File(userHome, path); } if (directory != null && !directory.exists()) { directory.mkdirs(); } } void saveProperty(String name, Object obj) { if (directory == null) { return; } synchronized (directory) { try (XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream(new FileOutputStream(new File(directory, name))))) { encoder.writeObject(obj); } catch (FileNotFoundException ex) { Tools.showError(ex); } } } <T> T loadProperty(String name, Class<T> clazz) { if (directory == null) { return null; } synchronized (directory) { try (XMLDecoder decoder = new XMLDecoder( new BufferedInputStream(new FileInputStream(new File(directory, name))))) { try { return clazz.cast(decoder.readObject()); } catch (ClassCastException ex) { Tools.showError(ex); return null; } catch (Exception ex) { //probably user messed up with files Tools.showError(ex); return null; } } catch (FileNotFoundException ex) { //ignore, we have not saved yet a property with this name } } return null; } }