From 549cae644bb7ac1301d34dd51cff45c245aedf0d Mon Sep 17 00:00:00 2001
From: andrug <andrug@localhost>
Date: Mon, 23 Jun 2008 16:04:30 +0000
Subject: [PATCH] QA: System Test: Split clients to have preamble,run,postamble

---
 opendj-sdk/opends/tests/system-tests/phases/parser/parser.py                                                 |    7 
 opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPreamble.xml  |  173 +++
 opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPreamble.xml           |  174 +++
 opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPreamble.xml                               |  164 +++
 opendj-sdk/opends/tests/system-tests/scenario/4MMR/4MMR.xml                                                  |    6 
 opendj-sdk/opends/tests/system-tests/phases/scheduler/scheduler.xml                                          |  550 +++++++---
 opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPostamble.xml          |  123 ++
 opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoad.xml          |  178 ---
 opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPreamble.xml                               |  169 +++
 opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPostamble.xml                              |  113 ++
 opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPostamble.xml                              |  114 ++
 opendj-sdk/opends/tests/system-tests/phases/configuration/configuration_opends.xml                           |   12 
 opendj-sdk/opends/tests/system-tests/phases/installation/installation_opends.xml                             |    2 
 opendj-sdk/opends/tests/system-tests/phases/shared/functions/opendsadm.xml                                   |   32 
 opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoad.xml                   |  180 ---
 opendj-sdk/opends/tests/system-tests/phases/main_run_lib.xml                                                 |   17 
 opendj-sdk/opends/tests/system-tests/phases/verdict/verdict.xml                                              |    2 
 opendj-sdk/opends/tests/system-tests/clients/restartDs/restartDs.xml                                         |    1 
 opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadLib.xml       |  110 ++
 opendj-sdk/opends/tests/system-tests/scenario/4MMR/conf.xml                                                  |   61 
 opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPostamble.xml |  120 ++
 opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoad.xml                                       |  187 ---
 opendj-sdk/opends/tests/system-tests/clients/verdictOpends/verdictOpends.xml                                 |    1 
 opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoad.xml                                       |  181 ---
 opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadLib.xml                |  113 ++
 opendj-sdk/opends/tests/system-tests/phases/parser/object_lib.xml                                            |   55 +
 opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadLib.xml                                    |  109 ++
 opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadLib.xml                                    |  109 ++
 opendj-sdk/opends/tests/system-tests/phases/log/log.xml                                                      |   18 
 29 files changed, 2,215 insertions(+), 866 deletions(-)

diff --git a/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoad.xml b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoad.xml
index 2bee92f..5402700 100755
--- a/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoad.xml
+++ b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoad.xml
@@ -35,7 +35,6 @@
   <!-- always define all the parameters below                       -->
   <function name="modifyLoad" scope="local">
     <function-map-args>
-      <function-arg-def name="workingDir" type="required"/>
       <function-arg-def name="client"     type="required"/>
       <function-arg-def name="instances"  type="required"/>
       <function-arg-def name="duration"   type="required"/>
@@ -55,70 +54,20 @@
         msg = ''
       </script>
       
-      <!-- ==================    Preamble   =================== -->
+      <!-- ==================    Parser     =================== -->
       <!-- parse the client parameters :                        -->
       <!-- params is [[param1,val1],[param2,val2],...]          -->
       <!-- get the ldap instance parameters                     -->
-      
-      <script>
-        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
-        
-        #
-        # Extract client parameters from client.getParams()
-        #
-        cParams = client.getParams()
-        try:
-          serverInstanceFromClient = cParams[0][1]
-        except IndexError:
-          serverInstanceFromClient = NOT_DEFINED
-          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
-        try:
-          baseDn = cParams[1][1]
-        except IndexError:
-          baseDn = NOT_DEFINED
-          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
-        try:
-          nbCnx = cParams[2][1]
-        except IndexError:
-          nbCnx = NOT_DEFINED
-          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
-        try:
-          nbMaxModify = cParams[3][1]
-        except IndexError:
-          nbMaxModify = NOT_DEFINED
-          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
-        try:
-          attributeName = cParams[4][1]
-        except IndexError:
-          attributeName = NOT_DEFINED
-        
-        #
-        # setup parms to run the client
-        #
-        if serverInstanceFromClient != NOT_DEFINED:
-          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
-          from scheduler import getInstance
-          serverInstance = getInstance(serverInstanceFromClient,instances)
-          if (serverInstance == 'ERROR'):
-            msg = '%s\nERROR: cant find client instance named' % msg
-            msg = '%s %s in server instance list' % \
-                  (msg,serverInstanceFromClient)
-            
-          else:
-            # remove sec, try to finish before timer kill -9 the client
-            duration = duration - 20
-            
-            parms=[]
-            parms.append('-h %s -p %s' % \
-                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
-            parms.append('-b "%s"' % baseDn)
-            parms.append('-D "%s" -w "%s"' % \
-                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
-            parms.append('-t %s -M %s -d %s' % (nbCnx,nbMaxModify,duration))
-            if attributeName != NOT_DEFINED:
-              parms.append('-a %s' % attributeName)
-            parms = ' '.join(parms)
-      </script>
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
       
       <if expr="msg.find('ERROR') != -1">
         <sequence>
@@ -138,78 +87,6 @@
         </sequence>
       <else>
         <sequence>
-        
-          <!-- ==== Add execute permission to build.ksh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'chmod',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Add execute permission to build.ksh file',
-           'fileFd'  : fileFd}
-          </call>
-          
-          
-          <process name="'%s: chmod +x build.ksh' % client.getHost()">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'chmod +x build.ksh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
-          <!-- ==== Build client : run build.ksh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'build',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Build client',
-           'fileFd'  : fileFd}
-          </call>
-          
-          <!-- Build Client in unique directory (compilDir), avoid          -->
-          <!-- conflict if same client is run several time at the same time -->
-          <process name="'%s: build %s' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'./build.ksh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir]</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <if expr="RC != 0">
-            <message>
-              'FAILED to build client %s on %s' % \
-              (client.getName(),client.getHost())
-            </message>
-          </if>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
           <!-- ========== Run the client ========== -->
           <call function="'writeStartTagOperation'">
           { 'tagName' : 'run',
@@ -223,8 +100,9 @@
           </call>
           
           <script>
-            cParam = '-client -Xmx1G -Xms1G'
-            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '-client'
+            # cParam = '%s -Xmx1G -Xms1G' % cParam
+            # cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
             cParam = '%s -cp %s/clients/LDAPjdk/ldapjdk.jar' \
                       % (cParam,LOCAL_TESTS_DIR)
             cParam = '%s:%s/modify.jar' % (cParam,compilDir)
@@ -234,11 +112,17 @@
                         (client.getHost(),client.getName(),
                          serverInstance.getName())
           </script>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'cmd : cd %s ; %s/bin/java %s' % \
+                        (client.getPath(),JAVA_HOME,cParam)
+          }
+          </call>
           <process name="'%s' % titleName">
             <location>client.getHost()</location>
             <command>'%s/bin/java' % JAVA_HOME</command>
             <parms>cParam </parms>
-            <workdir>workingDir</workdir>
+            <workdir>client.getPath()</workdir>
             <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
             <stderr mode="'stdout'"/>
             <stdout>outFile</stdout>
@@ -256,34 +140,12 @@
           </script>
           <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
           
-          
-          <!-- ========== Postamble ========== -->
           <call function="'writeMessage'">
           {'content' : 'Output file %s' % outFile,
            'xlink'   : outFile,
            'fileFd'  : fileFd}
           </call>
           
-          
-          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">
-              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
-            </command>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <script>
-            summary = STAXResult[0][1]
-          </script>
-          <call function="'writeMessage'">
-          {'content' : 'Summary %s' % (summary),
-           'fileFd'  : fileFd}
-          </call>
-          
-          
         </sequence>
       </else>
       </if>
@@ -295,6 +157,5 @@
   </function>
   
   
-  
 </stax>
 
diff --git a/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadLib.xml b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadLib.xml
new file mode 100755
index 0000000..a259999
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadLib.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="modifyLoadParser"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client Parser -->
+  <!-- This function must NOT have scope=local has its variables may -->
+  <!-- be used by the caller -->
+  <function name="modifyLoadParser">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <script>
+        compilDir = '%s/%s_%s' % \
+                    (client.getPath(),client.getHost(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxModify = cParams[3][1]
+        except IndexError:
+          nbMaxModify = NOT_DEFINED
+          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 20
+            
+            parms=[]
+            parms.append('-h %s -p %s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+            parms.append('-b "%s"' % baseDn)
+            parms.append('-D "%s" -w "%s"' % \
+                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
+            parms.append('-t %s -M %s -d %s' % (nbCnx,nbMaxModify,duration))
+            if attributeName != NOT_DEFINED:
+              parms.append('-a %s' % attributeName)
+            parms = ' '.join(parms)
+      </script>
+    </sequence>
+  </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPostamble.xml b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPostamble.xml
new file mode 100755
index 0000000..ba30dcf
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPostamble.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  
+  <defaultcall function="modifyLoadPostamble"/>
+  
+  <!-- ************************************************************ -->
+  <!-- Client postamble is automatically called by the scheduler    -->
+  <!-- and must always define all the parameters below              -->
+  <function name="modifyLoadPostamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPreamble.xml b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPreamble.xml
new file mode 100755
index 0000000..aada930
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/clients/modifyLoad/modifyLoadPreamble.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  
+  <defaultcall function="modifyLoadPreamble"/>
+  
+  
+  <!-- ************************************************************ -->
+  <!-- Client preamble is automatically called by the scheduler     -->
+  <!-- and must always define all the parameters below              -->
+  <function name="modifyLoadPreamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+        
+          <!-- ==== Add execute permission to build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.ksh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s: chmod +x build.ksh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.ksh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ==== Build client : run build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Build client',
+           'fileFd'  : fileFd}
+          </call>
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.ksh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+  </function>
+
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/clients/restartDs/restartDs.xml b/opendj-sdk/opends/tests/system-tests/clients/restartDs/restartDs.xml
index 09eb93a..381eb23 100755
--- a/opendj-sdk/opends/tests/system-tests/clients/restartDs/restartDs.xml
+++ b/opendj-sdk/opends/tests/system-tests/clients/restartDs/restartDs.xml
@@ -35,7 +35,6 @@
   <!-- always define all the parameters below                       -->
   <function name="restartDs" scope="local">
     <function-map-args>
-      <function-arg-def name="workingDir" type="required"/>
       <function-arg-def name="client"     type="required"/>
       <function-arg-def name="instances"  type="required"/>
       <function-arg-def name="duration"   type="required"/>
diff --git a/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoad.xml b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoad.xml
index a9d06fa..bdf7974 100755
--- a/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoad.xml
+++ b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoad.xml
@@ -28,14 +28,13 @@
 <stax>
 
   <defaultcall function="searchLoad"/>
-
-
+  
+  
   <!-- ************************************************************ -->
   <!-- Client is automatically called by the scheduler and must     -->
   <!-- always define all the parameters below                       -->
-  <function name="searchLoad" scope="local">
+  <function name="searchLoad">
     <function-map-args>
-      <function-arg-def name="workingDir" type="required"/>
       <function-arg-def name="client"     type="required"/>
       <function-arg-def name="instances"  type="required"/>
       <function-arg-def name="duration"   type="required"/>
@@ -55,70 +54,20 @@
         msg = ''
       </script>
       
-      <!-- ==================    Preamble   =================== -->
+      <!-- ==================    Parser     =================== -->
       <!-- parse the client parameters :                        -->
       <!-- params is [[param1,val1],[param2,val2],...]          -->
       <!-- get the ldap instance parameters                     -->
-      
-      <script>
-        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
-        
-        #
-        # Extract client parameters from client.getParams()
-        #
-        cParams = client.getParams()
-        try:
-          serverInstanceFromClient = cParams[0][1]
-        except IndexError:
-          serverInstanceFromClient = NOT_DEFINED
-          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
-        try:
-          baseDn = cParams[1][1]
-        except IndexError:
-          baseDn = NOT_DEFINED
-          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
-        try:
-          nbCnx = cParams[2][1]
-        except IndexError:
-          nbCnx = NOT_DEFINED
-          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
-        try:
-          nbMaxSearch = cParams[3][1]
-        except IndexError:
-          nbMaxSearch = NOT_DEFINED
-          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
-        try:
-          attributeName = cParams[4][1]
-        except IndexError:
-          attributeName = NOT_DEFINED
-        
-        #
-        # setup parms to run the client
-        #
-        if serverInstanceFromClient != NOT_DEFINED:
-          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
-          from scheduler import getInstance
-          serverInstance = getInstance(serverInstanceFromClient,instances)
-          if (serverInstance == 'ERROR'):
-            msg = '%s\nERROR: cant find client instance named' % msg
-            msg = '%s %s in server instance list' % \
-                  (msg,serverInstanceFromClient)
-            
-          else:
-            # remove sec, try to finish before timer kill -9 the client
-            duration = duration - 20
-            
-            parms=[]
-            parms.append('-h %s -p %s' % \
-                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
-            parms.append('-b "%s"' % baseDn)
-            parms.append('-D "%s" -w "%s"' % \
-                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
-            parms.append('-t %s -M %s -d %s' % (nbCnx,nbMaxSearch,duration))
-            if attributeName != NOT_DEFINED:
-              parms.append('-a %s' % attributeName)
-            parms = ' '.join(parms)
-      </script>
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
       
       <if expr="msg.find('ERROR') != -1">
         <sequence>
@@ -138,78 +87,6 @@
         </sequence>
       <else>
         <sequence>
-          
-          <!-- ==== Add execute permission to build.ksh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'chmod',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Add execute permission to build.ksh file',
-           'fileFd'  : fileFd}
-          </call>
-          
-          
-          <process name="'%s: chmod +x build.ksh' % client.getHost()">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'chmod +x build.ksh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
-          <!-- ==== Build client : run build.ksh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'build',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Build client',
-           'fileFd'  : fileFd}
-          </call>
-          
-          <!-- Build Client in unique directory (compilDir), avoid          -->
-          <!-- conflict if same client is run several time at the same time -->
-          <process name="'%s: build %s' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'./build.ksh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir ]</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <if expr="RC != 0">
-            <message>
-              'FAILED to build client %s on %s' % \
-              (client.getName(),client.getHost())
-            </message>
-          </if>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
           <!-- ========== Run the client ========== -->
           <call function="'writeStartTagOperation'">
           { 'tagName' : 'run',
@@ -223,9 +100,11 @@
           </call>
           
           <script>
-            cParam = '-client -Xmx1G -Xms1G'
-            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
-            cParam = '%s -cp %s/clients/LDAPjdk/ldapjdk.jar' % (cParam,LOCAL_TESTS_DIR)
+            cParam = '-client'
+            # cParam = '%s -Xmx1G -Xms1G' % cParam
+            # cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '%s -cp %s/clients/LDAPjdk/ldapjdk.jar' % \
+                     (cParam,LOCAL_TESTS_DIR)
             cParam = '%s:%s/search.jar' % (cParam,compilDir)
             cParam = '%s Client %s' % (cParam,parms)
             
@@ -233,11 +112,17 @@
                         (client.getHost(),client.getName(),
                          serverInstance.getName())
           </script>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'cmd : cd %s ; %s/bin/java %s' % \
+                        (client.getPath(),JAVA_HOME,cParam)
+          }
+          </call>
           <process name="'%s' % titleName">
             <location>client.getHost()</location>
             <command>'%s/bin/java' % JAVA_HOME</command>
             <parms>cParam </parms>
-            <workdir>workingDir</workdir>
+            <workdir>client.getPath()</workdir>
             <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
             <stderr mode="'stdout'"/>
             <stdout>outFile</stdout>
@@ -255,31 +140,12 @@
           </script>
           <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
           
-          <!-- ========== Postamble ========== -->
           <call function="'writeMessage'">
           {'content' : 'Output file %s' % outFile,
            'xlink'   : outFile,
            'fileFd'  : fileFd}
           </call>
           
-          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">
-              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
-            </command>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <script>
-            summary = STAXResult[0][1]
-          </script>
-          <call function="'writeMessage'">
-          {'content' : 'Summary %s' % (summary),
-           'fileFd'  : fileFd}
-          </call>
-          
         </sequence>
       </else>
       </if>
@@ -291,6 +157,5 @@
   </function>
   
   
-  
 </stax>
 
diff --git a/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadLib.xml b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadLib.xml
new file mode 100755
index 0000000..98252f0
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadLib.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="searchLoadParser"/>
+  
+  
+  <!-- ************************************************************ -->
+  <!-- Client Parser -->
+  <!-- This function must NOT have scope=local has its variables may -->
+  <!-- be used by the caller -->
+  <function name="searchLoadParser">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <script>
+        compilDir = '%s/%s_%s' % \
+                    (client.getPath(),client.getHost(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxSearch = cParams[3][1]
+        except IndexError:
+          nbMaxSearch = NOT_DEFINED
+          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 20
+            
+            parms=[]
+            parms.append('-h %s -p %s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+            parms.append('-b "%s"' % baseDn)
+            parms.append('-D "%s" -w "%s"' % \
+                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
+            parms.append('-t %s -M %s -d %s' % (nbCnx,nbMaxSearch,duration))
+            if attributeName != NOT_DEFINED:
+              parms.append('-a %s' % attributeName)
+            parms = ' '.join(parms)
+      </script>
+    </sequence>
+  </function>
+  
+</stax>
diff --git a/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPostamble.xml b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPostamble.xml
new file mode 100755
index 0000000..c682feb
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPostamble.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="searchLoadPostamble"/>
+
+  <!-- ************************************************************ -->
+  <!-- Client postamble is automatically called by the scheduler    -->
+  <!-- and must always define all the parameters below              -->
+  <function name="searchLoadPostamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+  </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPreamble.xml b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPreamble.xml
new file mode 100755
index 0000000..29f8347
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/clients/searchLoad/searchLoadPreamble.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="searchLoadPreamble"/>
+
+  <!-- ************************************************************ -->
+  <!-- Client preamble is automatically called by the scheduler     -->
+  <!-- and must always define all the parameters below              -->
+  <function name="searchLoadPreamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          <!-- ==== Add execute permission to build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.ksh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          <process name="'%s: chmod +x build.ksh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.ksh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ==== Build client : run build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Build client',
+           'fileFd'  : fileFd}
+          </call>
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.ksh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir ]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+  </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/system-tests/clients/verdictOpends/verdictOpends.xml b/opendj-sdk/opends/tests/system-tests/clients/verdictOpends/verdictOpends.xml
index 19cc3d0..03e1b40 100755
--- a/opendj-sdk/opends/tests/system-tests/clients/verdictOpends/verdictOpends.xml
+++ b/opendj-sdk/opends/tests/system-tests/clients/verdictOpends/verdictOpends.xml
@@ -35,7 +35,6 @@
   <!-- always define all the parameters below                       -->
   <function name="verdictOpends" scope="local">
     <function-map-args>
-      <function-arg-def name="workingDir" type="required"/>
       <function-arg-def name="client"     type="required"/>
       <function-arg-def name="instances"  type="required"/>
       <function-arg-def name="duration"   type="required"/>
diff --git a/opendj-sdk/opends/tests/system-tests/phases/configuration/configuration_opends.xml b/opendj-sdk/opends/tests/system-tests/phases/configuration/configuration_opends.xml
index e9c3a9c..152c364 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/configuration/configuration_opends.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/configuration/configuration_opends.xml
@@ -137,7 +137,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             
             fileList.append(logFile)
             
@@ -223,7 +223,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             
             # reopen existing files, no need to add in fileList variable 
             # as it has already been added
@@ -580,7 +580,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             # reopen existing files, no need to add in fileList variable
             # as it has already been added
             cFileFd = open(logFile,'a')
@@ -839,7 +839,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             # reopen existing files, no need to add in fileList variable
             # as it has already been added
             cFileFd = open(logFile,'a')
@@ -909,7 +909,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             # reopen existing files, no need to add in fileList variable
             # as it has already been added
             cFileFd = open(logFile,'a')
@@ -978,7 +978,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             # reopen existing files, no need to add in fileList variable
             # as it has already been added
             cFileFd = open(logFile,'a')
diff --git a/opendj-sdk/opends/tests/system-tests/phases/installation/installation_opends.xml b/opendj-sdk/opends/tests/system-tests/phases/installation/installation_opends.xml
index c1c683f..d8e62be 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/installation/installation_opends.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/installation/installation_opends.xml
@@ -64,7 +64,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
+            logFile = STAXResult[0]
             
             fileList.append(logFile)
             
diff --git a/opendj-sdk/opends/tests/system-tests/phases/log/log.xml b/opendj-sdk/opends/tests/system-tests/phases/log/log.xml
index ce4dc6d..c71f5c4 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/log/log.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/log/log.xml
@@ -80,24 +80,28 @@
     <sequence>
       <if expr="type == 'client'">
         <script>
-          logFile = '%s/%s_%s_%s_%s.xml' % \
-                    ( LOG_TMP_DIR,prefix,\
+          logName = '%s_%s_%s_%s' % \
+                    ( prefix,\
                       object.getName(),object.getHost(),object.getId())
         </script>
       <elseif expr="type == 'instance'">
         <script>
-          logFile = '%s/%s_%s_%s.xml' % \
-          (LOG_TMP_DIR,prefix,object.getName(),object.getHost())
+          logName = '%s_%s_%s' % (prefix,object.getName(),object.getHost())
         </script>
       </elseif>
       <else>
         <script>
-          logFile = 'getLogFileName_%s' % NOT_DEFINED
+          logName = 'getLogFileName_%s' % NOT_DEFINED
         </script>
       </else>
       </if>
+      
+      <script>
+        logFile = '%s/%s.xml' % (LOG_TMP_DIR,logName)
+      </script>
+      
       <return>
-        logFile
+        [ logFile , logName ]
       </return>
     </sequence>
   </function>
@@ -212,7 +216,7 @@
                     }
                   </call>
                   <script>
-                    cFileList.append(STAXResult)
+                    cFileList.append(STAXResult[0])
                   </script>
                 </sequence>
               </iterate>
diff --git a/opendj-sdk/opends/tests/system-tests/phases/main_run_lib.xml b/opendj-sdk/opends/tests/system-tests/phases/main_run_lib.xml
index 449b258..bdf0f0e 100644
--- a/opendj-sdk/opends/tests/system-tests/phases/main_run_lib.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/main_run_lib.xml
@@ -346,6 +346,23 @@
         </sequence>
       </if>
       
+      
+      <!-- Set path to clients -->
+      <!-- set local client by default if exist in the scenario -->
+      <!-- else get the shared client if exist -->
+      <call function="'getEnabledClients'">{'scheduler':scheduler}</call>
+      <script>clients = STAXResult </script>
+      <if expr="len(clients) > 0">
+        <paralleliterate in="clients" var="client">
+          <sequence>
+            <call function="'clientSetPath'">
+            { 'client' : client }
+            </call>
+          </sequence>
+        </paralleliterate>
+      </if>
+      
+      
       <message log="1">
         '== Found %s Error(s) during this phase' % (ERR_NUM[0])
       </message>
diff --git a/opendj-sdk/opends/tests/system-tests/phases/parser/object_lib.xml b/opendj-sdk/opends/tests/system-tests/phases/parser/object_lib.xml
index fe4f7aa..4b009ea 100644
--- a/opendj-sdk/opends/tests/system-tests/phases/parser/object_lib.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/parser/object_lib.xml
@@ -86,5 +86,60 @@
       <return>clients</return>
     </sequence>
   </function>
+  
+  
+  <!-- ************************************************************ -->
+  <function name="clientSetPath">
+    <function-map-args>
+      <function-required-arg name="client"/>
+    </function-map-args>
+    <sequence>
+      <script>
+        localWorkingDir = '%s/scenario/%s/clients/%s' % \
+                           (LOCAL_TESTS_DIR,DIR_NAME,client.getName())
+        sharedWorkingdir = '%s/clients/%s/' % \
+                           (LOCAL_TESTS_DIR,client.getName())
+      </script>
+      
+      <call function="'isFile'">
+      {
+        'location' : client.getHost(),
+        'fileName' : '%s/%s.xml' % (localWorkingDir,client.getName())
+      }
+      </call>
+      <script>
+        localClientExist = STAXResult
+      </script>
+      
+      <call function="'isFile'">
+      {
+        'location' : client.getHost(),
+        'fileName' : '%s/%s.xml' % (sharedWorkingdir,client.getName())
+      }
+      </call>
+      <script>
+        sharedClientExist = STAXResult
+      </script>
+      
+      <!-- use local client by default else the shared client -->
+      <if expr="localClientExist == TRUE">
+        <script> client.setPath(localWorkingDir) </script>
+      <elseif expr="sharedClientExist == TRUE">
+        <script> client.setPath(sharedWorkingdir) </script>
+      </elseif>
+      <else>
+        <sequence>
+          <message>
+            'ERROR : cant find files %s/%s.xml, %s/%s.xml'% \
+            (localWorkingDir,client.getName(),\
+             sharedWorkingdir,client.getName())
+          </message>
+          <script> ERR_NUM[0] += 1 </script>
+        </sequence>
+      </else>
+      </if>
+    </sequence>
+  </function>
+  
 </stax>
 
diff --git a/opendj-sdk/opends/tests/system-tests/phases/parser/parser.py b/opendj-sdk/opends/tests/system-tests/phases/parser/parser.py
index cbaa8fd..0984daa 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/parser/parser.py
+++ b/opendj-sdk/opends/tests/system-tests/phases/parser/parser.py
@@ -456,6 +456,7 @@
     self.logDir     = NOT_DEFINED
     self.startDate  = NOT_DEFINED
     self.stopDate   = NOT_DEFINED
+    self.path       = NOT_DEFINED
     
   def getId(self):
     return self.iid
@@ -513,6 +514,12 @@
     
   def setStopDate(self,stopDate):
     self.stopDate = stopDate
+    
+  def getPath(self):
+    return self.path
+    
+  def setPath(self,path):
+    self.path = path
 
 
 ###########################
diff --git a/opendj-sdk/opends/tests/system-tests/phases/scheduler/scheduler.xml b/opendj-sdk/opends/tests/system-tests/phases/scheduler/scheduler.xml
index 471bb67..df83175 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/scheduler/scheduler.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/scheduler/scheduler.xml
@@ -140,7 +140,6 @@
     <sequence>
       <!--==========  Define variables  =========-->
       <script>
-        fileList = STAXGlobal([])
         finishedClients = STAXGlobal([])
       </script>
       
@@ -188,8 +187,7 @@
             }
           </call>
           <script>
-            logFile = STAXResult
-            fileList.append(logFile)
+            logFile = STAXResult[0]
             fileFd = open(logFile,'w')
           </script>
           <!-- == Write tag for xml report -->
@@ -308,14 +306,14 @@
       <script>
         startTime=strftime("%Y%m%d@%H:%M:%S",localtime())
         client.setStartDate(startTime)
-        errNum = NOT_DEFINED
+        errNum = 0
       </script>
       
       <!--=============== Log info =======================================-->
       <if expr="client.getHost() == NOT_DEFINED">
         <sequence>
           <script>
-            str = '++ Start client %s'         % (client.getName())
+            str = '++ START CLIENT %s'         % (client.getName())
             str = '%s (id=%s)'                 % (str, client.getId())
             str = '%s at %s'                   % (str, startTime)
             str = '%s, max duration is %s sec' % (str, duration)
@@ -330,7 +328,7 @@
       <else>
         <sequence>
           <script>
-            str = '++ Start client %s'         % (client.getName())
+            str = '++ START CLIENT %s'         % (client.getName())
             str = '%s (id=%s)'                 % (str, client.getId())
             str = '%s running on %s'           % (str, client.getHost())
             str = '%s at %s'                   % (str, startTime)
@@ -346,65 +344,43 @@
       </else>
       </if>
       
-      
-      <!--=============== Start the client under a timer =================-->
-      <!--== open logfile for details                                   ==-->
-      <!-- All informations loged in this this function will              -->
-      <!-- not be displayed in the main report, to avoid broken xml file  -->
-       <call function="'getLogFileName'">
-        {
-          'type'   : 'client',
-          'object' : client,
-          'prefix' : 'client_details'
-        }
-      </call>
-      <script>
-        logFileDetails = STAXResult
-        logFileDetailsRelativePath = logFileDetails.replace(LOG_DIR,'.')
-        fileList.append(logFileDetails)
-        fileFdDetails = open(logFileDetails,'w')
-        outFile = '%s/client_%s_id%s.txt' % \
-                  (client.getLogDir(),client.getName(),client.getId())
-      </script>
-      
-      <call function="'startTimer'">
+      <!--=============== Run client phases ==============================-->
+      <call function="'runClientPreamble'">
       { 
-        'client'     : client,
-        'instances'  : instances,
-        'duration'   : duration,
-        'suffix'     : suffix,
-        'outFile'    : outFile,
-        'fileFd'     : fileFdDetails
+        'client'    : client,
+        'instances' : instances,
+        'duration'  : duration,
+        'suffix'    : suffix,
+        'fileFd'    : fileFd
       }
       </call>
-      <script>
-        fileFdDetails.close()
-        errNum = STAXResult[0]
-        timerKilled = STAXResult[1]
+      <script> errNum += STAXResult </script>
+      
+      <call function="'runClientMain'">
+      { 
+        'client'    : client,
+        'instances' : instances,
+        'duration'  : duration,
+        'suffix'    : suffix,
+        'fileFd'    : fileFd
+      }
+      </call>
+      <script> 
+        errNum += STAXResult[0]
+        outFileRun = STAXResult[1]
       </script>
       
-      <!--=============== Analyze client run status ======================-->
-      <if expr="timerKilled == TRUE">
-        <sequence>
-          <script>
-            errMsg = 'ERROR: client %s has been killed,' % client.getName()
-          </script>
-          <call function="'writeMessage'">
-            {
-              'content' : errMsg,
-              'fileFd'  : fileFd
-            }
-          </call>
-          <message> errMsg </message>
-          <script>
-            ERR_NUM[0] += 1
-          </script>
-        </sequence>
-      </if>
-      
-      <script>
-        finishedClients.append(client.getId())
-      </script>
+      <call function="'runClientPostamble'">
+      { 
+        'client'    : client,
+        'instances' : instances,
+        'duration'  : duration,
+        'suffix'    : suffix,
+        'outFile'   : outFileRun,
+        'fileFd'    : fileFd
+      }
+      </call>
+      <script> errNum += STAXResult </script>
       
       <!--=============== Log info =======================================-->
       <script>
@@ -412,23 +388,9 @@
         client.setStopDate(stopTime)
       </script>
       <message>
-        '-- Stop %s client (id %s) running on %s at %s' %\
+        '-- STOP CLIENT %s (id %s) running on %s at %s' %\
         (client.getName(),client.getId(),client.getHost(),stopTime)
       </message>
-      <call function="'writeMessage'">
-      { 
-        'content' : 'Details of the client : %s' % logFileDetails,
-        'xlink'   : logFileDetailsRelativePath,
-        'fileFd'  : fileFd
-      }
-      </call>
-      <call function="'writeMessage'">
-      { 
-        'content' : 'Client outPuts : %s' % outFile,
-        'xlink'   : outFile,
-        'fileFd'  : fileFd
-      }
-      </call>
       
       
       <!--=============== Set client result ==============================-->
@@ -458,6 +420,336 @@
       
     </sequence>
   </function>
+  
+  
+  <!-- ************************************************************ -->
+  <function name="runClientPreamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client" type="required"/>
+      <function-arg-def name="duration" type="required"/>
+      <function-arg-def name="instances" type="required"/>
+      <function-arg-def name="suffix" type="required"/>
+      <function-arg-def name="fileFd" type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <call function="'isFile'">
+      {
+        'location' : client.getHost(),
+        'fileName' : '%s/%sPreamble.xml' % (client.getPath(),client.getName()),
+      }
+      </call>
+      <script>
+        fileExist = STAXResult
+      </script>
+      <if expr="fileExist == TRUE">
+        <sequence>
+          <script>
+            errNum = 0
+          </script>
+          <!--============= Start the client under a timer =================-->
+          <!--== open logfile for details                                 ==-->
+          <!-- All informations loged in this this function will            -->
+          <!-- not be displayed in the main report, to avoid broken xml file-->
+           <call function="'getLogFileName'">
+            {
+              'type'   : 'client',
+              'object' : client,
+              'prefix' : 'client_details_preamble'
+            }
+          </call>
+          <script>
+            logFileDetails = STAXResult[0]
+            logFileDetailsName = STAXResult[1]
+            logFileDetailsRelativePath = logFileDetails.replace(LOG_DIR,'.')
+            fileFdDetails = open(logFileDetails,'w')
+            outFile = '%s/%s.txt' % (client.getLogDir(),logFileDetailsName)
+          </script>
+          <message>
+            '   Start preamble for %s (id=%s) running on %s' % \
+            (client.getName(),client.getId(), client.getHost())
+          </message>
+          <!-- ==== Log info ====================================-->
+          <!--== Write root tag for xml details file -->
+          <script>
+            str = '&lt;?xml version=\"1.0\" encoding=\"UTF-8\"'
+            str = '%s standalone=\"no\"?&gt;\n' % str
+            str = '%s &lt;?xml-stylesheet type="text/xsl"' % str
+            str = '%s href="clientDetails.xsl"?>\n' % str
+            fileFdDetails.write(str)
+          </script>
+          <call function="'writeStartTagClient'">
+          {
+            'client'          : client,
+            'extraParameters' : 'xmlns:xlink="http://www.w3.org/1999/xlink"',
+            'fileFd'          : fileFdDetails
+          }
+          </call>
+          <call function="'writeMessage'">
+          {
+            'content' : 'Client Preamble details',
+            'fileFd'  : fileFdDetails,
+          }
+          </call>
+          
+          <!--=============== run preamble =================================-->
+          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+           file="'%s/%sPreamble.xml' % (client.getPath(),client.getName())"/>
+          <call function="'%sPreamble' % client.getName()">
+          { 
+            'client'     : client,
+            'instances'  : instances,
+            'duration'   : duration,
+            'suffix'     : suffix,
+            'outFile'    : outFile,
+            'fileFd'     : fileFdDetails
+          }
+          </call>
+          <script>
+            errNum = STAXResult
+          </script>
+          <!--=============== Log info =====================================-->
+          <call function="'writeMessage'">
+          { 
+            'content' : 'Client preamble : %s' % logFileDetails,
+            'xlink'   : logFileDetailsRelativePath,
+            'fileFd'  : fileFd
+          }
+          </call>
+          <!--== Close root tag for xml details file -->
+          <call function="'writeEndTagClient'">
+          { 'fileFd'    : fileFdDetails }
+          </call>
+          <script> fileFdDetails.close() </script>
+          <message>
+            '   Stop pretamble for %s (id=%s) running on %s' % \
+            (client.getName(),client.getId(), client.getHost())
+          </message>
+        </sequence>
+      <else>
+        <message>
+          '   File not found, skip preamble : %s/%sPreamble.xml' % \
+          (client.getPath(),client.getName())
+        </message>
+      </else>
+      </if>
+      <return>errNum</return>
+    </sequence>
+  </function>
+  
+  
+  <!-- ************************************************************ -->
+  <function name="runClientPostamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client" type="required"/>
+      <function-arg-def name="duration" type="required"/>
+      <function-arg-def name="instances" type="required"/>
+      <function-arg-def name="suffix" type="required"/>
+      <function-arg-def name="outFile" type="required"/>
+      <function-arg-def name="fileFd" type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <call function="'isFile'">
+      {
+        'location' : client.getHost(),
+        'fileName' : '%s/%sPostamble.xml'%(client.getPath(),client.getName()),
+      }
+      </call>
+      <script>
+        fileExist = STAXResult
+      </script>
+      <if expr="fileExist == TRUE">
+        <sequence>
+          <script>
+            errNum = 0
+          </script>
+          <!--============= Start the client under a timer =================-->
+          <!--== open logfile for details                                 ==-->
+          <!-- All informations loged in this this function will            -->
+          <!-- not be displayed in the main report, to avoid broken xml file-->
+           <call function="'getLogFileName'">
+            {
+              'type'   : 'client',
+              'object' : client,
+              'prefix' : 'client_details_postamble'
+            }
+          </call>
+          <script>
+            logFileDetails = STAXResult[0]
+            logFileDetailsName = STAXResult[1]
+            logFileDetailsRelativePath = logFileDetails.replace(LOG_DIR,'.')
+            fileFdDetails = open(logFileDetails,'w')
+          </script>
+          <message>
+            '   Start postamble for %s (id=%s) running on %s' % \
+            (client.getName(),client.getId(), client.getHost())
+          </message>
+          <!-- ==== Log info ====================================-->
+          <!--== Write root tag for xml details file -->
+          <script>
+            str = '&lt;?xml version=\"1.0\" encoding=\"UTF-8\"'
+            str = '%s standalone=\"no\"?&gt;\n' % str
+            str = '%s &lt;?xml-stylesheet type="text/xsl"' % str
+            str = '%s href="clientDetails.xsl"?>\n' % str
+            fileFdDetails.write(str)
+          </script>
+          <call function="'writeStartTagClient'">
+          {
+            'client'          : client,
+            'extraParameters' : 'xmlns:xlink="http://www.w3.org/1999/xlink"',
+            'fileFd'          : fileFdDetails
+          }
+          </call>
+          <call function="'writeMessage'">
+          {
+            'content' : 'Client Postamble details',
+            'fileFd'  : fileFdDetails,
+          }
+          </call>
+          <!--=============== run postamble ================================-->
+          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+           file="'%s/%sPostamble.xml' % (client.getPath(),client.getName())"/>
+          <call function="'%sPostamble' % client.getName()">
+          { 
+            'client'     : client,
+            'instances'  : instances,
+            'duration'   : duration,
+            'suffix'     : suffix,
+            'outFile'    : outFile,
+            'fileFd'     : fileFdDetails
+          }
+          </call>
+          <script>
+            errNum = STAXResult
+          </script>
+          <!--=============== Log info =====================================-->
+          <call function="'writeMessage'">
+          { 
+            'content' : 'Client postamble : %s' % logFileDetails,
+            'xlink'   : logFileDetailsRelativePath,
+            'fileFd'  : fileFd
+          }
+          </call>
+          <!--== Close root tag for xml details file -->
+          <call function="'writeEndTagClient'">
+          { 'fileFd'    : fileFdDetails }
+          </call>
+          <script> fileFdDetails.close() </script>
+          <message>
+            '   Stop postamble for %s (id=%s) running on %s' % \
+            (client.getName(),client.getId(), client.getHost())
+          </message>
+        </sequence>
+      <else>
+        <message>
+          '   File not found, skip postamble : %s/%sPostamble.xml' % \
+          (client.getPath(),client.getName())
+        </message>
+      </else>
+      </if>
+      <return>errNum</return>
+    </sequence>
+  </function>
+  
+  
+  <!-- ************************************************************ -->
+  <function name="runClientMain" scope="local">
+    <function-map-args>
+      <function-arg-def name="client" type="required"/>
+      <function-arg-def name="duration" type="required"/>
+      <function-arg-def name="instances" type="required"/>
+      <function-arg-def name="suffix" type="required"/>
+      <function-arg-def name="fileFd" type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <script>
+        errNum = 0
+      </script>
+      <!--=============== Start the client under a timer =================-->
+      <!--== open logfile for details                                   ==-->
+      <!-- All informations loged in this this function will              -->
+      <!-- not be displayed in the main report, to avoid broken xml file  -->
+       <call function="'getLogFileName'">
+        {
+          'type'   : 'client',
+          'object' : client,
+          'prefix' : 'client_details'
+        }
+      </call>
+      <script>
+        logFileDetails = STAXResult[0]
+        logFileDetailsName = STAXResult[1]
+        logFileDetailsRelativePath = logFileDetails.replace(LOG_DIR,'.')
+        fileFdDetails = open(logFileDetails,'w')
+        outFile = '%s/%s.txt' % (client.getLogDir(),logFileDetailsName)
+      </script>
+      <message>
+        '   Start run for %s (id=%s) running on %s' % \
+        (client.getName(),client.getId(), client.getHost())
+      </message>
+      <call function="'startTimer'">
+      { 
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix,
+        'outFile'    : outFile,
+        'fileFd'     : fileFdDetails
+      }
+      </call>
+      <script>
+        fileFdDetails.close()
+        errNum += STAXResult[0]
+        timerKilled = STAXResult[1]
+      </script>
+      
+      <!--=============== Analyze client run status ======================-->
+      <if expr="timerKilled == TRUE">
+        <sequence>
+          <script>
+            errMsg = 'ERROR: client %s has been killed,' % client.getName()
+          </script>
+          <call function="'writeMessage'">
+            {
+              'content' : errMsg,
+              'fileFd'  : fileFd
+            }
+          </call>
+          <message> errMsg </message>
+          <script>
+            ERR_NUM[0] += 1
+          </script>
+        </sequence>
+      </if>
+      
+      <script>
+        finishedClients.append(client.getId())
+      </script>
+      
+      <!--=============== Log info =======================================-->
+      <call function="'writeMessage'">
+      { 
+        'content' : 'Details of the client : %s' % logFileDetails,
+        'xlink'   : logFileDetailsRelativePath,
+        'fileFd'  : fileFd
+      }
+      </call>
+      <call function="'writeMessage'">
+      { 
+        'content' : 'Client outPuts : %s' % outFile,
+        'xlink'   : outFile,
+        'fileFd'  : fileFd
+      }
+      </call>
+      <message>
+        '   Stop run for %s (id=%s) running on %s' % \
+        (client.getName(),client.getId(), client.getHost())
+      </message>
+      <return> [ errNum , outFile ]</return>
+    </sequence>
+  </function>
 
 
   <!-- ************************************************************ -->
@@ -492,103 +784,43 @@
       <!--=============== Select local/shared client file ================-->
       <script>
         timerKilled = TRUE
-        workingDir  = NOT_DEFINED
-        localWorkingDir = '%s/scenario/%s/clients/%s' % \
-                           (LOCAL_TESTS_DIR,DIR_NAME,client.getName())
-        sharedWorkingdir = '%s/clients/%s/' % \
-                           (LOCAL_TESTS_DIR,client.getName())
       </script>
       
-      <!-- Check if local file exists before launching it-->
-      <call function="'isFile'">
-      {
-        'location' : STAXServiceMachine,
-        'fileName' : '%s/%s.xml' % (localWorkingDir,client.getName())
-      }
-      </call>
-      <script>
-        localClientExist = STAXResult
-      </script>
-      <!-- Check if remote file exists before launching it-->
-      <call function="'isFile'">
-      {
-        'location' : STAXServiceMachine,
-        'fileName' : '%s/%s.xml' % (sharedWorkingdir,client.getName())
-      }
-      </call>
-      <script>
-        sharedClientExist = STAXResult
-      </script>
-      
-      
       <!--================================================================-->
       <!--====== run the client, exit if time exceed duration time  ======-->
       <timer duration="'%ss' % duration">
         <sequence>
-          <!-- use local client by default else the shared client -->
-          <if expr="localClientExist == TRUE">
-            <script> workingDir = localWorkingDir </script>
-          <elseif expr="sharedClientExist == TRUE">
-            <script> workingDir = sharedWorkingdir </script>
-          </elseif>
-          <else>
+          <!-- Check that staf is running on the client -->
+          <call function="'pingStaf'">
+            { 'targetHost' : client.getHost(),
+              'fileFd'     : fileFd}
+          </call>
+          <script>
+            pingRC = STAXResult[0]
+          </script>
+          <if expr="pingRC == 0">
             <sequence>
-              <script>
-                str = 'ERROR : cant find files %s/%s.xml and %s/%s.xml' % \
-                (localWorkingDir,client.getName(),\
-                 sharedWorkingdir,client.getName())
-              </script>
-              <message>
-                str
-              </message>
-              <call function="'writeMessage'">
-              { 'fileFd'  : fileFd,
-                'content' : str
+              <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+               file="'%s/%s.xml' % (client.getPath(),client.getName())"/>
+              <call function="'%s' % client.getName()">
+              { 
+                'client'     : client,
+                'instances'  : instances,
+                'duration'   : duration,
+                'suffix'     : suffix,
+                'outFile'    : outFile,
+                'fileFd'     : fileFd
               }
               </call>
-              <script>ERR_NUM[0] += 1</script>
+              <script>errNum = STAXResult</script>
             </sequence>
+          <else>
+            <!-- staf does not answer ping on client host -->
+            <script> errNum = 1 </script>
           </else>
           </if>
-          
-          <if expr="workingDir != NOT_DEFINED">
-            <sequence>
-              <!-- Check that staf is running on the client -->
-              <call function="'pingStaf'">
-                { 'targetHost' : client.getHost(),
-                  'fileFd'     : fileFd}
-              </call>
-              <script>
-                pingRC = STAXResult[0]
-              </script>
-              <if expr="pingRC == 0">
-                <sequence>
-                  <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
-                          file="'%s/%s.xml' % (workingDir,client.getName())"/>
-                  <call function="'%s' % client.getName()">
-                  { 
-                    'workingDir' : workingDir,
-                    'client'     : client,
-                    'instances'  : instances,
-                    'duration'   : duration,
-                    'suffix'     : suffix,
-                    'outFile'    : outFile,
-                    'fileFd'     : fileFd
-                  }
-                  </call>
-                  <script>errNum = STAXResult</script>
-                </sequence>
-              <else>
-                <!-- staf does not answer ping on client host -->
-                <script> errNum = 1 </script>
-              </else>
-              </if>
-              <script>timerKilled = FALSE</script>
-            </sequence>
-          </if>
-          
+          <script>timerKilled = FALSE</script>
         </sequence>
-      
       </timer>
       
       
diff --git a/opendj-sdk/opends/tests/system-tests/phases/shared/functions/opendsadm.xml b/opendj-sdk/opends/tests/system-tests/phases/shared/functions/opendsadm.xml
index af7be26..6a02aab 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/shared/functions/opendsadm.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/shared/functions/opendsadm.xml
@@ -1197,11 +1197,11 @@
       <script>
         STAFCmdParamsList=[]
         STAFCmdParams=''
-
+        
         if dsPath:
           dsBinPath='%s/bin' % (dsPath)
           STAFCmd='%s/backup' % (dsBinPath)
-
+        
         if dsInstanceHost:
           STAFCmdParamsList.append('-h %s' % dsInstanceHost)
         
@@ -1213,20 +1213,20 @@
         
         if dsInstancePswd:
           STAFCmdParamsList.append('-w "%s"' % dsInstancePswd)
-          
-	if backupDir:
-	  STAFCmdParamsList.append('-d %s' % backupDir)
-
-	if backEnd:
-	  STAFCmdParamsList.append('-n %s' % backEnd)
-
-	if extraParams:
-	  STAFCmdParamsList.append('%s' % extraParams)
-
-	if startTask:
-	  STAFCmdParamsList.append('-t %s' % startTask)
-
-	STAFCmdParams=' '.join(STAFCmdParamsList)
+        
+        if backupDir:
+          STAFCmdParamsList.append('-d %s' % backupDir)
+        
+        if backEnd:
+          STAFCmdParamsList.append('-n %s' % backEnd)
+        
+        if extraParams:
+          STAFCmdParamsList.append('%s' % extraParams)
+        
+        if startTask:
+          STAFCmdParamsList.append('-t %s' % startTask)
+        
+        STAFCmdParams=' '.join(STAFCmdParamsList)
       </script>
       
       <call function="'writeStartTagOperation'">
diff --git a/opendj-sdk/opends/tests/system-tests/phases/verdict/verdict.xml b/opendj-sdk/opends/tests/system-tests/phases/verdict/verdict.xml
index 2ab5c93..d38a280 100755
--- a/opendj-sdk/opends/tests/system-tests/phases/verdict/verdict.xml
+++ b/opendj-sdk/opends/tests/system-tests/phases/verdict/verdict.xml
@@ -138,7 +138,7 @@
                 }
               </call>
               <script>
-                logFile = STAXResult
+                logFile = STAXResult[0]
                 
                 fileList.append(logFile)
                 
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/4MMR.xml b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/4MMR.xml
index 272e72d..9572d33 100755
--- a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/4MMR.xml
+++ b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/4MMR.xml
@@ -47,9 +47,9 @@
         <call function="'main_run'">
         {
          'configurationFile': fConf,
-         'runInstallation'  : 'true',
-         'runGenerateLdif'  : 'true',
-         'runConfiguration' : 'true',
+         'runInstallation'  : 'false',
+         'runGenerateLdif'  : 'false',
+         'runConfiguration' : 'false',
          'runScheduler'     : 'true'
         }
         </call>
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoad.xml b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoad.xml
index d077414..c0c0546 100755
--- a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoad.xml
+++ b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoad.xml
@@ -35,7 +35,6 @@
   <!-- always define all the parameters below                       -->
   <function name="addDeleteLoad" scope="local">
     <function-map-args>
-      <function-arg-def name="workingDir" type="required"/>
       <function-arg-def name="client"     type="required"/>
       <function-arg-def name="instances"  type="required"/>
       <function-arg-def name="duration"   type="required"/>
@@ -55,71 +54,20 @@
         msg = ''
       </script>
       
-      <!-- ==================    Preamble   =================== -->
+      <!-- ==================    Parser     =================== -->
       <!-- parse the client parameters :                        -->
       <!-- params is [[param1,val1],[param2,val2],...]          -->
       <!-- get the ldap instance parameters                     -->
-      
-      <script>
-        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
-        
-        #
-        # Extract client parameters from client.getParams()
-        #
-        cParams = client.getParams()
-        try:
-          serverInstanceFromClient = cParams[0][1]
-        except IndexError:
-          serverInstanceFromClient = NOT_DEFINED
-          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
-        try:
-          baseDn = cParams[1][1]
-        except IndexError:
-          baseDn = NOT_DEFINED
-          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
-        try:
-          nbCnx = cParams[2][1]
-        except IndexError:
-          nbCnx = NOT_DEFINED
-          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
-        try:
-          nbMaxOps = cParams[3][1]
-        except IndexError:
-          nbMaxOps = NOT_DEFINED
-        try:
-          attributeName = cParams[4][1]
-        except IndexError:
-          attributeName = NOT_DEFINED
-        
-        #
-        # setup parms to run the client
-        #
-        if serverInstanceFromClient != NOT_DEFINED:
-          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
-          from scheduler import getInstance
-          serverInstance = getInstance(serverInstanceFromClient,instances)
-          if (serverInstance == 'ERROR'):
-            msg = '%s\nERROR: cant find client instance named' % msg
-            msg = '%s %s in server instance list' % \
-                  (msg,serverInstanceFromClient)
-            
-          else:
-            # remove sec, try to finish before timer kill -9 the client
-            duration = duration - 20
-            
-            parms=[]
-            parms.append('-h %s -p %s' % \
-                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
-            parms.append('-b "%s"' % baseDn)
-            parms.append('-D "%s" -w "%s"' % \
-                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
-            parms.append('-t %s -d %s' % (nbCnx,duration))
-            if nbMaxOps != NOT_DEFINED:
-              parms.append('-M %s' % nbMaxOps)
-            if attributeName != NOT_DEFINED:
-              parms.append('-a %s' % attributeName)
-            parms = ' '.join(parms)
-      </script>
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
       
       <if expr="msg.find('ERROR') != -1">
         <sequence>
@@ -139,78 +87,6 @@
         </sequence>
       <else>
         <sequence>
-          
-          <!-- ==== Add execute permission to build.ksh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'chmod',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Add execute permission to build.ksh file',
-           'fileFd'  : fileFd}
-          </call>
-          
-          
-          <process name="'%s: chmod +x build.ksh' % client.getHost()">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'chmod +x build.ksh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
-          <!-- ==== Build client : run build.ksh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'build',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Build client',
-           'fileFd'  : fileFd}
-          </call>
-          
-          <!-- Build Client in unique directory (compilDir), avoid          -->
-          <!-- conflict if same client is run several time at the same time -->
-          <process name="'%s: build %s' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'./build.ksh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir]</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <if expr="RC != 0">
-            <message>
-              'FAILED to build client %s on %s' % \
-              (client.getName(),client.getHost())
-            </message>
-          </if>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
           <!-- ========== Run the client ========== -->
           <call function="'writeStartTagOperation'">
           { 'tagName' : 'run',
@@ -224,8 +100,9 @@
           </call>
           
           <script>
-            cParam = '-client -Xmx1G -Xms1G'
-            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '-client'
+            # cParam = '%s -Xmx1G -Xms1G' % cParam
+            # cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
             cParam = '%s -cp %s/clients/LDAPjdk/ldapjdk.jar' \
                       % (cParam,LOCAL_TESTS_DIR)
             cParam = '%s:%s/addDeleteLoad.jar' % (cParam,compilDir)
@@ -235,11 +112,17 @@
                         (client.getHost(),client.getName(),
                          serverInstance.getName())
           </script>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'cmd : cd %s ; %s/bin/java %s' % \
+                        (client.getPath(),JAVA_HOME,cParam)
+          }
+          </call>
           <process name="'%s' % titleName">
             <location>client.getHost()</location>
             <command>'%s/bin/java' % JAVA_HOME</command>
             <parms>cParam </parms>
-            <workdir>workingDir</workdir>
+            <workdir>client.getPath()</workdir>
             <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
             <stderr mode="'stdout'"/>
             <stdout>outFile</stdout>
@@ -258,32 +141,11 @@
           <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
           
           
-          <!-- ========== Postamble ========== -->
           <call function="'writeMessage'">
           {'content' : 'Output file %s' % outFile,
            'fileFd'  : fileFd}
           </call>
           
-          
-          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">
-              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
-            </command>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <script>
-            summary = STAXResult[0][1]
-          </script>
-          <call function="'writeMessage'">
-          {'content' : 'Summary %s' % (summary),
-           'fileFd'  : fileFd}
-          </call>
-          
-          
         </sequence>
       </else>
       </if>
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadLib.xml b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadLib.xml
new file mode 100755
index 0000000..af0081c
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadLib.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="addDeleteLoadParser"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client Parser -->
+  <!-- This function must NOT have scope=local has its variables may -->
+  <!-- be used by the caller -->
+  <function name="addDeleteLoadParser">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <script>
+        compilDir = '%s/%s_%s' % \
+                    (client.getPath(),client.getHost(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxOps = cParams[3][1]
+        except IndexError:
+          nbMaxOps = NOT_DEFINED
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 20
+            
+            parms=[]
+            parms.append('-h %s -p %s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+            parms.append('-b "%s"' % baseDn)
+            parms.append('-D "%s" -w "%s"' % \
+                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
+            parms.append('-t %s -d %s' % (nbCnx,duration))
+            if nbMaxOps != NOT_DEFINED:
+              parms.append('-M %s' % nbMaxOps)
+            if attributeName != NOT_DEFINED:
+              parms.append('-a %s' % attributeName)
+            parms = ' '.join(parms)
+      </script>
+    </sequence>
+  </function>
+  
+  
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPostamble.xml b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPostamble.xml
new file mode 100755
index 0000000..d7fd8f5
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPostamble.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="addDeleteLoadPostamble"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client is automatically called by the scheduler and must     -->
+  <!-- always define all the parameters below                       -->
+  <function name="addDeleteLoadPostamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>
+  
+  
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPreamble.xml b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPreamble.xml
new file mode 100755
index 0000000..6136b20
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/clients/addDeleteLoad/addDeleteLoadPreamble.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="addDeleteLoadPreamble"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client is automatically called by the scheduler and must     -->
+  <!-- always define all the parameters below                       -->
+  <function name="addDeleteLoadPreamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'%sParser' % client.getName()">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          
+          <!-- ==== Add execute permission to build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.ksh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s: chmod +x build.ksh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.ksh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          
+          <!-- ==== Build client : run build.ksh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Build client',
+           'fileFd'  : fileFd}
+          </call>
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.ksh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>
+  
+  
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/conf.xml b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/conf.xml
index adc0e4a..7760851 100755
--- a/opendj-sdk/opends/tests/system-tests/scenario/4MMR/conf.xml
+++ b/opendj-sdk/opends/tests/system-tests/scenario/4MMR/conf.xml
@@ -44,7 +44,7 @@
       </description>
     </scenario>
     
-    <opendsZip>NEED_VALUE</opendsZip>
+    <opendsZip>/local/qa/build/OpenDS-1.0.0.zip</opendsZip>
     <!-- Example : <domain>france.sun.com</domain> -->
     <domain></domain>
   </globalParameters>
@@ -53,47 +53,31 @@
   <!-- ================= Instance ============================== -->
   <instance name="I1" product="opends" role="ldapServer">
     <host>localhost</host>
-    <installDir>NEED_VALUE</installDir>
+    <installDir>/local/qa/realtmp/systest/I1</installDir>
     <ports>
       <ldap>5021</ldap>
       <ldaps>5022</ldaps>
       <jmx>5023</jmx>
       <replicationServer>5025</replicationServer>
     </ports>
-    <tuning>
-      <java xms="2g" xmx="2g"
-            xxNewSize="512m" xxMaxNewSize="512m"
-            xxSurvivorRatio="6" xxPermSize="128m"
-            xxMaxPermSize="128m" xxUseConcMarkSweepGC="true"/>
-      <databaseCachePercentage>40</databaseCachePercentage>
-      <replicationPurgeDelay unit="h">4</replicationPurgeDelay>
-    </tuning>
   </instance>
   
   <!-- ================= Instance ============================== -->
   <instance name="I2" product="opends" role="ldapServer">
     <host>localhost</host>
-    <installDir>NEED_VALUE</installDir>
+    <installDir>/local/qa/realtmp/systest/I2</installDir>
     <ports>
       <ldap>6021</ldap>
       <ldaps>6022</ldaps>
       <jmx>6023</jmx>
       <replicationServer>6025</replicationServer>
     </ports>
-    <tuning>
-      <java xms="2g" xmx="2g"
-            xxNewSize="512m" xxMaxNewSize="512m"
-            xxSurvivorRatio="6" xxPermSize="128m"
-            xxMaxPermSize="128m" xxUseConcMarkSweepGC="true"/>
-      <databaseCachePercentage>40</databaseCachePercentage>
-      <replicationPurgeDelay unit="h">4</replicationPurgeDelay>
-    </tuning>
   </instance>
   
   <!-- ================= Instance ============================== -->
-  <instance name="I3" product="opends" role="ldapServer">
+<!--  <instance name="I3" product="opends" role="ldapServer">
     <host>localhost</host>
-    <installDir>NEED_VALUE</installDir>
+    <installDir>NsEED_VALUE</installDir>
     <ports>
       <ldap>7021</ldap>
       <ldaps>7022</ldaps>
@@ -109,11 +93,11 @@
       <replicationPurgeDelay unit="h">4</replicationPurgeDelay>
     </tuning>
   </instance>
-  
+-->  
   <!-- ================= Instance ============================== -->
-  <instance name="I4" product="opends" role="ldapServer">
+<!--  <instance name="I4" product="opends" role="ldapServer">
     <host>localhost</host>
-    <installDir>NEED_VALUE</installDir>
+    <installDir>NsEED_VALUE</installDir>
     <ports>
       <ldap>8021</ldap>
       <ldaps>8022</ldaps>
@@ -129,7 +113,7 @@
       <replicationPurgeDelay unit="h">4</replicationPurgeDelay>
     </tuning>
   </instance>
-  
+  -->
   <!-- ================= Suffix  ============================== -->
   <suffix dn="dc=com">
     
@@ -137,10 +121,10 @@
      	<element instanceName="I1" initRule="importLdif"/>
       <element instanceName="I2" initRule="totalUpdate"
                instanceSourceName="I1"/>
-      <element instanceName="I3" initRule="totalUpdate"
+     <!-- <element instanceName="I3" initRule="totalUpdate"
                instanceSourceName="I1"/>
       <element instanceName="I4" initRule="totalUpdate"
-               instanceSourceName="I1"/>
+               instanceSourceName="I1"/>-->
     </topology>
     
     <tree nbOfEntries="200">
@@ -168,7 +152,7 @@
   <!-- [2] dependencyId is a list of client id ie : 1,2         -->
   <!--     if using it, specify id attribute for each clients   -->
   <scheduler>
-    <duration unit="h">4</duration> 
+    <duration unit="m">2</duration> 
     <!-- 60h : 1% <-> 36 min , 10% <-> 6h -->
     
     
@@ -176,19 +160,28 @@
     <!--== Module 1 ==-->
     <module name="search" enabled="true">
       
-      <client id="1" name="searchLoad" host="localhost" start="t0" stop="t10">
+      <client id="1" name="searchLoad" host="gahia" start="t0" stop="t100">
         <serverInstance>I1</serverInstance>
         <baseDn>dc=com</baseDn>
-        <nbCnx>20</nbCnx>
-        <nbMaxOperations>20</nbMaxOperations>
+        <nbCnx>2</nbCnx>
+        <nbMaxOperations>2</nbMaxOperations>
         <attribute>sn</attribute>
       </client>
-      
+      <client id="2" name="modifyLoad" host="gahia" start="t10" stop="t90">
+        <serverInstance>I1</serverInstance>
+        <baseDn>dc=com</baseDn>
+        <nbCnx>2</nbCnx>
+        <nbMaxOperations>2</nbMaxOperations>
+        <attribute>sn</attribute>
+      </client>
+      <client id="8" name="restartDs" host="localhost" start="t70">
+        <serverInstance>I1</serverInstance>
+      </client>
     </module>
     
     
     <!--== Module 2 ==-->
-    <module name="modify" enabled="true">
+    <module name="modify" enabled="false">
       
       <client id="3" name="modifyLoad" host="localhost" start="t20" stop="t50">
         <serverInstance>I1</serverInstance>
@@ -221,7 +214,7 @@
       
       <client id="7" name="restartDs" host="localhost" start="t70"
                                                        dependencyId="6">
-        <serverInstance>I3</serverInstance>
+        <serverInstance>I1</serverInstance>
       </client>
       
     </module>
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoad.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoad.xml
index 725c265..3c386d5 100755
--- a/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoad.xml
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoad.xml
@@ -35,7 +35,6 @@
   <!-- always define all the parameters below                       -->
   <function name="sampleSearchLoad" scope="local">
     <function-map-args>
-      <function-arg-def name="workingDir" type="required"/>
       <function-arg-def name="client"     type="required"/>
       <function-arg-def name="instances"  type="required"/>
       <function-arg-def name="duration"   type="required"/>
@@ -55,70 +54,20 @@
         msg = ''
       </script>
       
-      <!-- ==================    Preamble   =================== -->
+      <!-- ==================    Parser     =================== -->
       <!-- parse the client parameters :                        -->
       <!-- params is [[param1,val1],[param2,val2],...]          -->
       <!-- get the ldap instance parameters                     -->
-      
-      <script>
-        compilDir = '%s/%s_%s' % (workingDir,client.getHost(),client.getId())
-        
-        #
-        # Extract client parameters from client.getParams()
-        #
-        cParams = client.getParams()
-        try:
-          serverInstanceFromClient = cParams[0][1]
-        except IndexError:
-          serverInstanceFromClient = NOT_DEFINED
-          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
-        try:
-          baseDn = cParams[1][1]
-        except IndexError:
-          baseDn = NOT_DEFINED
-          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
-        try:
-          nbCnx = cParams[2][1]
-        except IndexError:
-          nbCnx = NOT_DEFINED
-          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
-        try:
-          nbMaxSearch = cParams[3][1]
-        except IndexError:
-          nbMaxSearch = NOT_DEFINED
-          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
-        try:
-          attributeName = cParams[4][1]
-        except IndexError:
-          attributeName = NOT_DEFINED
-        
-        #
-        # setup parms to run the client
-        #
-        if serverInstanceFromClient != NOT_DEFINED:
-          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
-          from scheduler import getInstance
-          serverInstance = getInstance(serverInstanceFromClient,instances)
-          if (serverInstance == 'ERROR'):
-            msg = '%s\nERROR: cant find client instance named' % msg
-            msg = '%s %s in server instance list' % \
-                  (msg,serverInstanceFromClient)
-            
-          else:
-            # remove sec, try to finish before timer kill -9 the client
-            duration = duration - 20
-            
-            parms=[]
-            parms.append('-h %s -p %s' % \
-                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
-            parms.append('-b "%s"' % baseDn)
-            parms.append('-D "%s" -w "%s"' % \
-                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
-            parms.append('-t %s -M %s -d %s' % (nbCnx,nbMaxSearch,duration))
-            if attributeName != NOT_DEFINED:
-              parms.append('-a %s' % attributeName)
-            parms = ' '.join(parms)
-      </script>
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'searchLoadParser'">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
       
       <if expr="msg.find('ERROR') != -1">
         <sequence>
@@ -138,78 +87,6 @@
         </sequence>
       <else>
         <sequence>
-          
-          <!-- ==== Add execute permission to build.sh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'chmod',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Add execute permission to build.sh file',
-           'fileFd'  : fileFd}
-          </call>
-          
-          
-          <process name="'%s: chmod +x build.sh' % client.getHost()">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'chmod +x build.sh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          <!-- ==== build client : run build.sh file ==== -->
-          <call function="'writeStartTagOperation'">
-          { 'tagName' : 'build',
-            'fileFd'  : fileFd }
-          </call>
-          <call function="'writeMessage'">
-          {'content' : 'Build client',
-           'fileFd'  : fileFd}
-          </call>
-          
-          
-          <!-- Build Client in unique directory (compilDir), avoid          -->
-          <!-- conflict if same client is run several time at the same time -->
-          <process name="'%s: build %s' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">'./build.sh'</command>
-            <parms/>
-            <workdir>workingDir</workdir>
-            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir]</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <call function="'checkRC'">
-            { 'returncode' : RC,
-              'result'     : STAXResult[0][1],
-              'fileFd'     : fileFd }
-          </call>
-          <if expr="RC != 0">
-            <message>
-              'FAILED to build client %s on %s' % \
-              (client.getName(),client.getHost())
-            </message>
-          </if>
-          <script>
-            errNum += STAXResult
-          </script>
-          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
-          
-          
           <!-- ========== Run the client ========== -->
           <call function="'writeStartTagOperation'">
           { 'tagName' : 'run',
@@ -223,8 +100,9 @@
           </call>
           
           <script>
-            cParam = '-client -Xmx1G -Xms1G'
-            cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
+            cParam = '-client'
+            # cParam = '%s -Xmx1G -Xms1G' % cParam
+            # cParam = '%s -XX:NewRatio=1 -XX:SurvivorRatio=100' % cParam
             cParam = '%s -cp %s/clients/LDAPjdk/ldapjdk.jar' % \
                      (cParam,LOCAL_TESTS_DIR)
             cParam = '%s:%s/search.jar' % (cParam,compilDir)
@@ -234,11 +112,17 @@
                         (client.getHost(),client.getName(),
                          serverInstance.getName())
           </script>
+          <call function="'writeMessage'">
+          { 'fileFd'  : fileFd,
+            'content' : 'cmd : cd %s ; %s/bin/java %s' % \
+                        (client.getPath(),JAVA_HOME,cParam)
+          }
+          </call>
           <process name="'%s' % titleName">
             <location>client.getHost()</location>
             <command>'%s/bin/java' % JAVA_HOME</command>
             <parms>cParam </parms>
-            <workdir>workingDir</workdir>
+            <workdir>client.getPath()</workdir>
             <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME]</envs>
             <stderr mode="'stdout'"/>
             <stdout>outFile</stdout>
@@ -256,31 +140,11 @@
           </script>
           <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
           
-          <!-- ========== Postamble ========== -->
           <call function="'writeMessage'">
           {'content' : 'Output file %s' % outFile,
            'xlink'   : outFile,
            'fileFd'  : fileFd}
           </call>
-          
-          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
-            <location>client.getHost()</location>
-            <command mode="'shell'">
-              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
-            </command>
-            <envs>['PATH=/bin:/usr/bin']</envs>
-            <stderr mode="'stdout'"/>
-            <stdout/>
-            <returnstdout/>
-          </process>
-          <script>
-            summary = STAXResult[0][1]
-          </script>
-          <call function="'writeMessage'">
-          {'content' : 'Summary %s' % (summary),
-           'fileFd'  : fileFd}
-          </call>
-          
         </sequence>
       </else>
       </if>
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadLib.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadLib.xml
new file mode 100755
index 0000000..204ee9d
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadLib.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="sampleSearchLoadParser"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client Parser -->
+  <!-- This function must NOT have scope=local has its variables may -->
+  <!-- be used by the caller -->
+  <function name="sampleSearchLoadParser">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <script>
+        compilDir = '%s/%s_%s' % \
+                    (client.getPath(),client.getHost(),client.getId())
+        
+        #
+        # Extract client parameters from client.getParams()
+        #
+        cParams = client.getParams()
+        try:
+          serverInstanceFromClient = cParams[0][1]
+        except IndexError:
+          serverInstanceFromClient = NOT_DEFINED
+          msg = '%s\nERROR: serverInstanceFromClient undefined,mandatory' % msg
+        try:
+          baseDn = cParams[1][1]
+        except IndexError:
+          baseDn = NOT_DEFINED
+          msg = '%s\nERROR: baseDn undefined,mandatory' % msg
+        try:
+          nbCnx = cParams[2][1]
+        except IndexError:
+          nbCnx = NOT_DEFINED
+          msg = '%s\nERROR: nbCnx undefined,mandatory' % msg
+        try:
+          nbMaxSearch = cParams[3][1]
+        except IndexError:
+          nbMaxSearch = NOT_DEFINED
+          msg = '%s\nERROR: nbMaxOperations undefined,mandatory' % msg
+        try:
+          attributeName = cParams[4][1]
+        except IndexError:
+          attributeName = NOT_DEFINED
+        
+        #
+        # setup parms to run the client
+        #
+        if serverInstanceFromClient != NOT_DEFINED:
+          sys.path.append("%s/phases/scheduler" % TESTS_DIR )
+          from scheduler import getInstance
+          serverInstance = getInstance(serverInstanceFromClient,instances)
+          if (serverInstance == 'ERROR'):
+            msg = '%s\nERROR: cant find client instance named' % msg
+            msg = '%s %s in server instance list' % \
+                  (msg,serverInstanceFromClient)
+            
+          else:
+            # remove sec, try to finish before timer kill -9 the client
+            duration = duration - 20
+            
+            parms=[]
+            parms.append('-h %s -p %s' % \
+                       (serverInstance.getHost(),serverInstance.getLDAPPort()))
+            parms.append('-b "%s"' % baseDn)
+            parms.append('-D "%s" -w "%s"' % \
+                        (DIRECTORY_INSTANCE_DN,DIRECTORY_INSTANCE_PSWD))
+            parms.append('-t %s -M %s -d %s' % (nbCnx,nbMaxSearch,duration))
+            if attributeName != NOT_DEFINED:
+              parms.append('-a %s' % attributeName)
+            parms = ' '.join(parms)
+      </script>
+    </sequence>
+  </function>
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPostamble.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPostamble.xml
new file mode 100755
index 0000000..3c3c6b9
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPostamble.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="sampleSearchLoadPostamble"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client is automatically called by the scheduler and must     -->
+  <!-- always define all the parameters below                       -->
+  <function name="sampleSearchLoadPostamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'searchLoadParser'">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          <process name="'%s:%s: Grep' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">
+              "grep 'TOTAL' %s | cut -d ' ' -f3-" % outFile
+            </command>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <script>
+            summary = STAXResult[0][1]
+          </script>
+          <call function="'writeMessage'">
+          {'content' : 'Summary %s' % (summary),
+           'fileFd'  : fileFd}
+          </call>
+          
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>
+  
+  
+  
+</stax>
+
diff --git a/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPreamble.xml b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPreamble.xml
new file mode 100755
index 0000000..80e6a3c
--- /dev/null
+++ b/opendj-sdk/opends/tests/system-tests/scenario/sample2/clients/sampleSearchLoad/sampleSearchLoadPreamble.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../../shared/stax.dtd">
+<!--
+ ! 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 2008 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="sampleSearchLoadPreamble"/>
+
+
+  <!-- ************************************************************ -->
+  <!-- Client is automatically called by the scheduler and must     -->
+  <!-- always define all the parameters below                       -->
+  <function name="sampleSearchLoadPreamble" scope="local">
+    <function-map-args>
+      <function-arg-def name="client"     type="required"/>
+      <function-arg-def name="instances"  type="required"/>
+      <function-arg-def name="duration"   type="required"/>
+      <function-arg-def name="suffix"     type="required"/>
+      <function-arg-def name="outFile"    type="required"/>
+      <function-arg-def name="fileFd"     type="required"/>
+    </function-map-args>
+    
+    <sequence>
+      <!-- ===================   Comments   =================== -->
+      <!-- client is run under paralleliterate tag              -->
+      <!-- each variables defined are internal                  -->
+      <!-- client should have its own err_num variable in order -->
+      <!-- to inform scheduler if it has pass/fail status       -->
+      <script>
+        errNum = 0
+        msg = ''
+      </script>
+      
+      <!-- ==================    Parser     =================== -->
+      <!-- parse the client parameters :                        -->
+      <!-- params is [[param1,val1],[param2,val2],...]          -->
+      <!-- get the ldap instance parameters                     -->
+      <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+              file="'%s/%sLib.xml' % (client.getPath(),client.getName())"/>
+      <call function="'searchLoadParser'">
+      {
+        'client'     : client,
+        'instances'  : instances,
+        'duration'   : duration,
+        'suffix'     : suffix
+      }
+      </call>
+      <if expr="msg.find('ERROR') != -1">
+        <sequence>
+          <message>'%s' % msg</message>
+          <call function="'writeOperationResult'">
+            {
+              'returncode' : '1',
+              'expected'   : '0',
+              'result'     : msg,
+              'status'     : 'ERROR',
+              'fileFd'     : fileFd
+            }
+          </call>
+          <script>
+            errNum += 1
+          </script>
+        </sequence>
+      <else>
+        <sequence>
+          
+          <!-- ==== Add execute permission to build.sh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'chmod',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Add execute permission to build.sh file',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <process name="'%s: chmod +x build.sh' % client.getHost()">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'chmod +x build.sh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=/bin:/usr/bin']</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+          <!-- ==== build client : run build.sh file ==== -->
+          <call function="'writeStartTagOperation'">
+          { 'tagName' : 'build',
+            'fileFd'  : fileFd }
+          </call>
+          <call function="'writeMessage'">
+          {'content' : 'Build client',
+           'fileFd'  : fileFd}
+          </call>
+          
+          
+          <!-- Build Client in unique directory (compilDir), avoid          -->
+          <!-- conflict if same client is run several time at the same time -->
+          <process name="'%s: build %s' % (client.getHost(),client.getName())">
+            <location>client.getHost()</location>
+            <command mode="'shell'">'./build.sh'</command>
+            <parms/>
+            <workdir>client.getPath()</workdir>
+            <envs>['PATH=%s/bin:/bin:/usr/bin' % JAVA_HOME,'COMPILDIR=%s' % compilDir]</envs>
+            <stderr mode="'stdout'"/>
+            <stdout/>
+            <returnstdout/>
+          </process>
+          <call function="'checkRC'">
+            { 'returncode' : RC,
+              'result'     : STAXResult[0][1],
+              'fileFd'     : fileFd }
+          </call>
+          <if expr="RC != 0">
+            <message>
+              'FAILED to build client %s on %s' % \
+              (client.getName(),client.getHost())
+            </message>
+          </if>
+          <script>
+            errNum += STAXResult
+          </script>
+          <call function="'writeEndTagOperation'">{'fileFd'  : fileFd}</call>
+          
+        </sequence>
+      </else>
+      </if>
+      
+      <return> errNum </return>
+      
+    </sequence>
+    
+  </function>
+  
+  
+  
+</stax>
+

--
Gitblit v1.10.0