/** * Copyright (C) 2009 Future Invent Informationsmanagement GmbH. 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 3 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. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ package org.fuin.utils4j; /** * A key value pair that maintains an additional change state. The state * contains the information if the value has been changed since construction of * the instance. The methods hashCode() and * equals(Object) are based on the key attribute. The * attributes key and initialValue are immutable. */ public class Property implements Comparable { private final String key; private final String initialValue; private String value; /** * Constructor with all values. * * @param key * Unique name - Cannot be null. * @param initialValue * Initial value. * @param value * Value. */ public Property(final String key, final String initialValue, final String value) { super(); Utils4J.checkNotNull("key", key); this.key = key; this.initialValue = initialValue; this.value = value; } /** * Returns the current value of the property. * * @return Actual value. */ public final String getValue() { return value; } /** * Sets the current value of the property. * * @param value * Value to set. */ public final void setValue(final String value) { this.value = value; } /** * Returns the initial value of the property. * * @return Value at construction time. */ public final String getInitialValue() { return initialValue; } /** * Returns the key of the property. * * @return Unique name. */ public final String getKey() { return key; } /** * Returns if the value has changed since construction. * * @return If the value has changed true else * false. */ public final boolean hasChanged() { if (initialValue == null) { // New values signal a change (if non-null) return (value != null); } return !initialValue.equals(value); } /** * Returns if the value has been deleted since construction. * * @return If the value has been set to null true * else false. */ public final boolean isDeleted() { if (initialValue == null) { return false; } return (value == null); } /** * Returns if the value has been created since construction. * * @return If the property has been set to a non-null value * true else false. */ public final boolean isNew() { if (initialValue != null) { return false; } return (value != null); } /** * {@inheritDoc} */ public final int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((key == null) ? 0 : key.hashCode()); return result; } /** * {@inheritDoc} */ public final boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Property other = (Property) obj; if (key == null) { if (other.key != null) { return false; } } else if (!key.equals(other.key)) { return false; } return true; } /** * {@inheritDoc} */ public final int compareTo(final Object o) { final Property other = (Property) o; return key.compareTo(other.key); } /** * Returns the key and value separated by an equal sign. * * @return A text like "key=value". */ public final String toKeyValue() { return key + "=" + value; } /** * Returns a 3-code status text. * * @return "NEW" (new), "DEL" (deleted), "CHG" (changed) or "---" * (unchanged). */ public final String getStatus() { if (isNew()) { return "NEW"; } if (isDeleted()) { return "DEL"; } if (hasChanged()) { return "CHG"; } return "---"; } /** * {@inheritDoc} */ public final String toString() { return "[" + getStatus() + "] " + key + "=" + value; } }