You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2010/03/31 09:57:02 UTC

svn commit: r929423 - in /incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository: ObjGenApp.java ObjectGenerator.java TimeLogger.java

Author: jens
Date: Wed Mar 31 07:57:01 2010
New Revision: 929423

URL: http://svn.apache.org/viewvc?rev=929423&view=rev
Log:
CMIS-183: 
Add option to create folders in ObjectGenerator
Add option to execute commands multi-threaded

Modified:
    incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java
    incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjectGenerator.java
    incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java

Modified: incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java?rev=929423&r1=929422&r2=929423&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java Wed Mar 31 07:57:01 2010
@@ -36,9 +36,6 @@ import org.apache.opencmis.commons.Sessi
 import org.apache.opencmis.commons.enums.BaseObjectTypeIds;
 import org.apache.opencmis.commons.exceptions.CmisBaseException;
 import org.apache.opencmis.commons.provider.CmisProvider;
-import org.apache.opencmis.commons.provider.NavigationService;
-import org.apache.opencmis.commons.provider.ObjectService;
-import org.apache.opencmis.commons.provider.ProviderObjectFactory;
 import org.apache.opencmis.commons.provider.RepositoryInfoData;
 import org.apache.opencmis.commons.provider.RepositoryService;
 
@@ -48,7 +45,7 @@ public class ObjGenApp {
   public static final String PROP_ATOMPUB_URL = "opencmis.test.atompub.url";
   public static final String PROP_URL = "url";
   public static final String PROP_WS_URL = "opencmis.test.webservices.url";
-  public static final String DEFAULT_ATOMPUB_URL = "http://localhost:8080/opencmis/atom"; 
+  public static final String DEFAULT_ATOMPUB_URL = "http://localhost:8080/opencmis/atom";
   public static final String DEFAULT_WS_URL = "http://localhost:8080/cmis/services/";
 
   private final static String CMD = "Command";
@@ -63,15 +60,15 @@ public class ObjGenApp {
   private final static String BINDING = "Binding";
   private final static String CLEANUP = "Cleanup";
   private final static String ROOTFOLDER = "RootFolder";
-  
+  private final static String THREADS = "Threads";
+
   private final static String BINDING_ATOM = "AtomPub";
   private final static String BINDING_WS = "WebService";
 
   private CmisProvider fProvider;
-  private boolean fUsingAtom; 
+  private boolean fUsingAtom;
   private String fUrlStr;
-  private boolean fDoCleanup;
-  
+
   OptionSpec<String> fCmd;
   OptionSpec<Integer> fDepth;
   OptionSpec<Integer> fContentSize;
@@ -84,8 +81,8 @@ public class ObjGenApp {
   OptionSpec<String> fBinding;
   OptionSpec<Boolean> fCleanup;
   OptionSpec<String> fRootFolder;
-  
-  
+  OptionSpec<Integer> fThreads;
+
   public static void main(String[] args) {
 
     ObjGenApp app = new ObjGenApp();
@@ -106,80 +103,83 @@ public class ObjGenApp {
   private void processCmdLine(String[] args) {
 
     OptionParser parser = new OptionParser();
-    fCmd = parser.accepts(CMD).withRequiredArg()
-      .describedAs("Command to perform (see below)");
-    fRepoId = parser.accepts(REPOSITORY_ID).withOptionalArg()
-      .describedAs("Repository used");
+    fCmd = parser.accepts(CMD).withRequiredArg().describedAs("Command to perform (see below)");
+    fRepoId = parser.accepts(REPOSITORY_ID).withOptionalArg().describedAs("Repository used");
     fDocType = parser.accepts(FILLER_DOCUMENT_TYPE_ID).withOptionalArg().defaultsTo(
-        BaseObjectTypeIds.CMIS_DOCUMENT.value())
-      .describedAs("Document type created");
+        BaseObjectTypeIds.CMIS_DOCUMENT.value()).describedAs("Document type created");
     fFolderType = parser.accepts(FILLER_FOLDER_TYPE_ID).withOptionalArg().defaultsTo(
-        BaseObjectTypeIds.CMIS_FOLDER.value())
-        .describedAs("Folder type created");
+        BaseObjectTypeIds.CMIS_FOLDER.value()).describedAs("Folder type created");
     fDocsPerFolder = parser.accepts(FILLER_DOCS_PER_FOLDER).withOptionalArg().ofType(Integer.class)
-      .describedAs("Documents on each level").defaultsTo(1);
+        .describedAs("Documents on each level").defaultsTo(1);
     fFolderPerFolder = parser.accepts(FILLER_FOLDERS_PER_FOLDER).withOptionalArg().ofType(
         Integer.class).describedAs(" Folders on each level").defaultsTo(0);
-    fDepth = parser.accepts(FILLER_DEPTH).withOptionalArg().ofType(Integer.class)
-      .describedAs("Levels of folders").defaultsTo(1);
+    fDepth = parser.accepts(FILLER_DEPTH).withOptionalArg().ofType(Integer.class).describedAs(
+        "Levels of folders").defaultsTo(1);
     fContentSize = parser.accepts(FILLER_CONTENT_SIZE).withOptionalArg().ofType(Integer.class)
-      .describedAs("Content size of each doc").defaultsTo(0);
+        .describedAs("Content size of each doc").defaultsTo(0);
     fCount = parser.accepts(COUNT).withOptionalArg().ofType(Integer.class).defaultsTo(1)
-        .describedAs("Repeat a command n times (not yet implemented)");
-    fBinding = parser.accepts(BINDING).withOptionalArg().ofType(String.class).defaultsTo(BINDING_ATOM)
-      .describedAs("Protocol Binding: " + BINDING_ATOM + " or " + BINDING_WS);
+        .describedAs("Repeat a command n times (partially implemented)");
+    fBinding = parser.accepts(BINDING).withOptionalArg().ofType(String.class).defaultsTo(
+        BINDING_ATOM).describedAs("Protocol Binding: " + BINDING_ATOM + " or " + BINDING_WS);
     fCleanup = parser.accepts(CLEANUP).withOptionalArg().ofType(Boolean.class).defaultsTo(false)
-    .describedAs("Clean all created objects at the end");
-    fRootFolder = parser.accepts(ROOTFOLDER).withOptionalArg().ofType(String.class)
-      .describedAs("folder id used as root to create objects (default repository root folder)");
-    
+        .describedAs("Clean all created objects at the end");
+    fRootFolder = parser.accepts(ROOTFOLDER).withOptionalArg().ofType(String.class).describedAs(
+        "folder id used as root to create objects (default repository root folder)");
+    fThreads = parser.accepts(THREADS).withOptionalArg().ofType(Integer.class).defaultsTo(1)
+        .describedAs("Number of threads to start in parallel");
+
     OptionSet options = parser.parse(args);
 
     if (options.valueOf(fCmd) == null || options.has("?"))
       usage(parser);
-    
+
     if (options.valueOf(fBinding).equals(BINDING_WS)) {
-      System.out.println("Using Web Service binding.");
       fUsingAtom = false;
-    } else if (options.valueOf(fBinding).equals(BINDING_ATOM)) {
-      System.out.println("Using AtomPub binding.");
+    }
+    else if (options.valueOf(fBinding).equals(BINDING_ATOM)) {
       fUsingAtom = true;
-    } else {
+    }
+    else {
       System.out.println("Unknown option <Binding>: " + options.valueOf(fBinding)
           + " allowed values: " + BINDING_WS + " or " + BINDING_ATOM);
       return;
     }
 
-    fDoCleanup = options.valueOf(fCleanup);
-    
     if (options.valueOf(fCmd).equals("FillRepository")) {
       fillRepository(options);
-    } else if (options.valueOf(fCmd).equals("CreateDocument")) {
+    }
+    else if (options.valueOf(fCmd).equals("CreateDocument")) {
       createSingleDocument(options);
-    } else if (options.valueOf(fCmd).equals("RepositoryInfo")) {
+    }
+    else if (options.valueOf(fCmd).equals("CreateFolder")) {
+      createFolders(options);
+    }
+    else if (options.valueOf(fCmd).equals("RepositoryInfo")) {
       repositoryInfo(options);
-    } else if (options.valueOf(fCmd).equals("GetUrl")) {
+    }
+    else if (options.valueOf(fCmd).equals("GetUrl")) {
       getUrl(getConfiguredUrl());
-    } else {
+    }
+    else {
       System.out.println("Unknown cmd: " + options.valueOf(fCmd));
       usage(parser);
     }
   }
 
-//  private void preInitExpensiveTasks() {
-//    // JAXB initialization is very expensive, count this separate:
-//    TimeLogger logger = new TimeLogger("Initialization");
-//    logger.start();
-//    try {
-//      JaxBHelper.createMarshaller();
-//    }
-//    catch (JAXBException e) {
-//      System.out.print("Failuer in JAXB init: " + e);
-//      e.printStackTrace();
-//    } // dummy call just to get initialized
-//    logger.stop();
-//    logger.printTimes();    
-//  }
+  // private void preInitExpensiveTasks() {
+  // // JAXB initialization is very expensive, count this separate:
+  // TimeLogger logger = new TimeLogger("Initialization");
+  // logger.start();
+  // try {
+  // JaxBHelper.createMarshaller();
+  // }
+  // catch (JAXBException e) {
+  // System.out.print("Failuer in JAXB init: " + e);
+  // e.printStackTrace();
+  // } // dummy call just to get initialized
+  // logger.stop();
+  // logger.printTimes();
+  // }
 
   private void usage(OptionParser parser) {
     try {
@@ -188,13 +188,17 @@ public class ObjGenApp {
       System.out.println("Usage:");
       parser.printHelpOn(System.out);
       System.out.println();
-      System.out.println("Command is one of [CreateDocument, FillRepository, RepositoryInfo]");
+      System.out
+          .println("Command is one of [CreateDocument, CreateFolder, FillRepository, RepositoryInfo]");
       System.out.println("JVM system properties: " + PROP_ATOMPUB_URL + ", " + PROP_WS_URL);
       System.out.println();
       System.out.println("Example: ");
-      System.out.println("java -D" + PROP_ATOMPUB_URL + "=http://localhost:8080/opencmis/atom -cp ... " +
-          "org.apache.opencmis.util.repository.ObjGenApp --Binding=AtomPub --Command=CreateDocument " +
-          "--RepositoryId=A1 --ContentSizeInKB=25");
+      System.out
+          .println("java -D"
+              + PROP_ATOMPUB_URL
+              + "=http://localhost:8080/opencmis/atom -cp ... "
+              + "org.apache.opencmis.util.repository.ObjGenApp --Binding=AtomPub --Command=CreateDocument "
+              + "--RepositoryId=A1 --ContentSizeInKB=25");
       return;
     }
     catch (IOException e) {
@@ -202,33 +206,16 @@ public class ObjGenApp {
     }
   }
 
-
   private void fillRepository(String repoId, int docsPerFolder, int foldersPerFolders, int depth,
-      String documentType, String folderType, int contentSizeInKB, String rootFolderId) {
-
-    ProviderObjectFactory objectFactory = getObjectFactory();
-    NavigationService navSvc = getProvider().getNavigationService();
-    ObjectService objSvc = getProvider().getObjectService();
-    RepositoryService repSvc = getProvider().getRepositoryService();
+      String documentType, String folderType, int contentSizeInKB, String rootFolderId,
+      boolean doCleanup) {
 
-    ObjectGenerator gen = new ObjectGenerator(objectFactory, navSvc, objSvc, repoId);
-    gen.setUseUuidsForNames(true);
-    gen.setNumberOfDocumentsToCreatePerFolder(docsPerFolder);
-    // Set the type id for all created documents:
-    gen.setDocumentTypeId(documentType);
-    // Set the type id for all created folders:
-    gen.setFolderTypeId(folderType);
-    // Set contentSize
-    gen.setContentSizeInKB(contentSizeInKB);
-    gen.setCleanUpAfterCreate(fDoCleanup);
-
-    // Build the tree
-    RepositoryInfoData rep = repSvc.getRepositoryInfo(repoId, null);
-    if (null == rootFolderId || rootFolderId.length() == 0)
-      rootFolderId = rep.getRootFolderId();
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner runner = MultiThreadedObjectGenerator
+        .prepareForCreateTree(getProvider(), repoId, docsPerFolder, foldersPerFolders, depth,
+            documentType, folderType, contentSizeInKB, rootFolderId, doCleanup);
+    ObjectGenerator gen = runner.getObjectGenerator();
+    runner.doCreateTree();
 
-    gen.resetCounters();
-    gen.createFolderHierachy(depth, foldersPerFolders, rootFolderId);
     System.out.println();
     System.out.println("Result:");
     System.out.println("Filling repository succeeded.");
@@ -238,67 +225,151 @@ public class ObjGenApp {
     gen.printTimings();
   }
 
-  private void printParameters(OptionSet options) {    
+  private void fillRepositoryMT(int noThreads, String repoId, int docsPerFolder,
+      int foldersPerFolders, int depth, String documentType, String folderType,
+      int contentSizeInKB, String rootFolderId, boolean doCleanup) {
+
+    // Step 1: create a root folder for each thread
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner runner = MultiThreadedObjectGenerator
+        .prepareForCreateFolder(getProvider(), repoId, folderType, rootFolderId, noThreads,
+            doCleanup);
+    String[] folderIds = runner.doCreateFolder();
+
+    // Step 2: fill each root folder with an object tree
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner[] runners = MultiThreadedObjectGenerator
+        .prepareForCreateTreeMT(getProvider(), repoId, docsPerFolder, foldersPerFolders, depth,
+            documentType, folderType, contentSizeInKB, folderIds, doCleanup);
+
+    MultiThreadedObjectGenerator.runMultiThreaded(runners);
+    System.out.println("Filling repository succeeded.");
+  }
+
+  private void printParameters(OptionSet options) {
     if (fUsingAtom)
-      System.out.println("Connecting to  " + getAtomPubUrl());
+      System.out.println("Using AtomPub, connecting to  " + getAtomPubUrl());
     else
-      System.out.println("Connecting to  " + getWsUrl());
-      
+      System.out.println("Using WebService, connecting to  " + getWsUrl());
+
     System.out.println("Repository id is: " + options.valueOf(fRepoId));
     System.out.println("Content size: " + options.valueOf(fContentSize));
     System.out.println("Document Type: " + options.valueOf(fDocType));
-    System.out.println("Folder used as root: " + options.valueOf(fRootFolder));
-    System.out.println("Delete all objects after creation: " + fDoCleanup);
+    System.out.println("Folder id used as root: " + options.valueOf(fRootFolder));
+    System.out.println("Delete all objects after creation: " + options.valueOf(fCleanup));
+    System.out.println("Number of threads to start: " + options.valueOf(fThreads));
   }
-  
+
   private void createSingleDocument(OptionSet options) {
     System.out.println();
     System.out.println("Creating document with parameters:");
     printParameters(options);
-    createSingleDocument(options.valueOf(fRepoId), options.valueOf(fContentSize), options.valueOf(fRootFolder));
+    int noThreads = options.valueOf(fThreads);
+    if (noThreads <= 1)
+      createSingleDocument(options.valueOf(fRepoId), options.valueOf(fDocType), options
+          .valueOf(fContentSize), options.valueOf(fRootFolder), options.valueOf(fCount), options
+          .valueOf(fCleanup));
+    else
+      createSingleDocumentMT(noThreads, options.valueOf(fRepoId), options.valueOf(fDocType),
+          options.valueOf(fContentSize), options.valueOf(fRootFolder), options.valueOf(fCount),
+          options.valueOf(fCleanup));
   }
-  
+
   private void fillRepository(OptionSet options) {
     System.out.println();
+    printParameters(options);
     System.out.println("Creating object tree with folowing parameters: ");
     System.out.println("Documents per folder: " + options.valueOf(fDocsPerFolder));
     System.out.println("Folder per folder: " + options.valueOf(fFolderPerFolder));
     System.out.println("Depth: " + options.valueOf(fDepth));
     System.out.println("Folder Type: " + options.valueOf(fFolderType));
-    printParameters(options);
 
-    fillRepository(options.valueOf(fRepoId), options.valueOf(fDocsPerFolder), options
-        .valueOf(fFolderPerFolder), options.valueOf(fDepth), options.valueOf(fDocType), options
-        .valueOf(fFolderType), options.valueOf(fContentSize), options.valueOf(fRootFolder));
+    int noThreads = options.valueOf(fThreads);
+    if (noThreads <= 1)
+      fillRepository(options.valueOf(fRepoId), options.valueOf(fDocsPerFolder), options
+          .valueOf(fFolderPerFolder), options.valueOf(fDepth), options.valueOf(fDocType), options
+          .valueOf(fFolderType), options.valueOf(fContentSize), options.valueOf(fRootFolder),
+          options.valueOf(fCleanup));
+    else
+      fillRepositoryMT(noThreads, options.valueOf(fRepoId), options.valueOf(fDocsPerFolder),
+          options.valueOf(fFolderPerFolder), options.valueOf(fDepth), options.valueOf(fDocType),
+          options.valueOf(fFolderType), options.valueOf(fContentSize),
+          options.valueOf(fRootFolder), options.valueOf(fCleanup));
+
   }
 
-  private void createSingleDocument(String repoId, int contentSizeInKB, String rootFolderId) {
+  private void createFolders(OptionSet options) {
+    int noThreads = options.valueOf(fThreads);
+    if (noThreads <= 1)
+      createFolders(options.valueOf(fRepoId), options.valueOf(fFolderType), options
+          .valueOf(fRootFolder), options.valueOf(fCount), options.valueOf(fCleanup));
+    else
+      createFoldersMT(noThreads, options.valueOf(fRepoId), options.valueOf(fFolderType), options
+          .valueOf(fRootFolder), options.valueOf(fCount), options.valueOf(fCleanup));
+  }
 
-    ProviderObjectFactory objectFactory = getObjectFactory();
-    NavigationService navSvc = getProvider().getNavigationService();
-    ObjectService objSvc = getProvider().getObjectService();
-    RepositoryService repSvc = getProvider().getRepositoryService();
-    ObjectGenerator gen = new ObjectGenerator(objectFactory, navSvc, objSvc, repoId);
-    TimeLogger timeLogger = new TimeLogger("Initialize");
-    timeLogger.start();
-    RepositoryInfoData rep = repSvc.getRepositoryInfo(repoId, null);
-    timeLogger.stop();
-    timeLogger.printTimes();
-    if (null == rootFolderId || rootFolderId.length() == 0)
-      rootFolderId = rep.getRootFolderId();
-    gen.setContentSizeInKB(contentSizeInKB);
-    gen.setUseUuidsForNames(true);
-    gen.setCleanUpAfterCreate(fDoCleanup);
-    String id = gen.createSingleDocument(rootFolderId);
+  private void createSingleDocument(String repoId, String documentType, int contentSizeInKB,
+      String rootFolderId, int docCount, boolean doCleanup) {
+
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner runner = MultiThreadedObjectGenerator
+        .prepareForCreateDocument(getProvider(), repoId, documentType, contentSizeInKB,
+            rootFolderId, docCount, doCleanup);
+    ObjectGenerator gen = runner.getObjectGenerator();
+    String[] ids = runner.doCreateDocument();
     System.out.println();
     System.out.println("Result:");
     System.out.println("Document creation succeeded.");
     System.out.println("Folder used as root for creation: " + rootFolderId);
-    System.out.println("Id of created document: " + id);
+    System.out.println("Ids of created documents: ");
+    if (null == ids)
+      System.out.println("<none>");
+    else
+      for (int i = 0; i < ids.length; i++)
+        System.out.println(ids[i]);
     gen.printTimings();
     gen.resetCounters();
   }
 
+  private void createSingleDocumentMT(int noThreads, String repoId, String documentType,
+      int contentSizeInKB, String rootFolderId, int docCount, boolean doCleanup) {
+
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner[] runners = MultiThreadedObjectGenerator
+        .prepareForCreateDocumentMT(noThreads, getProvider(), repoId, documentType,
+            contentSizeInKB, rootFolderId, docCount, doCleanup);
+
+    MultiThreadedObjectGenerator.runMultiThreaded(runners);
+    System.out.println("Document creation succeeded. All threads terminated.");
+  }
+
+  private void createFolders(String repoId, String folderType, String rootFolderId, int noFolders,
+      boolean doCleanup) {
+
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner runner = MultiThreadedObjectGenerator
+        .prepareForCreateFolder(getProvider(), repoId, folderType, rootFolderId, noFolders,
+            doCleanup);
+    ObjectGenerator gen = runner.getObjectGenerator();
+    String[] ids = runner.doCreateFolder();
+    System.out.println();
+    System.out.println("Result:");
+    System.out.println("Folder creation succeeded.");
+    System.out.println("Ids of created folders: ");
+    if (null == ids)
+      System.out.println("<none>");
+    else
+      for (int i = 0; i < ids.length; i++)
+        System.out.println(ids[i]);
+    gen.printTimings();
+    gen.resetCounters();
+  }
+
+  private void createFoldersMT(int noThreads, String repoId, String folderType,
+      String rootFolderId, int noFolders, boolean doCleanup) {
+
+    MultiThreadedObjectGenerator.ObjectGeneratorRunner[] runners = MultiThreadedObjectGenerator
+        .prepareForCreateFolderMT(noThreads, getProvider(), repoId, folderType, rootFolderId,
+            noFolders, doCleanup);
+    MultiThreadedObjectGenerator.runMultiThreaded(runners);
+    System.out.println("Folder creation succeeded.");
+  }
+
   private void callRepoInfo(String repositoryId, int count) {
     RepositoryService repSvc = getProvider().getRepositoryService();
     TimeLogger timeLogger = new TimeLogger("RepoInfoTest");
@@ -309,7 +380,8 @@ public class ObjGenApp {
       repoInfo = repSvc.getRepositoryInfo(repositoryId, null);
       timeLogger.stop();
     }
-    System.out.println("Root Folder id is: " + (repoInfo==null ? "<unknown>" : repoInfo.getRootFolderId()) );
+    System.out.println("Root Folder id is: "
+        + (repoInfo == null ? "<unknown>" : repoInfo.getRootFolderId()));
     timeLogger.printTimes();
   }
 
@@ -317,10 +389,6 @@ public class ObjGenApp {
     callRepoInfo(options.valueOf(fRepoId), options.valueOf(fCount));
   }
 
-  private ProviderObjectFactory getObjectFactory() {
-    return getProvider().getObjectFactory();
-  }
-
   private CmisProvider getProvider() {
     if (fProvider == null) {
       if (fUsingAtom)
@@ -332,14 +400,14 @@ public class ObjGenApp {
   }
 
   private static void filLoginParams(Map<String, String> parameters, String user, String password) {
-    if (user != null && !user.isEmpty())
+    if (user != null && user.length() > 0)
       parameters.put(SessionParameter.USER, user);
-    if (user != null && !user.isEmpty())
-      parameters.put(SessionParameter.PASSWORD, password);    
+    if (user != null && user.length() > 0)
+      parameters.put(SessionParameter.PASSWORD, password);
   }
-  
+
   private static CmisProvider createAtomProvider(String url, String user, String password) {
-    
+
     // gather parameters
     Map<String, String> parameters = new HashMap<String, String>();
     filLoginParams(parameters, user, password);
@@ -410,7 +478,6 @@ public class ObjGenApp {
     return provider;
   }
 
-    
   private String getAtomPubUrl() {
     return System.getProperty(PROP_ATOMPUB_URL, DEFAULT_ATOMPUB_URL);
   }
@@ -450,5 +517,4 @@ public class ObjGenApp {
     }
   }
 
-  
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjectGenerator.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjectGenerator.java?rev=929423&r1=929422&r2=929423&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjectGenerator.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjectGenerator.java Wed Mar 31 07:57:01 2010
@@ -173,6 +173,18 @@ public class ObjectGenerator {
     fCleanup = doCleanup;
   }
   
+  public TimeLogger getCreateDocumentTimeLogger() {
+    return fTimeLoggerCreateDoc;
+  }
+  
+  public TimeLogger getCreateFolderTimeLogger() {
+    return fTimeLoggerCreateFolder;
+  }
+
+  public TimeLogger getDeleteTimeLogger() {
+    return fTimeLoggerDelete;
+  }
+  
   public void createFolderHierachy(int levels, int childrenPerLevel, String rootFolderId) {
     resetCounters();
     fTimeLoggerCreateDoc.reset();
@@ -276,6 +288,45 @@ public class ObjectGenerator {
     return objectId;
   }
 	  
+  public String[] createDocuments(String folderId, int count) {
+    
+    String result[];
+    
+    fTimeLoggerCreateDoc.reset();
+    for (int i=0; i<count; i++) {
+      String id = createDocument(folderId, 0, 0);
+      fTopLevelDocsCreated.add(id);
+    }
+    if (fCleanup) {
+      deleteTree();
+      result = null;
+    } else {
+      result = new String[count];
+      for (int i=0; i<fTopLevelDocsCreated.size(); i++) 
+        result[i] = fTopLevelDocsCreated.get(i);
+    }
+    return result;
+  }
+
+  public String[] createFolders(String folderId, int count) {
+    
+    String result[];
+    
+    fTimeLoggerCreateFolder.reset();
+    for (int i=0; i<count; i++) {
+      createFolder(folderId);
+    }
+    if (fCleanup) {
+      deleteTree();
+      result = null;
+    } else {
+      result = new String[count];
+      for (int i=0; i<fTopLevelFoldersCreated.size(); i++) 
+        result[i] = fTopLevelFoldersCreated.get(i);
+    }
+    return result;
+  }
+    
   public void resetCounters() {
     fDocumentsInTotalCount = fFoldersInTotalCount = 0;
   }
@@ -326,6 +377,19 @@ public class ObjectGenerator {
     }
   }
 
+  private String createFolder(String parentId) {
+    PropertiesData props = createFolderProperties(0, 0);
+    String id = null;
+    try {
+      fTimeLoggerCreateFolder.start();
+      id = fObjSvc.createFolder(fRepositoryId, props, parentId, null, null, null, null);
+      fTopLevelFoldersCreated.add(id);
+    } finally {
+      fTimeLoggerCreateFolder.stop();
+    }
+    return id;
+  }
+
   private String createDocument(String folderId, int no, int level) {
     ContentStreamData contentStream = null;
     VersioningState versioningState = VersioningState.NONE;

Modified: incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java?rev=929423&r1=929422&r2=929423&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java Wed Mar 31 07:57:01 2010
@@ -161,4 +161,97 @@ public class TimeLogger {
     return sum; 
   }
 
+  ////////////////////////////////////////////////////////////////////////////////////
+  //
+  // Same methods used for multithreaded logging
+  
+  public static void logTimes(TimeLogger[] loggers) {
+    long size=0;    
+    if (null == loggers)
+      return;
+    
+    for (int i=0; i<loggers.length; i++)
+      size += loggers[i].fTimeRecs.size();
+    
+    LOG.info("Timings for " + size + " samples for action " + loggers[0].fAction + ": ");
+    LOG.info("  Average: " + getAverageTime(loggers) + "ms");
+    LOG.info("  Min    : " + getMinTime(loggers) + "ms");
+    LOG.info("  Max    : " + getMaxTime(loggers) + "ms");
+    LOG.info("  Total  : " + getTotalTime(loggers) + "ms");
+  }
+  
+  public static void printTimes(TimeLogger[] loggers) {
+    long size=0;    
+    if (null == loggers)
+      return;
+    
+    for (int i=0; i<loggers.length; i++)
+      size += loggers[i].fTimeRecs.size();
+    
+    System.out.println("Timings for " + size + " samples for action " + loggers[0].fAction + ": ");
+    System.out.println("  Average: " + getAverageTime(loggers) + "ms");
+    System.out.println("  Min    : " + getMinTime(loggers) + "ms");
+    System.out.println("  Max    : " + getMaxTime(loggers) + "ms");
+    System.out.println("  Total  : " + getTotalTime(loggers) + "ms");
+
+  }
+  
+  static private long getAverageTime(TimeLogger[] loggers) {
+    long sum = 0;
+    long size=0;
+    
+    for (int i=0; i<loggers.length; i++)
+      size += loggers[i].fTimeRecs.size();
+    
+    if (size==0)
+      return 0;
+    
+    for (int i=0; i<loggers.length; i++) {
+      if (0 == loggers[i].fTimeRecs.size())
+        continue;
+      
+      for (TimeRecord tm : loggers[i].fTimeRecs) {
+        sum += tm.fStop - tm.fStart;
+      }
+    }
+    
+    return (sum + size/2) / size; 
+  }
+  
+  static private long getMaxTime(TimeLogger[] loggers) {
+    long max = Long.MIN_VALUE;
+
+    for (int i=0; i<loggers.length; i++) {
+      long val = loggers[i].getMaxTime();
+      if (val > max)
+        max = val;
+    }
+
+    return max; 
+  }
+
+  static private long getMinTime(TimeLogger[] loggers) {
+    long min = Long.MAX_VALUE;
+    
+    for (int i=0; i<loggers.length; i++) {
+      long val = loggers[i].getMinTime();
+      if (val < min)
+        min = val;
+    }
+    
+    return min; 
+  }
+ 
+  static private long getTotalTime(TimeLogger[] loggers) {
+    long totalTime = Long.MIN_VALUE;
+
+    for (int i=0; i<loggers.length; i++) {
+      long val = loggers[i].getTotalTime();
+      if (val > totalTime)
+        totalTime = val;
+    }
+
+    return totalTime; 
+  }
+  
 }