at.spardat.xma.mdl.util.TransString Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH .
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* s IT Solutions AT Spardat GmbH - initial API and implementation
*******************************************************************************/
// @(#) $Id: TransString.java 2089 2007-11-28 13:56:13Z s3460 $
package at.spardat.xma.mdl.util;
import java.io.IOException;
import at.spardat.xma.mdl.MemoryEstimator;
import at.spardat.xma.mdl.Synchronization;
import at.spardat.xma.mdl.Transactional;
import at.spardat.xma.serializer.XmaInput;
import at.spardat.xma.serializer.XmaOutput;
/**
* Encapsulates a String and adds Transactional behaviour to it. The value
* of the String may be retrieved using get. Upon default construction,
* an instance contains a null String.
*
* @author YSD, 17.04.2003 22:22:07
*/
public final class TransString implements Transactional, Synchronization, Descriptive {
/**
* Default constructor. The contained value is null.
*/
public TransString () {
}
/**
* Constructs with a provided string. The effect of calling this
* constructor is the same as using the default constructor and
* calling set(s) afterwards. This implies that changed()
* may be true after this constructor finishes.
*
* @param s the String to set
*/
public TransString (String s) {
set (s);
}
/**
* This method sets a new value.
*
* @param s the String to set; may be null
*/
public void set (String s) {
if (equ(s, value_)) return;
if (hasHistory_) {
if (equ(s, saved_)) {
// the saved state equals the one to set now;
// discard the change information
hasHistory_ = false;
saved_ = null;
}
} else {
// no save state
saved_ = value_;
hasHistory_ = true;
}
// anyway, the newly selected is set to the provided key
value_ = s;
}
/**
* Returns the value of this
*
* @return a String that may be null
*/
public String get () {
return value_;
}
// checks if two strings are equal, including the treatment of null Strings.
// two null Strings are considered equal. A null String and a non null String
// are not equal.
private static boolean equ (String s1, String s2) {
if (s1 == null) return s2 == null;
else return s1.equals(s2);
}
/**
* @see at.spardat.xma.mdl.Transactional#changed()
*/
public boolean changed () {
return hasHistory_;
}
/**
* @see at.spardat.xma.mdl.Transactional#rollback()
*/
public void rollback () {
if (hasHistory_) {
value_ = saved_;
hasHistory_ = false;
}
}
/**
* @see at.spardat.xma.mdl.Transactional#commit()
*/
public void commit () {
hasHistory_ = false;
saved_ = null; // release string
}
/**
* @see at.spardat.xma.mdl.Synchronization#externalize(at.spardat.xma.serializer.XmaOutput, boolean)
*/
public void externalize (XmaOutput xo, boolean forceFull) throws IOException {
// write boolean to indicate if the value is null
xo.writeBoolean("isNull", value_ == null);
if (value_ != null) {
xo.writeString("val", value_);
}
}
/**
* @see at.spardat.xma.mdl.Synchronization#internalize(at.spardat.xma.serializer.XmaInput)
*/
public void internalize (XmaInput in) throws IOException, ClassNotFoundException {
boolean isNull = in.readBoolean();
if (isNull) value_ = null;
else {
value_ = in.readString();
}
// discard change information
hasHistory_ = false;
saved_ = null;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals (Object obj) {
if (obj == null || !(obj instanceof TransString)) return false;
return equ (value_, ((TransString)obj).value_);
}
/**
* @see at.spardat.xma.mdl.util.Descriptive#describe(at.spardat.xma.mdl.util.DNode)
*/
public void describe (DNode n) {
n.sb();
n.app("value", value_).comma().app("saved", saved_).comma().app("changed", hasHistory_);
n.eb();
}
/**
* Estimates the number of bytes this object consumes in memory.
*/
public int estimateMemory () {
return MemoryEstimator.sizeOfObject(3) + (value_ == null ? 0 : MemoryEstimator.sizeOf(value_));
}
/**
* The actual value of this. May be null.
*/
private String value_;
/**
* The value at the last syncpoint. May only be accessed if hasHistory is true.
*/
private String saved_;
// Indicates that saved_ contains a saved state.
private boolean hasHistory_ = false;
}