// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.core.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; /** * Allows Properties objects to be loaded and stored to file. */ public class PropertiesPersister { private AtomicFileCreator atomicFileCreator; /** * Creates a new instance. * * @param propertiesFile * The location of the file containing the persisted data. */ public PropertiesPersister(File propertiesFile) { atomicFileCreator = new AtomicFileCreator(propertiesFile); } /** * Loads the properties from the file. * * @return The properties. */ public Properties load() { try (FileInputStream fileInputStream = new FileInputStream(atomicFileCreator.getFile())) { Reader reader; Properties properties; reader = new InputStreamReader(new BufferedInputStream(fileInputStream), Charset.forName("UTF-8")); properties = new Properties(); properties.load(reader); return properties; } catch (IOException e) { throw new OsmosisRuntimeException("Unable to read the properties from file " + atomicFileCreator.getFile() + ".", e); } } /** * Load the properties from a file as a strongly typed Map. * * @return The properties. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public Map<String, String> loadMap() { return new HashMap<String, String>((Map) load()); } /** * Stores the properties to the file overwriting any existing file contents. * * @param properties * The properties. */ public void store(Properties properties) { try (FileOutputStream fileOutputStream = new FileOutputStream(atomicFileCreator.getTmpFile())) { Writer writer; writer = new OutputStreamWriter(new BufferedOutputStream(fileOutputStream)); properties.store(writer, null); writer.close(); } catch (IOException e) { throw new OsmosisRuntimeException( "Unable to write the properties to temporary file " + atomicFileCreator.getTmpFile() + ".", e); } atomicFileCreator.renameTmpFileToCurrent(); } /** * Stores the properties to the file overwriting any existing file contents. * * @param propertiesMap * The properties. */ public void store(Map<String, String> propertiesMap) { Properties properties = new Properties(); properties.putAll(propertiesMap); store(properties); } /** * Checks if the properties file exists. * * @return True if a file exists, false otherwise. */ public boolean exists() { return atomicFileCreator.exists(); } }