package org.exolab.castor.persist.spi;
public final class Identity implements java.io.Serializable {
/** <code>serialVersionUID</code>. */
private static final long serialVersionUID = 1L;
private final Object[] _all;
private int _hashCode;
/**
* Creates an instance of this class, based upon the parameter passed in.
*
* @param o Either an {@link Identity} instance, or an Object[] instance.
*/
public Identity(final Object o) {
if (o instanceof Identity) {
Identity identity = (Identity) o;
_all = new Object[identity.size()];
_hashCode = 0;
for (int i = 0; i < identity.size(); i++) {
_all[i] = identity.get(i);
_hashCode += ((_all[i] == null) ? 0 : _all[i].hashCode());
}
} else if (o instanceof Object[]) {
Object[] array = (Object[]) o;
_all = new Object[array.length];
_hashCode = 0;
for (int i = 0; i < array.length; i++) {
_all[i] = array[i];
_hashCode += ((array[i] == null) ? 0 : array[i].hashCode());
}
} else {
_all = new Object[] {o};
_hashCode = o.hashCode();
}
}
public Identity(final Object[] array) {
_all = new Object[array.length];
_hashCode = 0;
for (int i = 0; i < array.length; i++) {
_all[i] = array[i];
_hashCode += ((array[i] == null) ? 0 : array[i].hashCode());
}
}
public Identity(final Object o1, final Object o2) {
_all = new Object[] {o1, o2};
_hashCode = ((o1 == null) ? 0 : o1.hashCode());
_hashCode += ((o2 == null) ? 0 : o2.hashCode());
}
public int size() { return _all.length; }
public Object get(final int i) { return _all[i]; }
public boolean equals(final Object other) {
if (other == null) { return false; }
if (!(other instanceof Identity)) { return false; }
Identity id = (Identity) other;
if (_all.length != id.size()) { return false; }
for (int i = 0; i < _all.length; i++) {
if (_all[i] == null) {
if (id._all[i] != null) { return false; }
} else if (!_all[i].equals(id._all[i])) {
return false;
}
}
return true;
}
public int hashCode() { return _hashCode; }
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("<");
for (int i = 0; i < _all.length; i++) {
if (i != 0) { sb.append(","); }
Object obj = _all[i];
sb.append(obj);
if (obj != null) {
sb.append("(").append(obj.hashCode()).append(")");
} else {
sb.append ("(N/A)");
}
}
sb.append(">");
return sb.toString();
}
}