/* * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 2009 Sun Microsystems, Inc. */ import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.ldap.LdapContext; import javax.naming.ldap.LdapName; import javax.naming.ldap.InitialLdapContext; import javax.naming.CommunicationException; import java.util.HashSet; import java.util.Iterator; /** * Modify the DN of an entry. * The operation can be a modDN (tree move) or a modRDN. * The function returns the ldap error code */ public class modifyDn { /** * Main. * * @param args arguments */ public static void main(String[] args) { String hostname=null; String ldapPort=null; String principal=null; String credential=null; String dnToModify=null; String newRDN=null; String deleteOldRDN=null; String newSuperior=null; String errorCode=null; String errorMessage=null; Hashtable envLdap = new Hashtable(); LdapContext ctx; LdapName nameToModify; LdapName targetName; String targetDn; for (int k=0; k< args.length; k++) { String opt1 = args[k]; String val1 = args[k+1]; if (opt1.equals("-h")) { hostname = val1; } if (opt1.equals("-p")) { ldapPort = val1; } if (opt1.equals("-D")) { principal = val1; } if (opt1.equals("-w")) { credential = val1; } if (opt1.equals("-d")) { dnToModify = val1; } if (opt1.equals("-e")) { newRDN = val1; } if (opt1.equals("-f")) { deleteOldRDN = val1; } if (opt1.equals("-g")) { newSuperior = val1; } k++; } String provider = "ldap://" + hostname + ":" + ldapPort + "/"; envLdap.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); envLdap.put(Context.SECURITY_AUTHENTICATION, "simple"); envLdap.put(Context.SECURITY_PRINCIPAL, principal); envLdap.put(Context.SECURITY_CREDENTIALS, credential); envLdap.put(Context.PROVIDER_URL, provider); // Whether the old RDN attribute values are to be retained // as attributes of the entry, or deleted from the entry. // Default is 'true' if (deleteOldRDN != null) { envLdap.put("java.naming.ldap.deleteRDN", deleteOldRDN); } try { System.out.println("Modify the entry " + dnToModify); if ( newRDN == null ) { // newRDN = same as old rdn nameToModify = new LdapName(dnToModify); newRDN = (String) nameToModify.remove(nameToModify.size() - 1); } if ( newSuperior != null ) { // modDN operation => new parent = newSuperior targetName = new LdapName(newSuperior); } else { // modRDN operation => new parent = old parent targetName = new LdapName(dnToModify); targetName.remove(targetName.size() - 1); } targetName.add(newRDN); targetDn = targetName.toString(); // connect to server ctx = new InitialLdapContext(envLdap, null); // rename the entry ctx.rename(dnToModify, targetDn); ctx.close(); } catch (CommunicationException e1) { errorMessage = e1.getMessage(); } catch (NamingException e2) { errorMessage = e2.getMessage(); } catch (Exception e3) { errorMessage= e3.getMessage(); } // No error, the modify is success if ( errorMessage == null ) { errorCode="0"; } else { System.out.println(errorMessage); int ind=errorMessage.indexOf("-"); if ( ind > 0 ) { errorCode=errorMessage.substring(18, ind-1); } else errorCode="0"; } int RC = Integer.parseInt(errorCode); System.exit(RC); } }