| StatsPropertyReader.java |
/*
* $Id: StatsPropertyReader.java,v 1.15 2012/03/03 10:41:19 agoubard Exp $
*
* See the COPYRIGHT file for redistribution and use restrictions.
*/
package org.xins.common.collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.xins.common.MandatoryArgumentChecker;
/**
* Immutable property reader that remembers which properties have not been
* accessed.
*
* @version $Revision: 1.15 $ $Date: 2012/03/03 10:41:19 $
* @author <a href="mailto:ernst@ernstdehaan.com">Ernst de Haan</a>
*
* @since XINS 1.3.0
*/
@Deprecated
public final class StatsPropertyReader implements PropertyReader {
/**
* Confidential object used to protect <code>ProtectedPropertyReader</code>
* instances from unauthorized changes. Not <code>null</code>.
*/
private static final Object SECRET_KEY = new Object();
/**
* The set of properties to retrieve values from. Never <code>null</code>.
*/
private final Map _properties;
/**
* The set of unused properties. Initially contains all properties. Becomes
* <code>null</code> if there are no more unused properties.
*/
private ProtectedPropertyReader _unused;
/**
* Constructs a new <code>StatsPropertyReader</code> based on the specified
* <code>PropertyReader</code>. The properties in <code>source</code> are
* copied to an internal store.
*
* @param source
* the source property reader, cannot be <code>null</code>.
*
* @throws IllegalArgumentException
* if <code>source == null</code>.
*/
public StatsPropertyReader(PropertyReader source)
throws IllegalArgumentException {
// Check preconditions
MandatoryArgumentChecker.check("source", source);
// Prepare collections for storing the name/value combinations
_properties = new HashMap();
_unused = new ProtectedPropertyReader(SECRET_KEY);
// Copy the property reader to an internal HashMap and to a set of
// unused properties
Iterator names = source.getNames();
while (names.hasNext()) {
String name = (String) names.next();
if (name != null) {
String value = source.get(name);
if (value != null) {
_properties.put(name, value);
_unused.set(SECRET_KEY, name, value);
}
}
}
}
/**
* Gets the value of the property with the specified name.
*
* @param name
* the name of the property, cannot be <code>null</code>.
*
* @return
* the value of the property, or <code>null</code> if it is not set.
*
* @throws IllegalArgumentException
* if <code>name == null</code>.
*/
public String get(String name) throws IllegalArgumentException {
// Check preconditions
MandatoryArgumentChecker.check("name", name);
// Retrieve the value
String value = (String) _properties.get(name);
// If the property is found, then mark it used
if (value != null && _unused != null) {
_unused.remove(SECRET_KEY, name);
// If the size of the ProtectedPropertyReader becomes zero, then
// remove it to save memory
if (_unused.size() < 1) {
_unused = null;
}
}
return value;
}
/**
* Gets an iterator that iterates over all the property names. The
* {@link Iterator} will return only {@link String} instances.
*
* @return
* the {@link Iterator} that will iterate over all the names, never
* <code>null</code>.
*/
public Iterator getNames() {
return _properties.keySet().iterator();
}
/**
* Returns the number of entries.
*
* @return
* the size, always >= 0.
*/
public int size() {
return _properties.size();
}
/**
* Retrieves the set of unused properties.
*
* @return
* a {@link PropertyReader} containing which were not queried, never
* <code>null</code>.
*/
public PropertyReader getUnused() {
if (_unused != null) {
return _unused;
} else {
return PropertyReaderUtils.EMPTY_PROPERTY_READER;
}
}
/**
* Compares this object with the specified argument for equality.
*
* @param obj
* the object to compare with, can be <code>null</code>.
*
* @return
* <code>true</code> if the objects <code>a</code> and <code>b</code>
* are considered to be equal, <code>false</code> if they are considered
* different.
*/
public boolean equals(Object obj) {
return PropertyReaderUtils.equals(this, obj);
}
/**
* Returns a hash code value for this object.
*
* @return
* a hash code value for this object.
*/
public int hashCode() {
return PropertyReaderUtils.hashCode(this);
}
}