/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.test.security.ldap;
import java.io.File;
import java.net.URL;
import java.util.StringTokenizer;
import org.jboss.logging.Logger;
import org.opends.server.tools.LDAPCompare;
import org.opends.server.tools.LDAPDelete;
import org.opends.server.tools.LDAPModify;
import org.opends.server.tools.LDAPSearch;
/**
* Utility class that deals with the integrated ldap (OpenDS)
* @author <a href="mailto:Anil.Saldhana@jboss.org">Anil Saldhana</a>
* @version $Revision$
* @since Sep 15, 2006
*/
public class OpenDSUtil
{
private static final Logger log = Logger.getLogger(OpenDSUtil.class);
public OpenDSUtil()
{
}
/**
* Add a LDIF file into the Directory Server
* @param serverHost Server Host (Use getServerHost() of JBossTestxxx)
* @param port Port for the DS
* @param admin admin dn ("cn=Directory Manager")
* @param adminpwd (password)
* @param ldifURL (use getDeployURL of JBossTestxxx)
* @return whether the add was success
*/
public boolean addLDIF(String serverHost, String port, String admin,
String adminpwd, URL ldifURL)
{
File ldifFile = new File(ldifURL.getPath());
if(!ldifFile.exists())
throw new IllegalArgumentException("LDIF file:"+ ldifURL + " does not exist");
String[] cmd = new String[] {"-h", serverHost, "-p",
port, "-D", admin,
"-w", adminpwd, "-a", "-f",ldifFile.getPath()};
log.debug("addLDIF:" + print(cmd));
return LDAPModify.mainModify(cmd, false, System.out, System.err) == 0;
}
/**
* Delete a DN in the Directory Server
* @param serverHost Server Host (Use getServerHost() of JBossTestxxx)
* @param port Port for the DS
* @param admin admin dn ("cn=Directory Manager")
* @param adminpwd (password)
* @param dnToDelete DN to delete (Eg: dc=jboss,dc=org)
* @param recursive should children also go?
* @return whether the delete op was success
*/
public boolean deleteDN(String serverHost, String port, String admin,
String adminpwd, String dnToDelete, boolean recursive)
{
System.out.println("Start delete DN");
String rec = recursive ? "-x" : " ";
String[] cmd = new String[] {"-h", serverHost, "-p",
port, "-D", admin,
"-w", adminpwd,
"-V", "3",
rec,
"--noPropertiesFile",
dnToDelete};
log.debug("deleteDN:" + print(cmd));
boolean result = LDAPDelete.mainDelete(cmd, false, System.out, System.err) == 0;
System.out.println("END delete DN");
return result;
}
/**
* Recursively delete a DN
* @param serverHost
* @param port
* @param admin
* @param adminpwd
* @param dnToDelete
* @return
*/
public boolean deleteDNRecursively(String serverHost, String port, String admin,
String adminpwd, String dnToDelete)
{
String[] args =
{
"-h", serverHost,
"-p", port,
"-V", "3",
"-D", admin,
"-w", adminpwd,
"-x",
"--noPropertiesFile",
dnToDelete
};
boolean result = LDAPDelete.mainDelete(args, false, System.out, System.err) == 0;
return result;
}
/**
* Check whether a DN exists. Typically before you do a ldap delete
* @param serverHost
* @param port
* @param dn
* @return whether the DN exists?
*/
public boolean existsDN(String serverHost, String port, String dn)
{
System.out.println("Start Search");
String[] cmd = new String[] {"-h", serverHost, "-p",
port, "-b", dn ,"-s", "sub", "objectclass=*"};
log.debug("existsDN:" + print(cmd));
boolean result = LDAPSearch.mainSearch(cmd) == 0;
System.out.println("End Search");
return result;
}
/**
* Issue a ldapCompare in the standard ldapCompare cmd line syntax
* (Eg: "-h localhost -p 1389 -D "cn=..." -w password -a -f ldif.txt)
* @param cmdline
* @return whether ldapCompare was success
*/
public boolean ldapCompare(String cmdline)
{
String[] strArr = getStringArr(cmdline);
log.debug("ldapCompare:"+print(strArr));
return LDAPCompare.mainCompare(strArr) == 0;
}
/**
* Issue a ldapdelete in the standard ldapdelete cmd line syntax
* (Eg: "-h localhost -p 1389 -D "cn=..." -w password -a -f ldif.txt)
* @param cmdline
* @return whether ldapmodify was success
*/
public boolean ldapDelete(String cmdline)
{
String[] strArr = getStringArr(cmdline);
log.debug("ldapDelete:"+print(strArr));
return LDAPDelete.mainDelete(strArr) == 0;
}
/**
* Issue a ldapmodify in the standard ldapmodify cmd line syntax
* (Eg: "-h localhost -p 1389 -D "cn=..." -w password -a -f ldif.txt)
* @param cmdline
* @return whether ldapmodify was success
*/
public boolean ldapModify(String cmdline)
{
String[] strArr = getStringArr(cmdline);
log.debug("ldapModify:"+print(strArr));
return LDAPModify.mainModify(strArr) == 0;
}
//***************************************************************
// PRIVATE METHODS
//***************************************************************
private String[] getStringArr(String str)
{
StringTokenizer st = new StringTokenizer(str);
int num = st.countTokens();
String[] strarr = new String[num];
int i = 0;
while(st.hasMoreTokens())
{
strarr[i++] = st.nextToken();
}
return strarr;
}
private String print(String[] arr)
{
StringBuilder sb = new StringBuilder();
int len = arr != null ? arr.length : 0;
for(int i=0; i < len; i++)
sb.append(arr[i]).append(" ");
return sb.toString();
}
}