package org.safehaus.penrose.ldap;
import org.safehaus.penrose.util.BinaryUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Arrays;
import java.io.Serializable;
/**
* @author Endi S. Dewata
*/
public class Attribute implements Serializable, Cloneable {
public final static long serialVersionUID = 1L;
protected String name;
protected Collection<Object> values = new LinkedHashSet<Object>();
public Attribute(String name) {
this.name = name;
}
public Attribute(String name, Object value) {
this.name = name;
this.values.add(value);
}
public Attribute(String name, Collection<Object> values) {
this.name = name;
if (values == null) return;
for (Object value : values) {
if (!containsValue(value)) this.values.add(value);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object getValue() {
if (values.isEmpty()) return null;
return values.iterator().next();
}
public Collection<Object> getValues() {
return values;
}
public void setValue(Object value) {
values.clear();
if (value == null) return;
values.add(value);
}
public void addValue(Object value) {
if (value == null || containsValue(value)) return;
values.add(value);
}
public boolean containsValue(Object value) {
return getValue(value) != null;
}
public Object getValue(Object value) {
//Logger log = LoggerFactory.getLoggerConfig(getClass());
if (value == null) return null;
//log.debug("Searching for ["+value+"] "+value.getClass().getName());
if (values.contains(value)) {
//log.debug("Found ["+value+"] "+value.getClass().getName());
return value;
}
for (Object v : values) {
//log.debug("Comparing with ["+v+"] "+v.getClass().getName());
if (v instanceof byte[]) {
byte[] b = (byte[])v;
if (value instanceof byte[]) {
byte[] bytes = (byte[])value;
if (Arrays.equals(b, bytes)) {
//log.debug("Found ["+v+"] "+v.getClass().getName());
return v;
}
} else if (value instanceof String) {
byte[] bytes = ((String)value).getBytes();
if (Arrays.equals(b, bytes)) {
//log.debug("Found ["+v+"] "+v.getClass().getName());
return v;
}
}
} else if (v instanceof String) {
String s = (String)v;
if (value instanceof String) {
String string = (String)value;
if (s.equalsIgnoreCase(string)) {
//log.debug("Found ["+v+"] "+v.getClass().getName());
return v;
}
} else if (value instanceof byte[]) {
byte[] b = ((String)v).getBytes();
byte[] bytes = (byte[])value;
if (Arrays.equals(b, bytes)) {
//log.debug("Found ["+v+"] "+v.getClass().getName());
return v;
}
}
} else if (v.equals(value)) {
//log.debug("Found ["+v+"] "+v.getClass().getName());
return v;
}
}
//log.debug("Not found ["+value+"] "+value.getClass().getName());
return null;
}
public void removeValue(Object value) {
if (value == null) return;
Object v = getValue(value);
if (v == null) return;
values.remove(v);
}
public void addValues(Collection<Object> values) {
if (values == null) return;
for (Object value : values) {
Object v = getValue(value);
if (v == null) this.values.add(value);
}
}
public void setValues(Collection<Object> values) {
if (this.values == values) return;
this.values.clear();
if (values == null) return;
for (Object value : values) {
Object v = getValue(value);
if (v == null) this.values.add(value);
}
}
public void removeValues(Collection<Object> values) {
if (values == null) return;
for (Object value : values) {
Object v = getValue(value);
if (v != null) {
this.values.remove(v);
}
}
}
public void clear() {
values.clear();
}
public boolean isEmpty() {
return values.isEmpty();
}
public int getSize() {
return values.size();
}
public Object clone() throws CloneNotSupportedException {
Attribute attribute = (Attribute)super.clone();
attribute.name = name;
attribute.values = new LinkedHashSet<Object>();
attribute.values.addAll(values);
return attribute;
}
public String toString() {
StringBuilder sb = new StringBuilder();
for (Object value : values) {
sb.append(name);
sb.append(":");
if (value instanceof byte[]) {
sb.append(":");
value = BinaryUtil.encode(BinaryUtil.BIG_INTEGER, (byte[]) value);
}
sb.append(" ");
sb.append(value);
sb.append("\n");
}
return sb.toString();
}
public void print() throws Exception {
Logger log = LoggerFactory.getLogger(getClass());
boolean debug = log.isDebugEnabled();
for (Object value : values) {
String className = value.getClass().getName();
className = className.substring(className.lastIndexOf(".") + 1);
if (value instanceof byte[]) {
value = BinaryUtil.encode(BinaryUtil.BIG_INTEGER, (byte[]) value, 0, 10)+"...";
}
if (debug) log.debug(" - " + name + ": " + value + " (" + className + ")");
}
if (isEmpty()) {
if (debug) log.debug(" - " + name);
}
}
}