BasicAttribute.java [plain text]
package javax.naming.directory;
import java.util.NoSuchElementException;
import java.util.Vector;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.OperationNotSupportedException;
public class BasicAttribute implements Attribute
{
private static final long serialVersionUID = 6743528196119291326L;
protected String attrID;
protected boolean ordered;
protected transient Vector values;
private BasicAttribute ()
{
}
public BasicAttribute (String id)
{
this (id, false);
}
public BasicAttribute (String id, boolean ordered)
{
attrID = id;
this.ordered = ordered;
values = new Vector ();
}
public BasicAttribute (String id, Object value)
{
this (id, value, false);
}
public BasicAttribute (String id, Object value, boolean ordered)
{
attrID = id;
this.ordered = ordered;
values = new Vector ();
values.add (value);
}
public void add (int index, Object val)
{
if (! ordered && contains (val))
throw new IllegalStateException ("value already in attribute");
values.add (index, val);
}
public boolean add (Object val)
{
if (! ordered && contains (val))
throw new IllegalStateException ("value already in attribute");
return values.add (val);
}
public void clear ()
{
values.clear ();
}
public Object clone ()
{
BasicAttribute c = new BasicAttribute ();
c.attrID = attrID;
c.ordered = ordered;
c.values = (Vector) values.clone ();
return c;
}
public boolean contains (Object val)
{
for (int i = 0; i < values.size (); ++i)
{
if (equals (val, values.get (i)))
return true;
}
return false;
}
public boolean equals (Object obj)
{
if (! (obj instanceof BasicAttribute))
return false;
BasicAttribute b = (BasicAttribute) obj;
if (ordered != b.ordered
|| ! attrID.equals (b.attrID)
|| values.size () != b.values.size ())
return false;
for (int i = 0; i < values.size (); ++i)
{
boolean ok = false;
if (ordered)
ok = equals (values.get (i), b.values.get (i));
else
{
for (int j = 0; j < b.values.size (); ++j)
{
if (equals (values.get (i), b.values.get (j)))
{
ok = true;
break;
}
}
}
if (! ok)
return false;
}
return true;
}
public Object get ()
throws NamingException
{
if (values.size () == 0)
throw new NoSuchElementException ("no values");
return get (0);
}
public Object get (int index)
throws NamingException
{
return values.get (index);
}
public NamingEnumeration getAll ()
throws NamingException
{
return new BasicAttributeEnumeration ();
}
public DirContext getAttributeDefinition ()
throws OperationNotSupportedException, NamingException
{
throw new OperationNotSupportedException ();
}
public DirContext getAttributeSyntaxDefinition ()
throws OperationNotSupportedException, NamingException
{
throw new OperationNotSupportedException ();
}
public String getID ()
{
return attrID;
}
public int hashCode ()
{
int val = attrID.hashCode ();
for (int i = 0; i < values.size (); ++i)
{
Object o = values.get (i);
if (o == null)
{
}
else if (o instanceof Object[])
{
Object[] a = (Object[]) o;
for (int j = 0; j < a.length; ++j)
val += a[j].hashCode ();
}
else
val += o.hashCode ();
}
return val;
}
public boolean isOrdered ()
{
return ordered;
}
public Object remove (int index)
{
return values.remove (index);
}
public boolean remove (Object val)
{
for (int i = 0; i < values.size (); ++i)
{
if (equals (val, values.get (i)))
{
values.remove (i);
return true;
}
}
return false;
}
public Object set (int index, Object val)
{
if (! ordered && contains (val))
throw new IllegalStateException ("value already in attribute");
return values.set (index, val);
}
public int size ()
{
return values.size ();
}
public String toString ()
{
String r = attrID;
for (int i = 0; i < values.size (); ++i)
r += ";" + values.get (i).toString ();
return r;
}
private boolean equals (Object one, Object two)
{
if (one == null)
return two == null;
if (one instanceof Object[])
{
if (! (two instanceof Object[]))
return false;
Object[] aone = (Object[]) one;
Object[] atwo = (Object[]) two;
if (aone.length != atwo.length)
return false;
for (int i = 0; i < aone.length; ++i)
{
if (! aone[i].equals (atwo[i]))
return false;
}
return true;
}
return one.equals (two);
}
private class BasicAttributeEnumeration implements NamingEnumeration
{
int where = -1;
public BasicAttributeEnumeration ()
{
}
public void close () throws NamingException
{
}
public boolean hasMore () throws NamingException
{
return hasMoreElements ();
}
public Object next () throws NamingException
{
return nextElement ();
}
public boolean hasMoreElements ()
{
return where < values.size ();
}
public Object nextElement () throws NoSuchElementException
{
if (where + 1 >= values.size ())
throw new NoSuchElementException ("no more elements");
++where;
return values.get (where);
}
}
}