/*
* | $Id$
* |*-------------------------------------------------------------------------*|
* | Copyright (C) 2009 Virginia Tech | | This file is part of CloudSpace. | |
* CloudSpace 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. | | CloudSpace 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 CloudSpace; if not, see
* .
*/
//package cloudspace.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
//import org.apache.log4j.Logger;
// -------------------------------------------------------------------------
/**
* A subclass of the java.util.Properties class that must be initialized from a
* file on disk, and which always keeps the in-memory property set in sync with
* the contents on disk.
*
* @author Tony Allevato
* @author Last changed by $Author$
* @version $Revision$, $Date$
*/
public class ImmediateProperties extends Properties
{
// ~ Constructors ..........................................................
// ----------------------------------------------------------
/**
* Initializes a new instance of ImmediateProperties by loading them from
* the specified file.
*
* @param file
* the path to the file that backs this Properties instance.
*/
public ImmediateProperties( File file )
{
super();
this.backingFile = file;
FileInputStream stream = null;
try
{
stream = new FileInputStream( backingFile );
load( stream );
}
catch ( FileNotFoundException e )
{
// Do nothing; start the property set empty if the file did not
// exist.
}
catch ( IOException e )
{
// log.error( "An I/O exception occurred when loading the properties "
// + "file at " + backingFile, e );
}
finally
{
try
{
if ( stream != null )
{
stream.close();
}
}
catch ( IOException e )
{
// log.error( "An I/O exception occurred when trying to close the "
// + "stream",
// e );
}
}
}
// ~ Methods ...............................................................
// ----------------------------------------------------------
/**
* Removes the specified property from the file.
*
* @param key
* the name of the property to remove
* @return the previous value of the property
*/
@Override
public Object remove( Object key )
{
Object previousValue = super.remove( key );
writeToFile();
return previousValue;
}
// ----------------------------------------------------------
/**
* Sets the value of the specified property.
*
* @param key
* the name of the property to set
* @param value
* the value of the property
* @return the previous value of the property
*/
@Override
public Object put( Object key, Object value )
{
Object previousValue = super.put( key, value );
writeToFile();
return previousValue;
}
// ----------------------------------------------------------
/**
* Saves the current properties set to their associated file.
*/
private void writeToFile()
{
FileOutputStream stream = null;
try
{
stream = new FileOutputStream( backingFile );
store( stream, null );
}
catch ( IOException e )
{
// log.error( "An I/O exception occurred when saving the properties",
// e );
}
finally
{
try
{
if ( stream != null )
{
stream.close();
}
}
catch ( IOException e )
{
// log.error( "An I/O exception occurred when closing the stream",
// e );
}
}
}
// ~ Instance/static variables .............................................
/** The path to the file that backs this Properties instance. */
private File backingFile;
private static final long serialVersionUID = -6139105936918525923L;
// private static final Logger log = Logger.getLogger( ImmediateProperties.class );
}