This project has retired. For details please refer to its Attic page.
MultiThreadedObjectGenerator xref

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.util.repository;
20  
21  import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
22  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
23  import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
24  import org.apache.chemistry.opencmis.commons.spi.CmisBinding;
25  import org.apache.chemistry.opencmis.commons.spi.NavigationService;
26  import org.apache.chemistry.opencmis.commons.spi.ObjectService;
27  import org.apache.chemistry.opencmis.commons.spi.RepositoryService;
28  import org.apache.chemistry.opencmis.util.repository.ObjectGenerator.CONTENT_KIND;
29  
30  public class MultiThreadedObjectGenerator {
31  
32      public static enum Action {
33          CreateDocument, CreateTree, CreateFolders, CreateTypes
34      }
35  
36      private MultiThreadedObjectGenerator() {
37      }
38  
39      public static class ObjectGeneratorRunner implements Runnable {
40          private final Action fAction;
41          ObjectGenerator fObjGen;
42          private String fRootFolderId;
43          private int fFoldersPerFolders;
44          private int fDepth;
45          private int fCount;
46          private TypeDefinitionList fTypeDefList;
47  
48          public ObjectGeneratorRunner(ObjectGenerator objGen, Action action) {
49              fObjGen = objGen;
50              fAction = action;
51          }
52  
53          public void run() {
54              if (fAction == Action.CreateDocument) {
55                  doCreateDocument();
56              } else if (fAction == Action.CreateTree) {
57                  doCreateTree();
58              } else if (fAction == Action.CreateFolders) {
59                  doCreateFolder();
60              } else if (fAction == Action.CreateTypes) {
61                  doCreateTypes();
62              }
63          }
64  
65          public String[] doCreateDocument() {
66              String[] ids = fObjGen.createDocuments(fRootFolderId, fCount);
67              return ids;
68          }
69  
70          public void doCreateTree() {
71              fObjGen.createFolderHierachy(fDepth, fFoldersPerFolders, fRootFolderId);
72          }
73  
74          public String[] doCreateFolder() {
75              return fObjGen.createFolders(fRootFolderId, fCount);
76          }
77          
78          public void doCreateTypes() {
79              fObjGen.createTypes(fTypeDefList);
80          }
81  
82          public ObjectGenerator getObjectGenerator() {
83              return fObjGen;
84          }
85  
86      } // ObjectCreatorRunner
87  
88      private static ObjectGenerator createObjectGenerator(CmisBinding binding, String repoId, int docsPerFolder,
89              int foldersPerFolders, int depth, String documentType, String folderType, int contentSizeInKB,
90              String rootFolderId, CONTENT_KIND contentKind, boolean doCleanup) {
91  
92          BindingsObjectFactory objectFactory = binding.getObjectFactory();
93          NavigationService navSvc = binding.getNavigationService();
94          ObjectService objSvc = binding.getObjectService();
95          RepositoryService repSvc = binding.getRepositoryService();
96          
97          ObjectGenerator gen = new ObjectGenerator(objectFactory, navSvc, objSvc, repSvc, repoId, contentKind);
98          gen.setUseUuidsForNames(true);
99          gen.setNumberOfDocumentsToCreatePerFolder(docsPerFolder);
100         // Set the type id for all created documents:
101         gen.setDocumentTypeId(documentType);
102         // Set the type id for all created folders:
103         gen.setFolderTypeId(folderType);
104         // Set contentSize
105         gen.setContentSizeInKB(contentSizeInKB);
106         gen.setCleanUpAfterCreate(doCleanup);
107 
108         return gen;
109     }
110 
111     private static String getRootFolderId(CmisBinding binding, String repositoryId, String rootFolderId) {
112         RepositoryService repSvc = binding.getRepositoryService();
113 
114         RepositoryInfo rep = repSvc.getRepositoryInfo(repositoryId, null);
115         if (null == rootFolderId || rootFolderId.length() == 0) {
116             rootFolderId = rep.getRootFolderId();
117         }
118 
119         return rootFolderId;
120     }
121 
122     public static ObjectGeneratorRunner prepareForCreateTree(CmisBinding binding, String repoId, int docsPerFolder,
123             int foldersPerFolders, int depth, String documentType, String folderType, int contentSizeInKB,
124             String rootFolderId, CONTENT_KIND contentKind, boolean doCleanup) {
125 
126         ObjectGenerator objGen = createObjectGenerator(binding, repoId, docsPerFolder, foldersPerFolders, depth,
127                 documentType, folderType, contentSizeInKB, rootFolderId, contentKind, doCleanup);
128 
129         ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateTree);
130         gen.fFoldersPerFolders = foldersPerFolders;
131         gen.fDepth = depth;
132         gen.fRootFolderId = getRootFolderId(binding, repoId, rootFolderId);
133         return gen;
134     }
135 
136     public static ObjectGeneratorRunner[] prepareForCreateTreeMT(CmisBinding provider, String repoId,
137             int docsPerFolder, int foldersPerFolders, int depth, String documentType, String folderType,
138             int contentSizeInKB, String[] rootFolderIds, CONTENT_KIND contentKind, boolean doCleanup) {
139 
140         ObjectGeneratorRunner[] runners = new ObjectGeneratorRunner[rootFolderIds.length];
141         for (int i = 0; i < rootFolderIds.length; i++) {
142             ObjectGenerator objGen = createObjectGenerator(provider, repoId, docsPerFolder, foldersPerFolders, depth,
143                     documentType, folderType, contentSizeInKB, rootFolderIds[i], contentKind,
144                     doCleanup);
145 
146             ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateTree);
147             gen.fFoldersPerFolders = foldersPerFolders;
148             gen.fDepth = depth;
149             gen.fRootFolderId = rootFolderIds[i];
150             runners[i] = gen;
151         }
152         return runners;
153     }
154 
155     public static ObjectGeneratorRunner prepareForCreateDocument(CmisBinding provider, String repoId,
156             String documentType, int contentSizeInKB, String rootFolderId, int noDocuments, 
157             CONTENT_KIND contentKind, boolean doCleanup) {
158 
159         ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, documentType, null, contentSizeInKB,
160                 rootFolderId, contentKind, doCleanup);
161 
162         ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateDocument);
163         gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
164         gen.fCount = noDocuments;
165         return gen;
166     }
167 
168     public static ObjectGeneratorRunner[] prepareForCreateDocumentMT(int threadCount, CmisBinding binding,
169             String repoId, String documentType, int contentSizeInKB, String rootFolderId, int noDocuments,
170             CONTENT_KIND contentKind, boolean doCleanup) {
171 
172         ObjectGeneratorRunner[] runners = new ObjectGeneratorRunner[threadCount];
173         for (int i = 0; i < threadCount; i++) {
174             ObjectGenerator objGen = createObjectGenerator(binding, repoId, 0, 0, 0, documentType, null,
175                     contentSizeInKB, rootFolderId, contentKind, doCleanup);
176 
177             ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateDocument);
178             gen.fRootFolderId = getRootFolderId(binding, repoId, rootFolderId);
179             gen.fCount = noDocuments;
180             runners[i] = gen;
181         }
182         return runners;
183     }
184 
185     public static ObjectGeneratorRunner prepareForCreateFolder(CmisBinding provider, String repoId, String folderType,
186             String rootFolderId, int noFolders, boolean doCleanup) {
187 
188         ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, null, folderType, 0, rootFolderId,
189                 null, doCleanup);
190 
191         ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateFolders);
192         gen.fRootFolderId = getRootFolderId(provider, repoId, rootFolderId);
193         gen.fCount = noFolders;
194         return gen;
195     }
196 
197     public static ObjectGeneratorRunner[] prepareForCreateFolderMT(int threadCount, CmisBinding binding, String repoId,
198             String folderType, String rootFolderId, int noFolders, boolean doCleanup) {
199 
200         ObjectGeneratorRunner[] runners = new ObjectGeneratorRunner[threadCount];
201         for (int i = 0; i < threadCount; i++) {
202             ObjectGenerator objGen = createObjectGenerator(binding, repoId, 0, 0, 0, null, folderType, 0, rootFolderId,
203                     null, doCleanup);
204 
205             ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateFolders);
206             gen.fRootFolderId = getRootFolderId(binding, repoId, rootFolderId);
207             gen.fCount = noFolders;
208             runners[i] = gen;
209         }
210         return runners;
211     }
212 
213     public static ObjectGeneratorRunner prepareForCreateTypes(CmisBinding provider, String repoId, TypeDefinitionList typeDefList) {
214 
215         ObjectGenerator objGen = createObjectGenerator(provider, repoId, 0, 0, 0, null, null, 0, null,
216                 null, false);
217 
218         ObjectGeneratorRunner gen = new ObjectGeneratorRunner(objGen, Action.CreateTypes);
219         gen.fTypeDefList = typeDefList;
220         return gen;
221     }
222 
223     public static void runMultiThreaded(ObjectGeneratorRunner[] runner) {
224         int threadCount = runner.length;
225         Thread[] threads = new Thread[threadCount];
226         for (int i = 0; i < threadCount; i++) {
227             Thread thread = new Thread(runner[i], "ObjectGeneratorThread-" + i);
228             threads[i] = thread;
229             thread.start();
230         }
231 
232         try {
233             for (Thread thread : threads) {
234                 thread.join();
235             }
236             // Print all timings to System.out
237             System.out.println();
238             System.out.println("Result:");
239             TimeLogger[] loggersCreateDoc = new TimeLogger[threadCount];
240             TimeLogger[] loggersCreateFolder = new TimeLogger[threadCount];
241             TimeLogger[] loggersDelete = new TimeLogger[threadCount];
242             for (int i = 0; i < threadCount; i++) {
243                 loggersCreateDoc[i] = runner[i].fObjGen.getCreateDocumentTimeLogger();
244                 loggersCreateFolder[i] = runner[i].fObjGen.getCreateFolderTimeLogger();
245                 loggersDelete[i] = runner[i].fObjGen.getDeleteTimeLogger();
246             }
247             TimeLogger.printTimes(loggersCreateDoc);
248             TimeLogger.printTimes(loggersCreateFolder);
249             TimeLogger.printTimes(loggersDelete);
250 
251         } catch (InterruptedException e) {
252             System.out.println("Failed to wait for termination of threads: " + e);
253         }
254     }
255 
256 }