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:58:19 UTC

svn commit: r929424 - /incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/MultiThreadedObjectGenerator.java

Author: jens
Date: Wed Mar 31 07:58:19 2010
New Revision: 929424

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

Added:
    incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/MultiThreadedObjectGenerator.java

Added: incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/MultiThreadedObjectGenerator.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/MultiThreadedObjectGenerator.java?rev=929424&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/MultiThreadedObjectGenerator.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/MultiThreadedObjectGenerator.java Wed Mar 31 07:58:19 2010
@@ -0,0 +1,232 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.opencmis.util.repository;
+
+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;
+
+public class MultiThreadedObjectGenerator {
+  
+  static public enum Action { CreateDocument, CreateTree, CreateFolders };
+
+  static class ObjectGeneratorRunner implements Runnable {
+    private Action fAction;
+    ObjectGenerator fObjGen;
+    private String fRootFolderId;
+    private int fFoldersPerFolders;
+    private int fDepth;
+    private int fCount;
+    
+    public ObjectGeneratorRunner(ObjectGenerator objGen, Action action) {
+      fObjGen = objGen;
+      fAction = action;
+    }
+    
+    public void run() {
+      if (fAction == Action.CreateDocument) {
+        doCreateDocument();
+      }
+      else if (fAction == Action.CreateTree) {
+        doCreateTree();
+      } else if (fAction == Action.CreateFolders) {
+        doCreateFolder();
+      }
+    }
+    
+    public String[] doCreateDocument() {
+      String ids[] = fObjGen.createDocuments(fRootFolderId, fCount);
+      return ids;
+    }
+    
+    public void doCreateTree() {
+      fObjGen.createFolderHierachy(fDepth, fFoldersPerFolders, fRootFolderId);            
+    }
+
+    public String[] doCreateFolder() {
+      return fObjGen.createFolders(fRootFolderId, fCount);
+    }
+
+    public ObjectGenerator getObjectGenerator() {
+      return fObjGen;      
+    }
+    
+  }  // ObjectCreatorRunner
+  
+  static private ObjectGenerator createObjectGenerator(CmisProvider provider, String repoId,
+      int docsPerFolder, int foldersPerFolders, int depth, String documentType, String folderType,
+      int contentSizeInKB, String rootFolderId, boolean doCleanup) {
+
+    ProviderObjectFactory objectFactory = provider.getObjectFactory();
+    NavigationService navSvc = provider.getNavigationService();
+    ObjectService objSvc = provider.getObjectService();
+    
+    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(doCleanup);
+
+    return gen;
+  }
+  
+  static private String getRootFolderId(CmisProvider provider, String repositoryId, String rootFolderId) {
+    RepositoryService repSvc = provider.getRepositoryService();
+
+    RepositoryInfoData rep = repSvc.getRepositoryInfo(repositoryId, null);
+    if (null == rootFolderId || rootFolderId.length() == 0)
+      rootFolderId = rep.getRootFolderId();
+    
+    return rootFolderId;
+  }
+  
+  public static ObjectGeneratorRunner prepareForCreateTree(CmisProvider provider, String repoId,
+      int docsPerFolder, int foldersPerFolders, int depth, String documentType, String folderType,
+      int contentSizeInKB, String rootFolderId, boolean doCleanup) {
+    
+    ObjectGenerator objGen = createObjectGenerator(provider, repoId, docsPerFolder,
+        foldersPerFolders, depth, documentType, folderType, contentSizeInKB, rootFolderId,
+        doCleanup);    
+
+    ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateTree);
+    gen.fFoldersPerFolders = foldersPerFolders;
+    gen.fDepth = depth;
+    gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
+    return gen;
+  }
+  
+  public static ObjectGeneratorRunner[] prepareForCreateTreeMT(CmisProvider provider, String repoId,
+      int docsPerFolder, int foldersPerFolders, int depth, String documentType, String folderType,
+      int contentSizeInKB, String[] rootFolderIds, boolean doCleanup) {
+    
+    ObjectGeneratorRunner[] runners = new ObjectGeneratorRunner[rootFolderIds.length];
+    for (int i=0; i<rootFolderIds.length; i++) {
+      ObjectGenerator objGen = createObjectGenerator(provider, repoId, docsPerFolder,
+          foldersPerFolders, depth, documentType, folderType, contentSizeInKB, rootFolderIds[i],
+          doCleanup);    
+
+      ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateTree);
+      gen.fFoldersPerFolders = foldersPerFolders;
+      gen.fDepth = depth;
+      gen.fRootFolderId = rootFolderIds[i];
+      runners[i] = gen;
+    }
+    return runners;
+  }
+  
+  public static ObjectGeneratorRunner prepareForCreateDocument(CmisProvider provider, String repoId,
+      String documentType, int contentSizeInKB, String rootFolderId, int noDocuments, boolean doCleanup) {
+    
+    ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, documentType, null,
+        contentSizeInKB, rootFolderId, doCleanup);
+    
+    ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateDocument);
+    gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
+    gen.fCount = noDocuments;
+    return gen;
+  }
+
+  public static ObjectGeneratorRunner[] prepareForCreateDocumentMT(int threadCount,
+      CmisProvider provider, String repoId, String documentType, int contentSizeInKB,
+      String rootFolderId, int noDocuments, boolean doCleanup) {
+    
+    ObjectGeneratorRunner[] runners = new ObjectGeneratorRunner[threadCount];
+    for (int i=0; i<threadCount; i++) {
+      ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, documentType, null,
+          contentSizeInKB, rootFolderId, doCleanup);
+      
+      ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateDocument);
+      gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
+      gen.fCount = noDocuments;
+      runners[i] = gen;
+    }
+    return runners;
+  }
+
+  public static ObjectGeneratorRunner prepareForCreateFolder(CmisProvider provider, String repoId,
+      String folderType, String rootFolderId, int noFolders, boolean doCleanup) {
+    
+    ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, null, folderType,
+        0, rootFolderId, doCleanup);
+    
+    ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateFolders);
+    gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
+    gen.fCount = noFolders;
+    return gen;
+  }
+
+  public static ObjectGeneratorRunner[] prepareForCreateFolderMT(int threadCount,
+      CmisProvider provider, String repoId, String folderType, String rootFolderId, int noFolders,
+      boolean doCleanup) {
+    
+    ObjectGeneratorRunner[] runners = new ObjectGeneratorRunner[threadCount];
+    for (int i=0; i<threadCount; i++) {
+      ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, null, folderType,
+          0, rootFolderId, doCleanup);
+      
+      ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateFolders);
+      gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
+      gen.fCount = noFolders;
+      runners[i] = gen;
+    }
+    return runners;
+  }
+
+  public static void runMultiThreaded(ObjectGeneratorRunner[] runner) {
+    int threadCount = runner.length;
+    Thread threads[] = new Thread[threadCount];
+    for (int i=0; i<threadCount; i++) {
+      Thread thread = new Thread(runner[i], "ObjectGeneratorThread-" + i);
+      threads[i] = thread;
+      thread.start();
+    }
+    
+    try {
+      for (Thread thread : threads) {
+        thread.join();
+      }
+      // Print all timings to System.out
+      System.out.println();
+      System.out.println("Result:");      
+      TimeLogger[] loggersCreateDoc = new TimeLogger[threadCount];
+      TimeLogger[] loggersCreateFolder = new TimeLogger[threadCount];
+      TimeLogger[] loggersDelete = new TimeLogger[threadCount];
+      for (int i=0; i<threadCount; i++) {
+        loggersCreateDoc[i] = runner[i].fObjGen.getCreateDocumentTimeLogger();
+        loggersCreateFolder[i] = runner[i].fObjGen.getCreateFolderTimeLogger();
+        loggersDelete[i] = runner[i].fObjGen.getDeleteTimeLogger();
+      }
+      TimeLogger.printTimes(loggersCreateDoc);
+      TimeLogger.printTimes(loggersCreateFolder);
+      TimeLogger.printTimes(loggersDelete);
+      
+    } catch (InterruptedException e) {
+      System.out.println("Failed to wait for termination of threads: " + e);
+    }
+  }
+
+}