package com.plexobject.rbac.domain;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* This class is used to represent Tuple of values. This class is immutable and
* non-thread safe
*
*
*/
public class Tuple {
final Object[] objects;
public Tuple(Object... objects) {
if (null == objects) {
throw new NullPointerException("no objects");
}
this.objects = objects;
}
public int size() {
return objects.length;
}
@SuppressWarnings("unchecked")
public <T> T get(int i) {
return (T) objects[i];
}
@SuppressWarnings("unchecked")
public <T> T first() {
return (T) get(0);
}
@SuppressWarnings("unchecked")
public <T> T second() {
return (T) get(1);
}
@SuppressWarnings("unchecked")
public <T> T third() {
return (T) get(2);
}
@SuppressWarnings("unchecked")
public <T> T last() {
return (T) get(objects.length - 1);
}
/**
* @see java.lang.Object#equals(Object)
*/
@Override
public boolean equals(Object object) {
if (!(object instanceof Tuple)) {
return false;
}
Tuple rhs = (Tuple) object;
if (objects.length != rhs.objects.length) {
return false;
}
EqualsBuilder eqBuilder = new EqualsBuilder();
for (int i = 0; i < objects.length; i++) {
eqBuilder.append(objects[i], rhs.objects[i]);
}
return eqBuilder.isEquals();
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
HashCodeBuilder hashBuilder = new HashCodeBuilder(786529047, 1924536713);
for (int i = 0; i < objects.length; i++) {
hashBuilder.append(objects[i]);
}
return hashBuilder.toHashCode();
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
ToStringBuilder strBuilder = new ToStringBuilder(this);
for (int i = 0; i < objects.length; i++) {
strBuilder.append(objects[i]);
}
return strBuilder.toString();
}
}