/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2010 Sun Microsystems, Inc.
*/
import netscape.ldap.*;
import netscape.ldap.util.*;
import java.util.ArrayList;
class Change {
int changeNumber = 0;
String changelogCookie = null;
CSN csn;
String type = "";
String dn = "";
ArrayList<String> changes = new ArrayList<String>(2);
String change = "";
String replicaIdentifier = null;
String changeNumberValue = null;
String nsUniqueId = "";
boolean deleteOldRDN = false;
String newRDN = null;
String newSuperior = null;
public Change(LDAPEntry entry) throws Exception {
LDAPAttribute attr = entry.getAttribute("replicaIdentifier");
if ( attr == null ) {
throw new Exception("No value found for replicaIdentifier");
}
replicaIdentifier = attr.getStringValueArray()[0];
attr = entry.getAttribute("changeNumber");
if ( attr == null ) {
throw new Exception("No value found for changeNumber");
}
changeNumberValue = attr.getStringValueArray()[0];
changeNumber = Integer.parseInt(changeNumberValue);
attr = entry.getAttribute("changelogCookie");
if ( attr != null ) {
changelogCookie = attr.getStringValueArray()[0];
}
attr = entry.getAttribute("replicationCSN");
if ( attr == null ) {
throw new Exception("No value found for replicationCSN");
}
csn = new CSN(attr.getStringValueArray()[0]);
attr = entry.getAttribute("targetDN");
if ( attr == null ) {
throw new Exception("No value found for targetDN");
}
dn = attr.getStringValueArray()[0];
attr = entry.getAttribute("changeType");
if ( attr == null ) {
throw new Exception("No value found for changeType");
}
type = attr.getStringValueArray()[0];
// attr = entry.getAttribute("targetUniqueId");
// if ( attr == null ) {
// throw new Exception("No value found for targetUniqueId");
// }
// nsUniqueId=attr.getStringValueArray()[0];
attr = entry.getAttribute("targetEntryUUID");
if ( attr == null ) {
throw new Exception("No value found for targetEntryUUID");
}
nsUniqueId = attr.getStringValueArray()[0];
// modrdn
if ( type.equals("modrdn") ) {
attr = entry.getAttribute("deleteOldRDN");
if ( attr == null ) {
throw new Exception("No value found for deleteOldRDN");
}
deleteOldRDN = Boolean.getBoolean(attr.getStringValueArray()[0]);
attr = entry.getAttribute("newRDN");
if ( attr == null ) {
throw new Exception("No value found for newRDN");
}
newRDN = attr.getStringValueArray()[0];
attr = entry.getAttribute("newSuperior");
if ( attr != null ) {
newSuperior=attr.getStringValueArray()[0];
}
}
// Conflict
attr = entry.getAttribute("changeHasReplFixupOp");
if ( attr != null ) {
change = attr.getStringValueArray()[0];
if ( change.trim().endsWith("-") ) {
change = change.substring(0, change.length()-3) + "\r\n";
}
String changeHasReplFixupOp=change.replaceFirst("targetDn", "dn") + "\r\n";
// println ("INFO", "FixupOp (csn="+ csn+"):\n" + changeHasReplFixupOp);
changes.add(changeHasReplFixupOp);
}
attr = entry.getAttribute("changes");
if ( attr != null ) {
change = attr.getStringValueArray()[0];
if ( change.trim().endsWith("-") ) {
change = change.substring(0, change.length()-3) + "\r\n";
}
}
if ( type.equals("modify") && ( change.equals("") ) ) {
throw new Exception("Attribute changes is empty - replicationCSN="+ csn);
//EclReadAndPlay.accessOut.println (getDate() + "- WARNING: Ignore change csn=" + csn );
}
String myChange = "dn: " + dn + "\n" +
"changetype: " + type + "\n" +
change +"\n";
changes.add(myChange);
changes.trimToSize();
}
public String toString() {
return ("change number " + changeNumber + " (csn="+csn +")");
}
}