package com.hwlcn.ldap.ldif; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import com.hwlcn.ldap.asn1.ASN1OctetString; import com.hwlcn.ldap.ldap.sdk.AddRequest; import com.hwlcn.ldap.ldap.sdk.Attribute; import com.hwlcn.ldap.ldap.sdk.ChangeType; import com.hwlcn.ldap.ldap.sdk.Entry; import com.hwlcn.ldap.ldap.sdk.LDAPException; import com.hwlcn.ldap.ldap.sdk.LDAPInterface; import com.hwlcn.ldap.ldap.sdk.LDAPResult; import com.hwlcn.ldap.util.ByteStringBuffer; import com.hwlcn.core.annotation.NotMutable; import com.hwlcn.core.annotation.ThreadSafety; import com.hwlcn.ldap.util.ThreadSafetyLevel; import static com.hwlcn.ldap.util.Debug.*; import static com.hwlcn.ldap.util.StaticUtils.*; import static com.hwlcn.ldap.util.Validator.*; @NotMutable() @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) public final class LDIFAddChangeRecord extends LDIFChangeRecord { private static final long serialVersionUID = 5717427836786488295L; private final Attribute[] attributes; public LDIFAddChangeRecord(final String dn, final Attribute... attributes) { super(dn); ensureNotNull(attributes); ensureTrue(attributes.length > 0, "LDIFAddChangeRecord.attributes must not be empty."); this.attributes = attributes; } public LDIFAddChangeRecord(final String dn, final List<Attribute> attributes) { super(dn); ensureNotNull(attributes); ensureFalse(attributes.isEmpty(), "LDIFAddChangeRecord.attributes must not be empty."); this.attributes = new Attribute[attributes.size()]; attributes.toArray(this.attributes); } public LDIFAddChangeRecord(final Entry entry) { super(entry.getDN()); final Collection<Attribute> attrs = entry.getAttributes(); attributes = new Attribute[attrs.size()]; final Iterator<Attribute> iterator = attrs.iterator(); for (int i=0; i < attributes.length; i++) { attributes[i] = iterator.next(); } } public LDIFAddChangeRecord(final AddRequest addRequest) { super(addRequest.getDN()); final List<Attribute> attrs = addRequest.getAttributes(); attributes = new Attribute[attrs.size()]; final Iterator<Attribute> iterator = attrs.iterator(); for (int i=0; i < attributes.length; i++) { attributes[i] = iterator.next(); } } public Attribute[] getAttributes() { return attributes; } public Entry getEntryToAdd() { return new Entry(getDN(), attributes); } public AddRequest toAddRequest() { return new AddRequest(getDN(), attributes); } @Override() public ChangeType getChangeType() { return ChangeType.ADD; } @Override() public LDAPResult processChange(final LDAPInterface connection) throws LDAPException { return connection.add(toAddRequest()); } @Override() public String[] toLDIF(final int wrapColumn) { List<String> ldifLines = new ArrayList<String>(2*attributes.length); ldifLines.add(LDIFWriter.encodeNameAndValue("dn", new ASN1OctetString(getDN()))); ldifLines.add("changetype: add"); for (final Attribute a : attributes) { final String name = a.getName(); for (final ASN1OctetString value : a.getRawValues()) { ldifLines.add(LDIFWriter.encodeNameAndValue(name, value)); } } if (wrapColumn > 2) { ldifLines = LDIFWriter.wrapLines(wrapColumn, ldifLines); } final String[] ldifArray = new String[ldifLines.size()]; ldifLines.toArray(ldifArray); return ldifArray; } @Override() public void toLDIF(final ByteStringBuffer buffer, final int wrapColumn) { LDIFWriter.encodeNameAndValue("dn", new ASN1OctetString(getDN()), buffer, wrapColumn); buffer.append(EOL_BYTES); LDIFWriter.encodeNameAndValue("changetype", new ASN1OctetString("add"), buffer, wrapColumn); buffer.append(EOL_BYTES); for (final Attribute a : attributes) { final String name = a.getName(); for (final ASN1OctetString value : a.getRawValues()) { LDIFWriter.encodeNameAndValue(name, value, buffer, wrapColumn); buffer.append(EOL_BYTES); } } } @Override() public void toLDIFString(final StringBuilder buffer, final int wrapColumn) { LDIFWriter.encodeNameAndValue("dn", new ASN1OctetString(getDN()), buffer, wrapColumn); buffer.append(EOL); LDIFWriter.encodeNameAndValue("changetype", new ASN1OctetString("add"), buffer, wrapColumn); buffer.append(EOL); for (final Attribute a : attributes) { final String name = a.getName(); for (final ASN1OctetString value : a.getRawValues()) { LDIFWriter.encodeNameAndValue(name, value, buffer, wrapColumn); buffer.append(EOL); } } } @Override() public int hashCode() { try { int hashCode = getParsedDN().hashCode(); for (final Attribute a : attributes) { hashCode += a.hashCode(); } return hashCode; } catch (Exception e) { debugException(e); return new Entry(getDN(), attributes).hashCode(); } } @Override() public boolean equals(final Object o) { if (o == null) { return false; } if (o == this) { return true; } if (! (o instanceof LDIFAddChangeRecord)) { return false; } final LDIFAddChangeRecord r = (LDIFAddChangeRecord) o; final Entry e1 = new Entry(getDN(), attributes); final Entry e2 = new Entry(r.getDN(), r.attributes); return e1.equals(e2); } @Override() public void toString(final StringBuilder buffer) { buffer.append("LDIFAddChangeRecord(dn='"); buffer.append(getDN()); buffer.append("', attrs={"); for (int i=0; i < attributes.length; i++) { if (i > 0) { buffer.append(", "); } attributes[i].toString(buffer); } buffer.append("})"); } }