package org.jboss.cache;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
public class Fqn implements Cloneable, Externalizable {
static final long serialVersionUID = -5351930616956603651L;
private List elements=new ArrayList(5);
public Fqn() {
}
public Fqn(Object name) {
add(name);
}
public Fqn(List names) {
for(Iterator it=names.iterator(); it.hasNext();) {
Object name=it.next();
add(name);
}
}
public Fqn(Object[] names) {
if(names != null)
for(int i=0; i < names.length; i++)
add(names[i]);
}
public Fqn(Fqn base, Object relative_name) {
elements.addAll(base.elements);
elements.add(relative_name);
}
public Fqn(Fqn base, Fqn relative) {
elements.addAll(base.elements);
elements.addAll(relative.elements);
}
public static Fqn fromString(String fqn) {
Fqn retval=new Fqn();
retval.addFqn(fqn);
return retval;
}
private void add(Object relative_name) {
elements.add(relative_name);
}
public Fqn getFqnChild(int index) {
List list=elements.subList(0, index);
return new Fqn(list.toArray());
}
public void addFqn(String fqn) {
String child_name;
StringTokenizer tok;
if(fqn == null) return;
tok=new StringTokenizer(fqn, TreeCache.SEPARATOR);
while(tok.hasMoreTokens()) {
child_name=tok.nextToken();
add(child_name);
}
}
public Fqn add(List names) {
if(names != null)
elements.addAll(names);
return this;
}
public int size() {
return elements.size();
}
public Object get(int index) {
return elements.get(index);
}
public Object clone() {
return new Fqn(elements);
}
public boolean equals(Object obj) {
Fqn other;
Object o1, o2;
int len;
if(obj == null)
return false;
other=(Fqn)obj; if(other.size() != (len=size()))
return false;
for(int i=0; i < len; i++) {
o1=elements.get(i);
o2=other.get(i);
if(o1 == null && o2 != null) {
return false;
}
if(o1 != null && !o1.equals(o2)) {
return false;
}
}
return true;
}
public int hashCode() {
int hash_code=0;
Object o;
for(Iterator it=elements.iterator(); it.hasNext();) {
o=it.next();
hash_code+=o == null ? 0 : o.hashCode();
}
return hash_code;
}
public String toString() {
StringBuffer sb=new StringBuffer();
for(Iterator it=elements.iterator(); it.hasNext();) {
sb.append(TreeCache.SEPARATOR).append(it.next());
}
return sb.length() == 0 ? TreeCache.SEPARATOR : sb.toString();
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(elements);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
elements=(List)in.readObject();
}
public boolean isChildOf(Fqn parentFqn) {
List parentList=parentFqn.elements;
if( parentList.size() >= elements.size() ) return false;
for(int i=0; i < parentList.size(); i++) {
if(!parentList.get(i).equals(elements.get(i))) return false;
}
return true;
}
}