package com.hwlcn.ldap.ldap.sdk.migrate.ldapjdk;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import com.hwlcn.core.annotation.Mutable;
import com.hwlcn.core.annotation.NotExtensible;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
import static com.hwlcn.ldap.util.StaticUtils.*;
@NotExtensible()
@Mutable()
@ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE)
public class LDAPAttributeSet
implements Serializable
{
private static final long serialVersionUID = -4872457565092606186L;
private final ArrayList<LDAPAttribute> attributes;
public LDAPAttributeSet()
{
attributes = new ArrayList<LDAPAttribute>();
}
public LDAPAttributeSet(final LDAPAttribute[] attrs)
{
attributes = new ArrayList<LDAPAttribute>(Arrays.asList(attrs));
}
private LDAPAttributeSet(final ArrayList<LDAPAttribute> attrs)
{
attributes = new ArrayList<LDAPAttribute>(attrs);
}
public Enumeration<LDAPAttribute> getAttributes()
{
return new IterableEnumeration<LDAPAttribute>(attributes);
}
public LDAPAttributeSet getSubset(final String subtype)
{
final ArrayList<LDAPAttribute> subset =
new ArrayList<LDAPAttribute>(attributes.size());
for (final LDAPAttribute a : attributes)
{
if (a.hasSubtype(subtype))
{
subset.add(a);
}
}
return new LDAPAttributeSet(subset);
}
public LDAPAttribute getAttribute(final String attrName)
{
for (final LDAPAttribute a : attributes)
{
if (a.getName().equalsIgnoreCase(attrName))
{
return a;
}
}
return null;
}
public LDAPAttribute getAttribute(final String attrName, final String lang)
{
if (lang == null)
{
return getAttribute(attrName);
}
final String lowerLang = toLowerCase(lang);
for (final LDAPAttribute a : attributes)
{
if (a.getBaseName().equalsIgnoreCase(attrName))
{
final String[] subtypes = a.getSubtypes();
if (subtypes != null)
{
for (final String s : subtypes)
{
final String lowerOption = toLowerCase(s);
if (lowerOption.equals(lowerLang) ||
lowerOption.startsWith(lang + '-'))
{
return a;
}
}
}
}
}
return null;
}
public LDAPAttribute elementAt(final int index)
throws IndexOutOfBoundsException
{
return attributes.get(index);
}
public void add(final LDAPAttribute attr)
{
for (final LDAPAttribute a : attributes)
{
if (attr.getName().equalsIgnoreCase(a.getName()))
{
for (final byte[] value : attr.getByteValueArray())
{
a.addValue(value);
}
return;
}
}
attributes.add(attr);
}
public void remove(final String name)
{
final Iterator<LDAPAttribute> iterator = attributes.iterator();
while (iterator.hasNext())
{
final LDAPAttribute a = iterator.next();
if (name.equalsIgnoreCase(a.getName()))
{
iterator.remove();
return;
}
}
}
public void removeElementAt(final int index)
throws IndexOutOfBoundsException
{
attributes.remove(index);
}
public int size()
{
return attributes.size();
}
public LDAPAttributeSet duplicate()
{
return new LDAPAttributeSet(attributes);
}
@Override()
public String toString()
{
return attributes.toString();
}
}