This project has retired. For details please refer to its
Attic page.
MultiThreadedObjectGenerator xref
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }
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
101 gen.setDocumentTypeId(documentType);
102
103 gen.setFolderTypeId(folderType);
104
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
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 }