/*
Copyright (c) 2003 eInnovation Inc. All rights reserved
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.
*/
package com.openedit.users.filesystem;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.Data;
import com.openedit.users.InvalidPropertyNameException;
import com.openedit.users.PropertyContainer;
import com.openedit.users.UnsupportedPropertyTypeException;
import com.openedit.users.UserManagerException;
/**
* This class represents an object which is backed by an XML file. It implements {@link
* PropertyContainer} as a simple <code>Map</code> which only permits String-valued properties.
*
* @author Matt Avery
*/
public abstract class FileSystemObject implements PropertyContainer, Serializable, Data
{
private transient static Log log = null;
private Log getLog()
{
if( log == null)
{
log = LogFactory.getLog(FileSystemObject.class);
}
return log;
}
protected PropertyContainer fieldPropertyContainer;
//protected Element fieldRootElement;
//protected String fieldFile;
protected Date fieldCreationDate;
public FileSystemObject()
{
}
public PropertyContainer getPropertyContainer()
{
if( fieldPropertyContainer == null)
{
fieldPropertyContainer = new MapPropertyContainer();
}
return fieldPropertyContainer;
}
public void setPropertyContainer(PropertyContainer inData )
{
fieldPropertyContainer = inData;
}
/**
* Get all the properties on this object as a read-only map.
*
* @return A read-only map of all the properties on this object
*/
public Map getProperties()
{
return getPropertyContainer().getProperties();
}
/**
* Get the value of the given property of this object.
*
* @param inPropertyName The property name
*
* @return The property value, or <code>null</code> if the property does not exist on this
* object
*/
public String get( String inPropertyName )
{
return getPropertyContainer().get( inPropertyName );
}
public Date getCreationDate()
{
return fieldCreationDate;
}
protected void setCreationDate(Date inDate)
{
fieldCreationDate = inDate;
}
/**
* Set the given property of this object. Note that depending on the implementation, only
* certain types may be supported for the property value. All implementations must support at
* least String. However, it is recommended that implementations support at least the
* following types:
*
* <ul>
* <li>
* Boolean
* </li>
* <li>
* Double
* </li>
* <li>
* Integer
* </li>
* <li>
* String
* </li>
* <li>
* Object[]
* </li>
* </ul>
*
* Property names must conform to the regular expression <code>[A-Za-z_][A-Za-z0-9_.]</code>.
* In other words, the first character must be an underscore or letter; and each subsequent
* character must be an underscore, period, letter, or digit.
*
* @param inPropertyName The property name
* @param inPropertyValue The property value
*
* @throws InvalidPropertyNameException If the property name was invalid
* @throws UnsupportedPropertyTypeException If the property value was of an unsupported type
* @throws UserManagerException If the property could not be set
*/
public void put( String inPropertyName, Object inPropertyValue )
throws UserManagerException
{
getPropertyContainer().put( inPropertyName, inPropertyValue );
}
/**
* Add all the specified properties to this object. Note that the keys in the given map must
* be strings (property names), and that the values must satisfy the implementation's
* requirements for property values.
*
* @param inProperties The properties to set
*
* @throws UserManagerException If any of the properties could not be set
*
* @see #put(String, Object)
*/
public void putAll( Map inProperties ) throws UserManagerException
{
getPropertyContainer().putAll( inProperties );
}
/**
* Remove the given property from this object. If no such property exists, this method will do
* nothing.
*
* @param inPropertyName The name of the property to remove
*
* @throws UserManagerException If the property exists and could not be removed
*/
public void remove( String inPropertyName ) throws UserManagerException
{
getPropertyContainer().remove( inPropertyName );
}
/**
* Remove the given properties from this object. If no such property exists, this method will do
* nothing.
*
* @param inProperties The names of the properties to remove
*
* @throws UserManagerException If the property exists and could not be removed
*/
public void removeAll( String[] inProperties ) throws UserManagerException
{
getPropertyContainer().removeAll( inProperties );
}
public boolean getBoolean( String inPropertyName )
{
return Boolean.valueOf( getString( inPropertyName ) ).booleanValue();
}
public String getString( String inPropertyName )
{
return (String) get( inPropertyName );
}
public void safePut( String inKey, Object inValue )
{
try
{
if ( inValue == null)
{
getPropertyContainer().remove( inKey );
}
else
{
Object value = inValue;
if ( inValue instanceof String )
{
value = ( (String) inValue ).trim();
}
getPropertyContainer().put( inKey, value );
}
}
catch ( UserManagerException ex)
{
getLog().error( ex );
}
}
public String getSourcePath()
{
// TODO Auto-generated method stub
return null;
}
public void setSourcePath(String inSourcepath)
{
// TODO Auto-generated method stub
}
}