/*
* Copyright 2008 Lukas Lang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.castor.core.nature;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* Adds property handle methods and a constructor including a health check. See
* constructor comments for more details.
*
* @author Lukas Lang
* @since 1.2.1
*
*/
public abstract class BaseNature implements Nature {
/**
* The PropertyHolder in focus.
*/
private PropertyHolder _holder = null;
/**
* Constructor taking a {@link PropertyHolder}. Must be called from
* subclasses. Does a health check on the given PropertyHolder, whether the
* extending Nature exists.
*
* @param holder
* a PropertyHolder.
*/
protected BaseNature(final PropertyHolder holder) {
if (holder == null) {
throw new NullPointerException("Holder must be set");
}
// Health check
if (holder.hasNature(getId())) {
_holder = holder;
} else {
throw new IllegalStateException(getId()
+ " Nature must be set before");
}
}
/**
* Returns the property mapped to the key or null if not set before.
*
* @param key
* to look up.
* @return value or null if not found.
*/
protected final Object getProperty(final String key) {
return _holder.getProperty(addPrefix(key));
}
/**
* Sets the property for a given. Key must NOT be null, but can be an empty
* String.
*
* @param property
* to set.
* @param key
* to insert.
*/
protected final void setProperty(final String key, final Object property) {
if (key != null) {
_holder.setProperty(addPrefix(key), property);
}
}
/**
* Generates a Key by adding a prefix.
*
* @param key
* to use.
* @return prefix + given key.
*/
private String addPrefix(final String key) {
StringBuffer buf = new StringBuffer();
buf.append(getId());
buf.append(key);
return buf.toString();
}
/**
* Returns boolean value of the property or false if property value is null.
* Make sure, not to request a property, which does not have a boolean
* value!
*
* @param propertyName
* name of the property.
* @return false if null or false.
*/
protected final boolean getBooleanPropertyDefaultFalse(
final String propertyName) {
Boolean b = (Boolean) this.getProperty(propertyName);
if (b == null) {
return false;
}
return b.booleanValue();
}
/**
* Returns the {@link PropertyHolder}.
* @return the holder
*/
protected final PropertyHolder getHolder() {
return _holder;
}
/**
* Returns value of the property as a List. If the property was not set
* before, a new List will be returned. Make sure, not to request a
* property, which is not a List!
*
* @param propertyName
* name of the property.
* @return A List.
*/
protected List getPropertyAsList(String property) {
List list = (List) getProperty(property);
if (list == null) {
list = new LinkedList();
this.setProperty(property, list);
}
return list;
}
/**
* Returns value of the property as a List. If the property was not set
* before, a new List will be returned. Make sure, not to request a
* property, which is not a List!
*
* @param propertyName
* name of the property.
* @return A List.
*/
protected Map getPropertyAsMap(String property) {
Map map = (Map) getProperty(property);
if (map == null) {
map = new HashMap();
this.setProperty(property, map);
}
return map;
}
}