mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Christophe Sovant
10.14.2009 71f1a7bcaf7978f092fbcb7f3135cf55e8573690
Add ldapjdk tools
3 files added
3 files renamed
2 files modified
634 ■■■■ changed files
opends/tests/staf-tests/shared/functions/ldap.xml 133 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/functions/topology.xml 74 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java 130 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java 297 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/java/ldapjdk/ldapjdk.jar patch | view | raw | blame | history
opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java patch | view | raw | blame | history
opends/tests/staf-tests/shared/java/ldapjndi/modifyAnAttribute.java patch | view | raw | blame | history
opends/tests/staf-tests/shared/java/ldapjndi/saslSearchClient.java patch | view | raw | blame | history
opends/tests/staf-tests/shared/functions/ldap.xml
@@ -2821,8 +2821,8 @@
          'command'   : '%s/bin/java' % JAVA_HOME,
          'arguments' : '%s %s' % (STAFCmd,STAFCmdParams),
          'location'  : location,
          'envCmd'    : ['CLASSPATH=%s/../%s/ldap' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldap' % (dsPath,remote.reljavadir),
          'envCmd'    : ['CLASSPATH=%s/../%s/ldapjndi' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldapjndi' % (dsPath,remote.reljavadir),
          'expectedRC': expectedRC,
          'knownIssue': knownIssue
        }
@@ -3071,8 +3071,8 @@
          'command'   : '%s/bin/java' % JAVA_HOME,
          'arguments' : '%s %s' % (STAFCmd,STAFCmdParams),
          'location'  : location,
          'envCmd'    : ['CLASSPATH=%s/../%s/ldap' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldap' % (dsPath,remote.reljavadir),
          'envCmd'    : ['CLASSPATH=%s/../%s/ldapjndi' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldapjndi' % (dsPath,remote.reljavadir),
          'expectedRC': expectedRC,
          'knownIssue': knownIssue
        }
@@ -3083,127 +3083,6 @@
    </sequence>
  </function>
  
  <!-- Modify an attribute -->
  <function name="modifyDn">
    <function-prolog>
      This function rename the rdn
    </function-prolog>
    <function-map-args>
      <function-arg-def name="location" type="optional" default="STAF_REMOTE_HOSTNAME">
        <function-arg-description>
          Location of target host
        </function-arg-description>
        <function-arg-property name="type" value="hostname"/>
      </function-arg-def>
      <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
        <function-arg-description>
          Pathname to installation root
        </function-arg-description>
        <function-arg-property name="type" value="filepath"/>
      </function-arg-def>
      <function-arg-def name="dsInstanceHost" type="optional" default="STAF_REMOTE_HOSTNAME">
        <function-arg-description>
          Directory server hostname or IP address
        </function-arg-description>
        <function-arg-property name="type" value="hostname"/>
      </function-arg-def>
      <function-arg-def name="dsInstancePort" type="required">
        <function-arg-description>
          Directory server port number
        </function-arg-description>
        <function-arg-property name="type" value="Port number"/>
      </function-arg-def>
      <function-arg-def name="dsInstanceDn" type="required">
        <function-arg-description>
          Bind DN
        </function-arg-description>
        <function-arg-property name="type" value="DN"/>
      </function-arg-def>
      <function-arg-def name="dsInstancePswd" type="required">
        <function-arg-description>
          Bind password
        </function-arg-description>
        <function-arg-property name="type" value="string"/>
      </function-arg-def>
      <function-arg-def name="DNToModify" type="required">
        <function-arg-description>
          DN to modify
        </function-arg-description>
        <function-arg-property name="type" value="DN"/>
      </function-arg-def>
      <function-arg-def name="newRDN" type="optional">
        <function-arg-description>
          new rdn name : ie uid=jdoe_bis
        </function-arg-description>
        <function-arg-property name="type" value="string"/>
      </function-arg-def>
      <function-arg-def name="deleteOldRDN" type="optional">
        <function-arg-description>
          1 : delete old rdn, 0 do not delete old rdn, default value is 1
        </function-arg-description>
        <function-arg-property name="type" value="integer"/>
      </function-arg-def>
      <function-arg-def name="expectedRC" type="optional" default="0">
        <function-arg-description>
          Expected return code value. Default value is 0
          Wildcard 'noCheck' to not check the RC
        </function-arg-description>
        <function-arg-property name="type" value="integer"/>
      </function-arg-def>
      <function-arg-def name="knownIssue" type="optional" default="None">
        <function-arg-description>
          Known issue. Corresponds to an issue number.
        </function-arg-description>
        <function-arg-property name="type" value="string" />
      </function-arg-def>
    </function-map-args>
    <sequence>
      <!-- Local variables -->
      <script>
        mylocation=location
        #Build the Command
        STAFCmdParamsList=[]
        STAFCmdParams=''
        STAFCmd=''
      </script>
      <!-- Set common ldap arguments -->
      <call function="'_ldapCommonArgs'" />
      <script>
        if DNToModify:
          STAFCmdParamsList.append('-d "%s"' % DNToModify)
        if newRDN:
          STAFCmdParamsList.append('-e "%s"' % newRDN)
        if deleteOldRDN:
          STAFCmdParamsList.append('-f "%s"' % deleteOldRDN)
        STAFCmdParams=' '.join(STAFCmdParamsList)
        STAFCmd='modifyDn'
      </script>
      <call function="'runCommand'" >
        { 'name'      : 'Modify DN',
          'command'   : '%s/bin/java' % JAVA_HOME,
          'arguments' : '%s %s' % (STAFCmd,STAFCmdParams),
          'location'  : location,
          'envCmd'    : ['CLASSPATH=%s/../%s/ldap' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldap' % (dsPath,remote.reljavadir),
          'expectedRC': expectedRC,
          'knownIssue': knownIssue
        }
      </call>
      <return>
        STAXResult
      </return>
    </sequence>
  </function>
  <!-- Modify an attribute -->
  <function name="saslSearch">
    <function-prolog>
@@ -3406,8 +3285,8 @@
          'command'   : '%s/bin/java' % JAVA_HOME,
          'arguments' : '%s %s' % (STAFCmd,STAFCmdParams),
          'location'  : location,
          'envCmd'    : ['CLASSPATH=%s/../%s/ldap' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldap' % (dsPath,remote.reljavadir),
          'envCmd'    : ['CLASSPATH=%s/../%s/ldapjndi' % (dsPath,remote.reljavadir)],
          'path'      : '%s/../%s/ldapjndi' % (dsPath,remote.reljavadir),
          'expectedRC': expectedRC,
          'knownIssue': knownIssue
        }
opends/tests/staf-tests/shared/functions/topology.xml
@@ -298,10 +298,10 @@
            }
          </call>          
          
          <!-- Archive (ldap/.java) files -->
          <!-- Archive (ldapjndi/.java) files -->
          <script>
            javaSharedDir='%s/ldap' % source.java
            javaLocalDir ='%s/ldap' % local.java
            javaSharedDir='%s/ldapjndi' % source.java
            javaLocalDir ='%s/ldapjndi' % local.java
          </script>
          <message>
            'Copy java files locally from %s to %s.' % \
@@ -316,7 +316,7 @@
            }
          </call>
          
          <!---   Check if ldap java files are already compiled -->
          <!---   Check if ldapjndi java files are already compiled -->
          <call function="'listFolderByExtension'" >
            { 
            'location'   : STAXServiceMachine,
@@ -326,7 +326,7 @@
          </call>
          <if expr="len(STAXResult) == 0">
            <sequence>
              <!---   Compile ldap java files on controler host -->
              <!---   Compile ldapjndi java files on controler host -->
              <message>
                'Compile Java files under %s on %s' \
                % (javaLocalDir, STAXServiceMachine)
@@ -339,7 +339,69 @@
              </call>
            </sequence>
          </if>
          <!-- Archive (ldapjdk/.java) files -->
          <script>
            javaSharedDir='%s/ldapjdk' % source.java
            javaLocalDir ='%s/ldapjdk' % local.java
          </script>
          <message>
            'Copy java files locally from %s to %s.' % \
              (javaSharedDir,javaLocalDir)
          </message>
          <call function="'CopyFolderByExtension'">
            {
            'location'   : STAXServiceMachine,
            'srcfolder'  : javaSharedDir,
            'destfolder' : javaLocalDir,
            'extension'  : 'java'
            }
          </call>
          <call function="'CopyFolderByExtension'">
            {
            'location'   : STAXServiceMachine,
            'srcfolder'  : javaSharedDir,
            'destfolder' : javaLocalDir,
            'extension'  : 'jar'
            }
          </call>
          <!---   Check if ldapjdk java files are already compiled -->
          <call function="'listFolderByExtension'" >
            {
            'location'   : STAXServiceMachine,
            'foldername' : javaLocalDir,
            'extension'  : 'class'
            }
          </call>
          <if expr="len(STAXResult) == 0">
            <sequence>
              <!---   Compile ldapjdk java files on controller host -->
              <message>
                'Compile Java files under %s on %s' \
                % (javaLocalDir, STAXServiceMachine)
              </message>
              <script>
                if is_windows_platform(STAXServiceMachine):
                  separator=';'
                  jstaf_jarfile='%s\\bin\\JSTAF.jar' % LOCAL_STAF_ROOT
                else:
                  separator=':'
                  jstaf_jarfile='%s/lib/JSTAF.jar' % LOCAL_STAF_ROOT
                ldapjdk_jarfile='%s/ldapjdk.jar' % javaLocalDir
              </script>
              <call function="'compileJava'" >
                {
                'location'   : STAXServiceMachine,
                'foldername' : '%s' % javaLocalDir,
                'classpath'  : '%s%s%s' \
                               % (ldapjdk_jarfile,separator,jstaf_jarfile)
                }
              </call>
            </sequence>
          </if>
           <!-- Archive (.security) files -->
          <message>
            'Copy security data files locally from %s to %s.' % \
opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java
New file
@@ -0,0 +1,130 @@
/*
 * 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 netscape.ldap.util.GetOpt;
public class PSearch {
    public static void main(String[] args) {
        String usage = "Usage: psearch -h <hostname> -p <port> -b <suffix>" + "[-D bindDN] [-w bindPW]" + "-f <fileURL+file name>" + "-l <y>" + "-n <number of thread>" + " -o <add,modify,delete,moddn>";
        String hostname = "localhost";
        int portnumber = 1389; //LDAPv3.DEFAULT_PORT;
        int nbThreads = 1;//number of thread by default
        // Check for these options. -H means to print out a usage message.
        GetOpt options = new GetOpt("h:p:b:D:w:H:f:n:o:l", args);
        // Get the arguments specified for each option.
        String host = options.getOptionParam('h');
        // host
        if (options.hasOption('h')) {
            if (host == null) {
                // usage
                System.out.println(usage);
                System.exit(1);
            } else {
                hostname = host;
            }
        }
        String port = options.getOptionParam('p');
        // If a port number was specified, convert the port value
        // to an integer.
        if (port != null) {
            try {
                portnumber = java.lang.Integer.parseInt(port);
            } catch (java.lang.Exception e) {
                System.out.println("Invalid port number: " + port);
                System.out.println(usage);
                System.exit(1);
            }
        }
        //number of thread
        String nbT = options.getOptionParam('n');
        if (nbT != null) {
            try {
                nbThreads = java.lang.Integer.parseInt(nbT);
            } catch (java.lang.Exception e) {
                System.out.println("Invalid Thread number: " + nbT);
                System.out.println(usage);
                System.exit(1);
            }
        }
        // PSearch suffix
        String suffix = options.getOptionParam('b');
        String bindDN = options.getOptionParam('D');
        String bindPW = options.getOptionParam('w');
        //operations all by default
        String operation = PSearchOperations.ALL;
        if (options.hasOption('o')) {
            String opParam = options.getOptionParam('o');
            if (opParam.equals("add")) {
                operation = PSearchOperations.ADD;
            } else if (opParam.equals("modify")) {
                operation = PSearchOperations.MODIFY;
            } else if (opParam.equals("delete")) {
                operation = PSearchOperations.DELETE;
            } else if (opParam.equals("moddn")) {
                operation = PSearchOperations.MODDN;
            }else if (opParam.equals("all")) {
                operation = PSearchOperations.ALL;;
            } else {
                System.out.println("Invalid operation type: " + opParam);
                System.out.println(usage);
                System.exit(1);
            }
        }
        // to disable the log files
        boolean useFile = false;
        String fileName = "logLile";
        if (options.hasOption('f')) {
            useFile = options.hasOption('f');
            fileName = options.getOptionParam('f');
        }
        // to enable system out logs
        boolean output = options.hasOption('l');
        System.out.println("Connecting to " + hostname + ":" + portnumber +
                " as \"" + bindDN + "\"" +
                " on suffix \"" + suffix + "\"" +
                " on operation \"" + operation + "\"" +
                " use file: \"" + useFile + "\" output: \"" + output + "\"");
        //start all thread
        for (int i = 0; i < nbThreads; i++) {
            PSearchOperations ps = new PSearchOperations(i, hostname, portnumber, bindDN, bindPW, suffix);
            if (useFile) {
                ps.useLogFile(useFile);
                ps.setLogFile(fileName);
            }
            ps.setOutput(output);
            ps.setOperation(operation);
            ps.start();
        }
    }
}
opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java
New file
@@ -0,0 +1,297 @@
/*
 * 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.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Enumeration;
import netscape.ldap.LDAPAttribute;
import netscape.ldap.LDAPAttributeSet;
import netscape.ldap.LDAPConnection;
import netscape.ldap.LDAPEntry;
import netscape.ldap.LDAPException;
import netscape.ldap.LDAPSearchConstraints;
import netscape.ldap.LDAPSearchResults;
import netscape.ldap.LDAPv3;
import netscape.ldap.controls.LDAPPersistSearchControl;
public class PSearchOperations extends Thread {
    public static final String ADD = "ADD";
    public static final String MODIFY = "MODIFY";
    public static final String DELETE = "DELETE";
    public static final String MODDN = "MODDN";
    public static final String ALL = "ALL";
    private LDAPConnection connection;
    private String hostname;
    private int portnumber;
    private String bindDN;
    private String bindPW;
    private String suffix;
    private int threadId;
    private String fileName;
    private boolean output;
    private boolean logFile;
    private String operation;
    /**
     * constructor
     * @param id
     * @param hostname
     * @param portnumber
     * @param bindDN
     * @param bindPW
     * @param suffix
     */
    public PSearchOperations(int id, String hostname, int portnumber, String bindDN, String bindPW, String suffix) {
        this.hostname = hostname;
        this.portnumber = portnumber;
        this.bindDN = bindDN;
        this.bindPW = bindPW;
        this.suffix = suffix;
        this.threadId = id;
        this.output = false;
        this.logFile = false;
        //by default all operation
        this.operation = ALL;
    }
    /**
     * to use systeme.out
     * @param output boolean
     */
    public void setOutput(boolean output) {
        this.output = output;
    }
    /**
     * to use the log file
     * @param logFile boolean
     */
    public void useLogFile(boolean logFile) {
        this.logFile = logFile;
    }
    /**
     * to define the log file and URI
     * @param file String
     */
    public void setLogFile(String file) {
        //if there one thread the thread id are not add in the file name
        this.fileName = file;
        //in multy thread for each thread the thread id are add in the file name
        if (threadId!=0) {
            String ext = file.substring(file.lastIndexOf("."), file.length());
            this.fileName = file.substring(0, file.lastIndexOf(".")) + threadId + ext;
        }
        //delete old log file if logFile is present and enable
        File fileToDelete = new File(fileName);
        if (fileToDelete.isFile() && logFile) {
            fileToDelete.delete();
        }
    }
    /**
     * to define the PSearch operation
     * @param operation String
     */
    public void setOperation(String operation) {
        this.operation = operation;
    }
    /**
     *Connect to server.
     */
    private void connect() {
        try {
            connection = new LDAPConnection();
            connection.connect(3, hostname, portnumber, "", "");
            connection.authenticate(3, bindDN, bindPW);
            write("[Thread id: " + threadId + "] \n" + getDate() + connection);
        } catch (LDAPException ex) {
            System.out.println("[Thread id: " + threadId + "]Connection :" + ex.getMessage());
            System.exit(0);
        }
    }
    /**
     * to instanciate new LDAPPersistSearchControl
     * @return LDAPPersistSearchControl
     */
    private LDAPPersistSearchControl PSearchControl() {
        int op = 0;
        if (operation.equals(ALL)) {
            op = LDAPPersistSearchControl.ADD |
                    LDAPPersistSearchControl.MODIFY |
                    LDAPPersistSearchControl.DELETE |
                    LDAPPersistSearchControl.MODDN;
        } else if (operation.equals(ADD)) {
            op = LDAPPersistSearchControl.ADD;
        } else if (operation.equals(MODIFY)) {
            op = LDAPPersistSearchControl.MODIFY;
        } else if (operation.equals(DELETE)) {
            op = LDAPPersistSearchControl.DELETE;
        } else if (operation.equals(MODDN)) {
            op = LDAPPersistSearchControl.MODDN;
        }
        boolean changesOnly = true;
        boolean returnControls = true;
        boolean isCritical = true;
        LDAPPersistSearchControl persistCtrl =
                new LDAPPersistSearchControl(
                op,
                changesOnly,
                returnControls,
                isCritical);
        return persistCtrl;
    }
    /**
     * LDAP Search
     * @return LDAPSearchResults
     */
    public LDAPSearchResults LDAPSearch() {
        LDAPSearchResults res = null;
        try {
            LDAPPersistSearchControl persistCtrl = PSearchControl();
            LDAPSearchConstraints cons = connection.getSearchConstraints();
            cons.setBatchSize(1);
            cons.setServerControls(persistCtrl);
            // Start the persistent search.
            res = connection.search(suffix, LDAPv3.SCOPE_SUB, "(objectclass=*)", null, false, cons);
        } catch (LDAPException ex) {
            System.out.println("[Thread id: " + threadId + "]LDAPSearch :" + ex.getMessage());
            System.exit(0);
        }
        return res;
    }
    /**
     * return the date and time
     * @return String
     */
    public static String getDate() {
        // Initialize the today's date string
        String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT);
        Calendar c1 = Calendar.getInstance(); // today
        return ("[" + sdf.format(c1.getTime()) + "]");
    }
    /**
     *
     * @param b byte off control operation
     * @return
     */
    public String controlName(byte b) {
        String control;
        switch (b) {
            case LDAPPersistSearchControl.ADD:
                control = "ADD";
                break;
            case LDAPPersistSearchControl.DELETE:
                control = "DELETE";
                break;
            case LDAPPersistSearchControl.MODDN:
                control = "MODDN";
                break;
            case LDAPPersistSearchControl.MODIFY:
                control = "MODIFY";
                break;
            default:
                control = String.valueOf(b);
                break;
        }
        return control;
    }
    /**
     * to write on the log file or to use syteme out
     * @param msg String
     */
    public void write(String msg) {
        if (output) {
            System.out.println(msg);
        }
        if (logFile) {
            FileWriter aWriter = null;
            try {
                aWriter = new FileWriter(fileName, true);
                aWriter.write(msg + "\n");
                aWriter.flush();
                aWriter.close();
            } catch (IOException ex) {
                System.out.println("[Thread id: " + threadId + "]Write :" + ex.getMessage());
            } finally {
                try {
                    aWriter.close();
                } catch (IOException ex) {
                    System.out.println("[Thread id: " + threadId + "]Write :" + ex.getMessage());
                }
            }
        }
    }
    /**
     * run thread methode
     */
    public void run() {
        connect();
        LDAPSearchResults result = LDAPSearch();
        while (result.hasMoreElements() && connection.isConnected()) {
            byte[] arr = result.getResponseControls()[0].getValue();
            LDAPEntry entry = (LDAPEntry) result.nextElement();
            LDAPAttributeSet attrSet = entry.getAttributeSet();
            Enumeration attrs = attrSet.getAttributes();
            if (entry.getDN().contains("break")) {
                String message = "\n[Thread id: " + threadId + "] " + getDate() + " [BREAK]";
                write(message);
                System.exit(0);
            } else if (entry.getDN().contains("stop")) {
                try {
                    connection.disconnect();
                    String message = "\n[Thread id: " + threadId + "] " + getDate() + "[STOP]";
                    write(message);
                    System.exit(0);
                } catch (LDAPException ex) {
                    System.out.println("[Thread id: " + threadId + "]run :" + ex.getLDAPErrorMessage());
                }
            }
            String message = "[Thread id: " + threadId + "] " + getDate() + " [" + controlName(arr[4]) + "]";
            write("\n" + message);
            String dn = "dn: " + entry.getDN();
            write(dn);
            while (attrs.hasMoreElements()) {
                LDAPAttribute attr = (LDAPAttribute) attrs.nextElement();
                String name = attr.getName();
                Enumeration values = attr.getStringValues();
                while (values.hasMoreElements()) {
                    String attribute = name + ": " + values.nextElement();
                    write(attribute);
                }
            }
        }
        if (!connection.isConnected()) {
            String message = "\n[Thread id: " + threadId + "] " + getDate() + "[CONNECTION CLOSE]";
            write(message);
        }
    }
}
opends/tests/staf-tests/shared/java/ldapjdk/ldapjdk.jar
Binary files differ
opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java
opends/tests/staf-tests/shared/java/ldapjndi/modifyAnAttribute.java
opends/tests/staf-tests/shared/java/ldapjndi/saslSearchClient.java