ef6648a7917a74b386ded70f1d799becd7b74386ugaston/*
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * CDDL HEADER START
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * The contents of this file are subject to the terms of the
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * Common Development and Distribution License, Version 1.0 only
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * (the "License"). You may not use this file except in compliance
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * with the License.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * or http://forgerock.org/license/CDDLv1.0.html.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * See the License for the specific language governing permissions
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * and limitations under the License.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * When distributing Covered Code, include this CDDL HEADER in each
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * file and include the License file at legal-notices/CDDLv1_0.txt.
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * If applicable, add the following below this CDDL HEADER, with the
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * fields enclosed by brackets "[]" replaced with your own identifying
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * information:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * Portions Copyright [yyyy] [name of copyright owner]
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * CDDL HEADER END
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * Copyright 2010 Sun Microsystems, Inc.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston */
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport netscape.ldap.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport netscape.ldap.util.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport java.util.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport java.io.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugastonpublic class ImprovedLDAPConnection extends LDAPConnection {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston public ImprovedLDAPConnection() {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston super();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston public void apply (Change change) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston for (String mychange: change.changes) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston String mytype = null;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // Parse LDIF content
ef6648a7917a74b386ded70f1d799becd7b74386ugaston ByteArrayInputStream stream = new ByteArrayInputStream(mychange.getBytes());
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDIF ldif = null;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston ldif = new LDIF(new DataInputStream(stream));
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDIFContent content = ldif.nextRecord().getContent();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston //EclReadAndPlay.println ("DEBUG", "\n\nWriting the following update: \n" + content.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston switch (content.getType()) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston case LDIFContent.ADD_CONTENT:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston mytype = "ADD";
ef6648a7917a74b386ded70f1d799becd7b74386ugaston content = ( LDIFAddContent ) content;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPAttributeSet attrSet = new LDAPAttributeSet( ((LDIFAddContent)content).getAttributes());
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // remove non-user-modifiable attributes:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // entryuuid, pwdchangedtime, creatorsname, createtimestamp
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPAttribute entryuuidAttr = attrSet.getAttribute("entryuuid");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( entryuuidAttr != null ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston attrSet.remove("entryuuid");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPAttribute pwdchangedAttr = attrSet.getAttribute("pwdChangedTime");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( entryuuidAttr != null ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston attrSet.remove("pwdchangedtime");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPAttribute creatorAttr = attrSet.getAttribute("creatorsname");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( creatorAttr != null ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston attrSet.remove("creatorsname");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPAttribute createtimeAttr = attrSet.getAttribute("createtimestamp");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( createtimeAttr != null ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston attrSet.remove("createtimestamp");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPEntry addEntry = new LDAPEntry ( change.dn, attrSet );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston //EclReadAndPlay.println ("INFO", "********************* Entry: ************** \n" + addEntry + "\n******************\n" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.add( addEntry );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston catch( LDAPException e ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("ERROR", "Cannot add entry \"" + change.dn + "\" (csn="
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + change.csn + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("ERROR", e.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // replace the unique id
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// LDAPAttribute myAttr = new LDAPAttribute ("nsuniqueid", change.nsUniqueId);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// LDAPAttribute myAttr = new LDAPAttribute ("entryuuid", change.nsUniqueId);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// LDAPModification mod = new LDAPModification ( LDAPModification.REPLACE, myAttr );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// this.modify( change.dn, mod );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// catch( LDAPException e ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// EclReadAndPlay.println ("ERROR", "Cannot modify nsuniqueid of entry \""
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// + change.dn + "\" (csn=" + change.csn + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// EclReadAndPlay.println ("ERROR", e.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston// }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston //System.out.EclReadAndPlay.println( addEntry);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston break;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston case LDIFContent.MODIFICATION_CONTENT:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston mytype="MOD";
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPModification[] mods = ((LDIFModifyContent)content).getModifications();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // remove modifiersname and modifytimestamp mods
ef6648a7917a74b386ded70f1d799becd7b74386ugaston boolean[] deleteItem = new boolean[mods.length];
ef6648a7917a74b386ded70f1d799becd7b74386ugaston int size = 0;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston for (int i = 0 ; i < mods.length ; i++) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPAttribute modAttr = mods[i].getAttribute();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( modAttr.getBaseName().equalsIgnoreCase("modifiersname") ||
ef6648a7917a74b386ded70f1d799becd7b74386ugaston modAttr.getBaseName().equalsIgnoreCase("modifytimestamp") ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // remove mods[i] from mods
ef6648a7917a74b386ded70f1d799becd7b74386ugaston deleteItem[i] = true;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston } else {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston deleteItem[i] = false;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston size++;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston LDAPModification[] realMods = new LDAPModification[size];
ef6648a7917a74b386ded70f1d799becd7b74386ugaston int index = 0;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston for (int i = 0 ; i < mods.length ; i++) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( !deleteItem[i] ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston realMods[index++] = mods[i];
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.modify( change.dn, realMods );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston catch( LDAPException e ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("ERROR", "Cannot modify entry \"" + change.dn
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "\" (csn=" + change.csn + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("DEBUG", "mods\"" + mods + "\"" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("ERROR", e.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston break;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston case LDIFContent.MODDN_CONTENT:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( change.newRDN == null ) { // => fixOP MODRDN
ef6648a7917a74b386ded70f1d799becd7b74386ugaston change.newRDN=((LDIFModDNContent)content).getRDN();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston change.deleteOldRDN=((LDIFModDNContent)content).getDeleteOldRDN();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston change.newSuperior=((LDIFModDNContent)content).getNewParent();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if (change.newSuperior == null ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston mytype="MODRDN";
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.rename( change.dn, change.newRDN, change.deleteOldRDN );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston else {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston mytype="MODDN";
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.rename( change.dn, change.newRDN, change.newSuperior, change.deleteOldRDN );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston catch( LDAPException e ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR", "Cannot rename entry \"" + change.dn
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "\" (csn=" + change.csn + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR", "newRDN =\"" + change.newRDN
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "\" (deleteOldRDN=" + change.deleteOldRDN + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR", "change =\"" + mychange + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR", e.toString());
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston break;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston case LDIFContent.DELETE_CONTENT:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston mytype="DEL";
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.delete( change.dn );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston catch( LDAPException e ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println ("ERROR", "Cannot delete entry \"" + change.dn
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "\" (csn=" + change.csn + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR", e.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston break;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston default:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("ERROR", "Cannot parse change (type=" + content.getType()
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "):\n" + mychange + "_");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston mytype="Unknown";
ef6648a7917a74b386ded70f1d799becd7b74386ugaston break;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston } catch ( IOException e ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR" , e.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR" , change.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.accessOut.println(EclReadAndPlay.getDate() + "- INFO: " + mytype + " \"" + change.dn
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "\" (" + change.csn +" / " + change.changeNumber + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston}
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston