blob: f1b602e8cce99a5aa38e239238741b1baba832d6 [file] [log] [blame]
/*
* Copyright 2015 Open Networking Laboratory
*
* 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.onosproject.cfg;
import com.google.common.base.MoreObjects;
import java.util.Objects;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
/**
* Component configuration property.
*/
public final class ConfigProperty {
private final String name;
private final Type type;
private final String value;
private final String defaultValue;
private final String description;
private final boolean isSet;
/**
* Representation of the type of property value.
*/
public enum Type {
/**
* Indicates the value is a string.
*/
STRING,
/**
* Indicates the value is an integer.
*/
INTEGER,
/**
* Indicates the value is a long.
*/
LONG,
/**
* Indicates the value is a float.
*/
FLOAT,
/**
* Indicates the value is a double.
*/
DOUBLE,
/**
* Indicates the value is a boolean.
*/
BOOLEAN
}
/**
* Creates a new configuration property with its default value.
*
* @param name property name
* @param type value type
* @param defaultValue default value as a string
* @param description property description
* @return newly defined property
*/
public static ConfigProperty defineProperty(String name, Type type,
String defaultValue,
String description) {
return new ConfigProperty(name, type, description, defaultValue, defaultValue, false);
}
/**
* Creates a new configuration property as a copy of an existing one, but
* with a new value.
*
* @param property property to be changed
* @param newValue new value as a string
* @return newly updated property
*/
public static ConfigProperty setProperty(ConfigProperty property, String newValue) {
return new ConfigProperty(property.name, property.type, property.description,
property.defaultValue, newValue, true);
}
/**
* Creates a new configuration property as a copy of an existing one, but
* without a specific value, thus making it take its default value.
*
* @param property property to be reset
* @return newly reset property
*/
public static ConfigProperty resetProperty(ConfigProperty property) {
return new ConfigProperty(property.name, property.type, property.description,
property.defaultValue, property.defaultValue, false);
}
/**
* Creates a new configuration property with its default value.
*
* @param name property name
* @param type value type
* @param defaultValue default value as a string
* @param description property description
* @param value property value
* @param isSet indicates whether the property is set or not
*/
private ConfigProperty(String name, Type type, String description,
String defaultValue, String value, boolean isSet) {
this.name = checkNotNull(name, "Property name cannot be null");
this.type = checkNotNull(type, "Property type cannot be null");
this.description = checkNotNull(description, "Property description cannot be null");
this.defaultValue = defaultValue;
this.value = value;
this.isSet = isSet;
}
/**
* Returns the property name.
*
* @return property name
*/
public String name() {
return name;
}
/**
* Returns the property type.
*
* @return property type
*/
public Type type() {
return type;
}
/**
* Returns the property description.
*
* @return string value
*/
public String description() {
return description;
}
/**
* Returns the property default value as a string.
*
* @return string default value
*/
public String defaultValue() {
return defaultValue;
}
/**
* Returns the property value as a string.
*
* @return string value
*/
public String value() {
return value;
}
/**
* Indicates whether the property is set or whether it assumes its
* default value.
*
* @return true if the property is set
*/
public boolean isSet() {
return isSet;
}
/**
* Returns the property value as a string.
*
* @return string value
*/
public String asString() {
return value;
}
/**
* Returns the property value as an integer.
*
* @return integer value
*/
public int asInteger() {
checkState(type == Type.INTEGER, "Value is not an integer");
return Integer.parseInt(value);
}
/**
* Returns the property value as a long.
*
* @return long value
*/
public long asLong() {
checkState(type == Type.INTEGER || type == Type.LONG, "Value is not a long or integer");
return Long.parseLong(value);
}
/**
* Returns the property value as a float.
*
* @return float value
*/
public float asFloat() {
checkState(type == Type.FLOAT, "Value is not a float");
return Float.parseFloat(value);
}
/**
* Returns the property value as a double.
*
* @return double value
*/
public double asDouble() {
checkState(type == Type.FLOAT || type == Type.DOUBLE, "Value is not a float or double");
return Double.parseDouble(value);
}
/**
* Returns the property value as a boolean.
*
* @return string value
*/
public boolean asBoolean() {
checkState(type == Type.BOOLEAN, "Value is not a boolean");
return Boolean.parseBoolean(value);
}
@Override
public int hashCode() {
return name.hashCode();
}
/**
* {@inheritDoc}
*
* Equality is considered only on the basis of property name.
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof ConfigProperty) {
final ConfigProperty other = (ConfigProperty) obj;
return Objects.equals(this.name, other.name);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("name", name)
.add("type", type)
.add("value", value)
.add("defaultValue", defaultValue)
.add("description", description)
.add("isSet", isSet)
.toString();
}
}