package com.hwlcn.ldap.ldif; import java.util.Arrays; import java.util.List; import com.hwlcn.ldap.asn1.ASN1OctetString; import com.hwlcn.ldap.ldap.sdk.ChangeType; import com.hwlcn.ldap.ldap.sdk.DN; 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.ldap.sdk.ModifyDNRequest; import com.hwlcn.ldap.ldap.sdk.RDN; 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 LDIFModifyDNChangeRecord extends LDIFChangeRecord { private static final long serialVersionUID = -2356367870035948998L; private final boolean deleteOldRDN; private volatile DN parsedNewSuperiorDN; private volatile RDN parsedNewRDN; private final String newRDN; private final String newSuperiorDN; public LDIFModifyDNChangeRecord(final String dn, final String newRDN, final boolean deleteOldRDN, final String newSuperiorDN) { super(dn); ensureNotNull(newRDN); this.newRDN = newRDN; this.deleteOldRDN = deleteOldRDN; this.newSuperiorDN = newSuperiorDN; } public LDIFModifyDNChangeRecord(final ModifyDNRequest modifyDNRequest) { super(modifyDNRequest.getDN()); newRDN = modifyDNRequest.getNewRDN(); deleteOldRDN = modifyDNRequest.deleteOldRDN(); newSuperiorDN = modifyDNRequest.getNewSuperiorDN(); } public String getNewRDN() { return newRDN; } public RDN getParsedNewRDN() throws LDAPException { if (parsedNewRDN == null) { parsedNewRDN = new RDN(newRDN); } return parsedNewRDN; } public boolean deleteOldRDN() { return deleteOldRDN; } public String getNewSuperiorDN() { return newSuperiorDN; } public DN getParsedNewSuperiorDN() throws LDAPException { if ((parsedNewSuperiorDN == null) && (newSuperiorDN != null)) { parsedNewSuperiorDN = new DN(newSuperiorDN); } return parsedNewSuperiorDN; } public DN getNewDN() throws LDAPException { if (newSuperiorDN == null) { final DN parentDN = getParsedDN().getParent(); if (parentDN == null) { return new DN(getParsedNewRDN()); } else { return new DN(getParsedNewRDN(), parentDN); } } else { return new DN(getParsedNewRDN(), getParsedNewSuperiorDN()); } } public ModifyDNRequest toModifyDNRequest() { return new ModifyDNRequest(getDN(), newRDN, deleteOldRDN, newSuperiorDN); } @Override() public ChangeType getChangeType() { return ChangeType.MODIFY_DN; } @Override() public LDAPResult processChange(final LDAPInterface connection) throws LDAPException { return connection.modifyDN(toModifyDNRequest()); } @Override() public String[] toLDIF(final int wrapColumn) { List<String> ldifLines; if (newSuperiorDN == null) { ldifLines = Arrays.asList( LDIFWriter.encodeNameAndValue("dn", new ASN1OctetString(getDN())), "changetype: moddn", LDIFWriter.encodeNameAndValue("newrdn", new ASN1OctetString(newRDN)), "deleteoldrdn: " + (deleteOldRDN ? "1" : "0")); } else { ldifLines = Arrays.asList( LDIFWriter.encodeNameAndValue("dn", new ASN1OctetString(getDN())), "changetype: moddn", LDIFWriter.encodeNameAndValue("newrdn", new ASN1OctetString(newRDN)), "deleteoldrdn: " + (deleteOldRDN ? "1" : "0"), LDIFWriter.encodeNameAndValue("newsuperior", new ASN1OctetString(newSuperiorDN))); } if (wrapColumn > 2) { ldifLines = LDIFWriter.wrapLines(wrapColumn, ldifLines); } final String[] lineArray = new String[ldifLines.size()]; return ldifLines.toArray(lineArray); } @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("moddn"), buffer, wrapColumn); buffer.append(EOL_BYTES); LDIFWriter.encodeNameAndValue("newrdn", new ASN1OctetString(newRDN), buffer, wrapColumn); buffer.append(EOL_BYTES); if (deleteOldRDN) { LDIFWriter.encodeNameAndValue("deleteoldrdn", new ASN1OctetString("1"), buffer, wrapColumn); } else { LDIFWriter.encodeNameAndValue("deleteoldrdn", new ASN1OctetString("0"), buffer, wrapColumn); } buffer.append(EOL_BYTES); if (newSuperiorDN != null) { LDIFWriter.encodeNameAndValue("newsuperior", new ASN1OctetString(newSuperiorDN), 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("moddn"), buffer, wrapColumn); buffer.append(EOL); LDIFWriter.encodeNameAndValue("newrdn", new ASN1OctetString(newRDN), buffer, wrapColumn); buffer.append(EOL); if (deleteOldRDN) { LDIFWriter.encodeNameAndValue("deleteoldrdn", new ASN1OctetString("1"), buffer, wrapColumn); } else { LDIFWriter.encodeNameAndValue("deleteoldrdn", new ASN1OctetString("0"), buffer, wrapColumn); } buffer.append(EOL); if (newSuperiorDN != null) { LDIFWriter.encodeNameAndValue("newsuperior", new ASN1OctetString(newSuperiorDN), buffer, wrapColumn); buffer.append(EOL); } } @Override() public int hashCode() { int hashCode; try { hashCode = getParsedDN().hashCode() + getParsedNewRDN().hashCode(); if (newSuperiorDN != null) { hashCode += getParsedNewSuperiorDN().hashCode(); } } catch (Exception e) { debugException(e); hashCode = toLowerCase(getDN()).hashCode() + toLowerCase(newRDN).hashCode(); if (newSuperiorDN != null) { hashCode += toLowerCase(newSuperiorDN).hashCode(); } } if (deleteOldRDN) { hashCode++; } return hashCode; } @Override() public boolean equals(final Object o) { if (o == null) { return false; } if (o == this) { return true; } if (! (o instanceof LDIFModifyDNChangeRecord)) { return false; } final LDIFModifyDNChangeRecord r = (LDIFModifyDNChangeRecord) o; try { if (! getParsedDN().equals(r.getParsedDN())) { return false; } } catch (Exception e) { debugException(e); if (! toLowerCase(getDN()).equals(toLowerCase(r.getDN()))) { return false; } } try { if (! getParsedNewRDN().equals(r.getParsedNewRDN())) { return false; } } catch (Exception e) { debugException(e); if (! toLowerCase(newRDN).equals(toLowerCase(r.newRDN))) { return false; } } if (newSuperiorDN == null) { if (r.newSuperiorDN != null) { return false; } } else { if (r.newSuperiorDN == null) { return false; } try { if (! getParsedNewSuperiorDN().equals(r.getParsedNewSuperiorDN())) { return false; } } catch (Exception e) { debugException(e); if (! toLowerCase(newSuperiorDN).equals(toLowerCase(r.newSuperiorDN))) { return false; } } } return (deleteOldRDN == r.deleteOldRDN); } @Override() public void toString(final StringBuilder buffer) { buffer.append("LDIFModifyDNChangeRecord(dn='"); buffer.append(getDN()); buffer.append("', newRDN='"); buffer.append(newRDN); buffer.append("', deleteOldRDN="); buffer.append(deleteOldRDN); if (newSuperiorDN != null) { buffer.append(", newSuperiorDN='"); buffer.append(newSuperiorDN); buffer.append('\''); } buffer.append(')'); } }