/*
* Copyright 2004-2009 the original author or authors.
*
* 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.compass.core.util.config;
import org.compass.core.config.ConfigurationException;
/**
* This is an abstract <code>Configuration</code> implementation that deals
* with methods that can be abstracted away from underlying implementations.
*/
public abstract class AbstractConfigurationHelper implements ConfigurationHelper {
/**
* Returns the prefix of the namespace. This is only used as a serialization
* hint, therefore is not part of the client API. It should be included in
* all Configuration implementations though.
*
* @return A non-null String (defaults to "")
* @throws ConfigurationException
* if no prefix was defined (prefix is <code>null</code>.
*/
protected abstract String getPrefix() throws ConfigurationException;
/**
* Returns the value of the configuration element as an <code>int</code>.
* Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
* numbers begin with 0b, all other values are assumed to be decimal.
*/
public int getValueAsInteger() throws ConfigurationException {
final String value = getValue().trim();
try {
if (value.startsWith("0x")) {
return Integer.parseInt(value.substring(2), 16);
} else if (value.startsWith("0o")) {
return Integer.parseInt(value.substring(2), 8);
} else if (value.startsWith("0b")) {
return Integer.parseInt(value.substring(2), 2);
} else {
return Integer.parseInt(value);
}
} catch (final Exception nfe) {
final String message = "Cannot parse the value \"" + value
+ "\" as an integer in the configuration element \"" + getName() + "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the configuration element as an <code>int</code>.
* Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
* numbers begin with 0b, all other values are assumed to be decimal.
*/
public int getValueAsInteger(final int defaultValue) {
try {
return getValueAsInteger();
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the configuration element as a <code>long</code>.
* Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
* numbers begin with 0b, all other values are assumed to be decimal.
*/
public long getValueAsLong() throws ConfigurationException {
final String value = getValue().trim();
try {
if (value.startsWith("0x")) {
return Long.parseLong(value.substring(2), 16);
} else if (value.startsWith("0o")) {
return Long.parseLong(value.substring(2), 8);
} else if (value.startsWith("0b")) {
return Long.parseLong(value.substring(2), 2);
} else {
return Long.parseLong(value);
}
} catch (final Exception nfe) {
final String message = "Cannot parse the value \"" + value + "\" as a long in the configuration element \""
+ getName() + "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the configuration element as a <code>long</code>.
* Hexadecimal numbers begin with 0x, Octal numbers begin with 0o and binary
* numbers begin with 0b, all other values are assumed to be decimal.
*/
public long getValueAsLong(final long defaultValue) {
try {
return getValueAsLong();
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the configuration element as a <code>float</code>.
*/
public float getValueAsFloat() throws ConfigurationException {
final String value = getValue().trim();
try {
return Float.parseFloat(value);
} catch (final Exception nfe) {
final String message = "Cannot parse the value \"" + value
+ "\" as a float in the configuration element \"" + getName() + "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the configuration element as a <code>float</code>.
*/
public float getValueAsFloat(final float defaultValue) {
try {
return getValueAsFloat();
} catch (final ConfigurationException ce) {
return (defaultValue);
}
}
/**
* Returns the value of the configuration element as a <code>boolean</code>.
*/
public boolean getValueAsBoolean() throws ConfigurationException {
final String value = getValue().trim();
if (isTrue(value)) {
return true;
} else if (isFalse(value)) {
return false;
} else {
final String message = "Cannot parse the value \"" + value
+ "\" as a boolean in the configuration element \"" + getName() + "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the configuration element as a <code>boolean</code>.
*/
public boolean getValueAsBoolean(final boolean defaultValue) {
try {
return getValueAsBoolean();
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the configuration element as a <code>String</code>.
*/
public String getValue(final String defaultValue) {
try {
return getValue();
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the attribute specified by its name as an
* <code>int</code>. Hexadecimal numbers begin with 0x, Octal numbers
* begin with 0o and binary numbers begin with 0b, all other values are
* assumed to be decimal.
*/
public int getAttributeAsInteger(final String name) throws ConfigurationException {
final String value = getAttribute(name).trim();
try {
if (value.startsWith("0x")) {
return Integer.parseInt(value.substring(2), 16);
} else if (value.startsWith("0o")) {
return Integer.parseInt(value.substring(2), 8);
} else if (value.startsWith("0b")) {
return Integer.parseInt(value.substring(2), 2);
} else {
return Integer.parseInt(value);
}
} catch (final Exception nfe) {
final String message = "Cannot parse the value \"" + value + "\" as an integer in the attribute \"" + name
+ "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the attribute specified by its name as an
* <code>int</code>. Hexadecimal numbers begin with 0x, Octal numbers
* begin with 0o and binary numbers begin with 0b, all other values are
* assumed to be decimal.
*/
public int getAttributeAsInteger(final String name, final int defaultValue) {
try {
return getAttributeAsInteger(name);
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the attribute specified by its name as a
* <code>long</code>. Hexadecimal numbers begin with 0x, Octal numbers
* begin with 0o and binary numbers begin with 0b, all other values are
* assumed to be decimal.
*/
public long getAttributeAsLong(final String name) throws ConfigurationException {
final String value = getAttribute(name);
try {
if (value.startsWith("0x")) {
return Long.parseLong(value.substring(2), 16);
} else if (value.startsWith("0o")) {
return Long.parseLong(value.substring(2), 8);
} else if (value.startsWith("0b")) {
return Long.parseLong(value.substring(2), 2);
} else {
return Long.parseLong(value);
}
} catch (final Exception nfe) {
final String message = "Cannot parse the value \"" + value + "\" as a long in the attribute \"" + name
+ "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the attribute specified by its name as a
* <code>long</code>. Hexadecimal numbers begin with 0x, Octal numbers
* begin with 0o and binary numbers begin with 0b, all other values are
* assumed to be decimal.
*/
public long getAttributeAsLong(final String name, final long defaultValue) {
try {
return getAttributeAsLong(name);
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the attribute specified by its name as a
* <code>float</code>.
*/
public float getAttributeAsFloat(final String name) throws ConfigurationException {
final String value = getAttribute(name);
try {
return Float.parseFloat(value);
} catch (final Exception e) {
final String message = "Cannot parse the value \"" + value + "\" as a float in the attribute \"" + name
+ "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
/**
* Returns the value of the attribute specified by its name as a
* <code>float</code>.
*/
public float getAttributeAsFloat(final String name, final float defaultValue) {
try {
return getAttributeAsFloat(name);
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the attribute specified by its name as a
* <code>boolean</code>.
*/
public boolean getAttributeAsBoolean(final String name) throws ConfigurationException {
final String value = getAttribute(name);
if (isTrue(value)) {
return true;
} else if (isFalse(value)) {
return false;
} else {
final String message = "Cannot parse the value \"" + value + "\" as a boolean in the attribute \"" + name
+ "\" at " + getLocation();
throw new ConfigurationException(message);
}
}
private boolean isTrue(final String value) {
return value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("on")
|| value.equalsIgnoreCase("1");
}
private boolean isFalse(final String value) {
return value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no") || value.equalsIgnoreCase("off")
|| value.equalsIgnoreCase("0");
}
/**
* Returns the value of the attribute specified by its name as a
* <code>boolean</code>.
*/
public boolean getAttributeAsBoolean(final String name, final boolean defaultValue) {
try {
return getAttributeAsBoolean(name);
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Returns the value of the attribute specified by its name as a
* <code>String</code>.
*/
public String getAttribute(final String name, final String defaultValue) {
try {
return getAttribute(name);
} catch (final ConfigurationException ce) {
return defaultValue;
}
}
/**
* Return the first <code>Configuration</code> object child of this
* associated with the given name. If no such child exists, a new one will
* be created.
*/
public ConfigurationHelper getChild(final String name) {
return getChild(name, true);
}
/**
* Return the first <code>Configuration</code> object child of this
* associated with the given name.
*/
public ConfigurationHelper getChild(final String name, final boolean createNew) {
final ConfigurationHelper[] children = getChildren(name);
if (children.length > 0) {
return children[0];
} else {
if (createNew) {
return new PlainConfigurationHelper(name, "-");
} else {
return null;
}
}
}
/**
* The toString() operation is used for debugging information. It does not
* create a deep reproduction of this configuration and all child
* configurations, instead it displays the name, value, and location.
*
* @return getName() + "::" + getValue() + ":@" + getLocation();
*/
public String toString() {
return getName() + "::" + getValue("<no value>") + ":@" + getLocation();
}
}