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/30 08:12:25 UTC
svn commit: r929003 - in
/incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util: ./
src/main/java/org/apache/opencmis/util/repository/
Author: jens
Date: Tue Mar 30 06:12:25 2010
New Revision: 929003
URL: http://svn.apache.org/viewvc?rev=929003&view=rev
Log:
CMIS-183
Offer ObjectGenerator also as standalone command line tool
Provide simple time logging and statistics
Added:
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/TimeLogger.java
Modified:
incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/pom.xml
incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjectGenerator.java
Modified: incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/pom.xml?rev=929003&r1=929002&r2=929003&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/pom.xml (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/pom.xml Tue Mar 30 06:12:25 2010
@@ -42,5 +42,15 @@
<artifactId>opencmis-commons-impl</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>net.sf.jopt-simple</groupId>
+ <artifactId>jopt-simple</artifactId>
+ <version>3.2</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>opencmis-provider-impl</artifactId>
+ <version>${project.version}</version>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
Added: 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=929003&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/ObjGenApp.java Tue Mar 30 06:12:25 2010
@@ -0,0 +1,407 @@
+/*
+ * 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 java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import joptsimple.OptionParser;
+import joptsimple.OptionSet;
+import joptsimple.OptionSpec;
+
+import org.apache.opencmis.client.provider.factory.CmisProviderFactory;
+import org.apache.opencmis.commons.SessionParameter;
+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;
+
+public class ObjGenApp {
+ public static final String DEFAULT_USER = "";
+ public static final String DEFAULT_PWD = "";
+ 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_WS_URL = "http://localhost:8080/cmis/services/";
+
+ private final static String CMD = "Command";
+ private final static String REPOSITORY_ID = "RepositoryId";
+ private final static String FILLER_DOCUMENT_TYPE_ID = "DocumentTypeId";
+ private final static String FILLER_FOLDER_TYPE_ID = "FolderTypeId";
+ private final static String FILLER_DOCS_PER_FOLDER = "DocsPerFolder";
+ private final static String FILLER_FOLDERS_PER_FOLDER = "FoldersPerFolder";
+ private final static String FILLER_DEPTH = "Depth";
+ private final static String FILLER_CONTENT_SIZE = "ContentSizeInKB";
+ private final static String COUNT = "Count";
+ private final static String BINDING = "Binding";
+ private final static String BINDING_ATOM = "AtomPub";
+ private final static String BINDING_WS = "WebService";
+
+ private CmisProvider fProvider;
+ private boolean fUsingAtom;
+ private String fUrlStr;
+
+ OptionSpec<String> fCmd;
+ OptionSpec<Integer> fDepth;
+ OptionSpec<Integer> fContentSize;
+ OptionSpec<Integer> fFolderPerFolder;
+ OptionSpec<Integer> fDocsPerFolder;
+ OptionSpec<String> fFolderType;
+ OptionSpec<String> fDocType;
+ OptionSpec<String> fRepoId;
+ OptionSpec<Integer> fCount;
+ OptionSpec<String> fBinding;
+
+ public static void main(String[] args) {
+
+ ObjGenApp app = new ObjGenApp();
+ try {
+ app.processCmdLine(args);
+ }
+ catch (CmisBaseException ce) {
+ System.out.println("Error: Could not process command. " + ce);
+ System.out.println("Extended error: " + ce.getErrorContent());
+ ce.printStackTrace();
+ }
+ catch (Exception e) {
+ System.out.println("Could not fill repository " + e);
+ e.printStackTrace();
+ }
+ }
+
+ private void processCmdLine(String[] args) {
+
+ OptionParser parser = new OptionParser();
+ fCmd = parser.accepts(CMD).withRequiredArg();
+ fRepoId = parser.accepts(REPOSITORY_ID).withOptionalArg();
+ fDocType = parser.accepts(FILLER_DOCUMENT_TYPE_ID).withOptionalArg().defaultsTo(
+ BaseObjectTypeIds.CMIS_DOCUMENT.value());
+ fFolderType = parser.accepts(FILLER_FOLDER_TYPE_ID).withOptionalArg().defaultsTo(
+ BaseObjectTypeIds.CMIS_FOLDER.value());
+ fDocsPerFolder = parser.accepts(FILLER_DOCS_PER_FOLDER).withOptionalArg().ofType(Integer.class);
+ fFolderPerFolder = parser.accepts(FILLER_FOLDERS_PER_FOLDER).withOptionalArg().ofType(
+ Integer.class);
+ fDepth = parser.accepts(FILLER_DEPTH).withOptionalArg().ofType(Integer.class);
+ fContentSize = parser.accepts(FILLER_CONTENT_SIZE).withOptionalArg().ofType(Integer.class);
+ fCount = parser.accepts(COUNT).withOptionalArg().ofType(Integer.class).defaultsTo(10);
+ fBinding = parser.accepts(BINDING).withOptionalArg().ofType(String.class).defaultsTo(BINDING_ATOM);
+
+ OptionSet options = parser.parse(args);
+
+ if (options.has("?"))
+ try {
+ parser.printHelpOn(System.out);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ 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.");
+ fUsingAtom = true;
+ } else {
+ System.out.println("Unknown option <Binding>: " + options.valueOf(fBinding)
+ + " allowed values: " + BINDING_WS + " or " + BINDING_ATOM);
+ return;
+ }
+
+ if (options.valueOf(fCmd).equals("FillRepository")) {
+ fillRepository(options);
+ } else if (options.valueOf(fCmd).equals("CreateDocument")) {
+ createSingleDocument(options);
+ } else if (options.valueOf(fCmd).equals("RepositoryInfo")) {
+ repositoryInfo(options);
+ } else if (options.valueOf(fCmd).equals("GetUrl")) {
+ getUrl(getConfiguredUrl());
+ } else {
+ System.out.println("Unknown cmd: " + options.valueOf(fCmd));
+ }
+ }
+
+// 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 fillRepository(OptionSet options) {
+ System.out.println();
+ if (fUsingAtom)
+ System.out.println("Connecting to " + getAtomPubUrl());
+ else
+ System.out.println("Connecting to " + getWsUrl());
+
+ System.out.println("Filling repository " + options.valueOf(fRepoId)
+ + " with following arguments:");
+ 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("Content size: " + options.valueOf(fContentSize));
+ System.out.println("Document Type: " + options.valueOf(fDocType));
+ System.out.println("Folder Type: " + options.valueOf(fFolderType));
+
+ try {
+ fillRepository(options.valueOf(fRepoId), options.valueOf(fDocsPerFolder), options
+ .valueOf(fFolderPerFolder), options.valueOf(fDepth), options.valueOf(fDocType), options
+ .valueOf(fFolderType), options.valueOf(fContentSize));
+ }
+ catch (Exception e) {
+ System.out.println("Filling repository failed with exception: " + e);
+ e.printStackTrace();
+ }
+ }
+
+ private void fillRepository(String repoId, int docsPerFolder, int foldersPerFolders, int depth,
+ String documentType, String folderType, int contentSizeInKB) {
+
+ ProviderObjectFactory objectFactory = getObjectFactory();
+ NavigationService navSvc = getProvider().getNavigationService();
+ ObjectService objSvc = getProvider().getObjectService();
+ RepositoryService repSvc = getProvider().getRepositoryService();
+
+ 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);
+ // Simulate a runtime context with configuration parameters
+ // Attach the CallContext to a thread local context that can be accessed from everywhere
+
+ // Build the tree
+ RepositoryInfoData rep = repSvc.getRepositoryInfo(repoId, null);
+ String rootFolderId = rep.getRootFolderId();
+
+ gen.resetCounters();
+ gen.createFolderHierachy(depth, foldersPerFolders, rootFolderId);
+ System.out.println("Filling repository succeeded.");
+ System.out.println("Number of documents created: " + gen.getDocumentsInTotal());
+ System.out.println("Number of folders created: " + gen.getFoldersInTotal());
+ gen.printTimings();
+ }
+
+ private void createSingleDocument(OptionSet options) {
+ System.out.println();
+ System.out.println("Connecting to " + getAtomPubUrl());
+ System.out.println("Creating doc in repository " + options.valueOf(fRepoId));
+
+ createSingleDocument(options.valueOf(fRepoId), options.valueOf(fContentSize));
+
+ }
+
+ private void createSingleDocument(String repoId, int contentSizeInKB) {
+
+ 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();
+ String rootFolderId = rep.getRootFolderId();
+ gen.setContentSizeInKB(contentSizeInKB);
+ gen.setUseUuidsForNames(true);
+ gen.createSingleDocument(rootFolderId);
+ System.out.println("Document creation succeeded.");
+ gen.printTimings();
+
+ gen.resetCounters();
+ }
+
+ private void callRepoInfo(String repositoryId) {
+ RepositoryService repSvc = getProvider().getRepositoryService();
+ TimeLogger timeLogger = new TimeLogger("RepoInfoTest");
+ int n = 5;
+ for (int i = 0; i < n; i++) {
+ fProvider.clearRepositoryCache(repositoryId);
+ timeLogger.start();
+ repSvc.getRepositoryInfo(repositoryId, null);
+ timeLogger.stop();
+ }
+ timeLogger.printTimes();
+ }
+
+ private void repositoryInfo(OptionSet options) {
+ callRepoInfo(options.valueOf(fRepoId));
+ }
+
+ private ProviderObjectFactory getObjectFactory() {
+ return getProvider().getObjectFactory();
+ }
+
+ private CmisProvider getProvider() {
+ if (fProvider == null) {
+ if (fUsingAtom)
+ fProvider = createAtomProvider(getAtomPubUrl(), DEFAULT_USER, DEFAULT_PWD);
+ else
+ fProvider = createWsProvider(getWsUrl(), DEFAULT_USER, DEFAULT_PWD);
+ }
+ return fProvider;
+ }
+
+ private static void filLoginParams(Map<String, String> parameters, String user, String password) {
+ if (user != null && !user.isEmpty())
+ parameters.put(SessionParameter.USER, user);
+ if (user != null && !user.isEmpty())
+ 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);
+
+ // get factory and create provider
+ CmisProviderFactory factory = CmisProviderFactory.newInstance();
+ parameters.put(SessionParameter.ATOMPUB_URL, url);
+ CmisProvider provider = factory.createCmisAtomPubProvider(parameters);
+ return provider;
+ }
+
+ private static CmisProvider createWsProvider(String url, String username, String password) {
+ boolean isPrefix = true;
+ String urlLower = url.toLowerCase();
+
+ if (urlLower.endsWith("?wsdl")) {
+ isPrefix = false;
+ }
+ else if (urlLower.endsWith(".wsdl")) {
+ isPrefix = false;
+ }
+ else if (urlLower.endsWith(".xml")) {
+ isPrefix = false;
+ }
+
+ return createProvider(url, isPrefix, username, password);
+ }
+
+ public static CmisProvider createProvider(String url, boolean isPrefix, String username,
+ String password) {
+ // gather parameters
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put(SessionParameter.USER, username);
+ parameters.put(SessionParameter.PASSWORD, password);
+
+ if (!isPrefix) {
+ parameters.put(SessionParameter.WEBSERVICES_REPOSITORY_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_NAVIGATION_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_OBJECT_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_VERSIONING_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_DISCOVERY_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_RELATIONSHIP_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_MULTIFILING_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_POLICY_SERVICE, url);
+ parameters.put(SessionParameter.WEBSERVICES_ACL_SERVICE, url);
+ }
+ else {
+ parameters.put(SessionParameter.WEBSERVICES_REPOSITORY_SERVICE, url
+ + "RepositoryService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_NAVIGATION_SERVICE, url
+ + "NavigationService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_OBJECT_SERVICE, url + "ObjectService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_VERSIONING_SERVICE, url
+ + "VersioningService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_DISCOVERY_SERVICE, url + "DiscoveryService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_RELATIONSHIP_SERVICE, url
+ + "RelationshipService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_MULTIFILING_SERVICE, url
+ + "MultiFilingService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_POLICY_SERVICE, url + "PolicyService?wsdl");
+ parameters.put(SessionParameter.WEBSERVICES_ACL_SERVICE, url + "ACLService?wsdl");
+ }
+
+ // get factory and create provider
+ CmisProviderFactory factory = CmisProviderFactory.newInstance();
+ CmisProvider provider = factory.createCmisWebServicesProvider(parameters);
+
+ return provider;
+ }
+
+
+ private String getAtomPubUrl() {
+ return System.getProperty(PROP_ATOMPUB_URL, DEFAULT_ATOMPUB_URL);
+ }
+
+ private String getWsUrl() {
+ return System.getProperty(PROP_WS_URL, DEFAULT_WS_URL);
+ }
+
+ private String getConfiguredUrl() {
+ return System.getProperty(PROP_URL, fUrlStr);
+ }
+
+ private void getUrl(String urlStr) {
+ URL url;
+ InputStream is;
+ InputStreamReader isr;
+ BufferedReader r;
+ String str;
+
+ try {
+ System.out.println("Reading URL: " + urlStr);
+ url = new URL(urlStr);
+ is = url.openStream();
+ isr = new InputStreamReader(is);
+ r = new BufferedReader(isr);
+ do {
+ str = r.readLine();
+ if (str != null)
+ System.out.println(str);
+ } while (str != null);
+ }
+ catch (MalformedURLException e) {
+ System.out.println("Must enter a valid URL" + e);
+ }
+ catch (IOException e) {
+ System.out.println("Can not connect" + e);
+ }
+ }
+
+
+}
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=929003&r1=929002&r2=929003&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 Tue Mar 30 06:12:25 2010
@@ -62,6 +62,10 @@ public class ObjectGenerator {
NavigationService fNavSvc;
ObjectService fObjSvc;
private String fRepositoryId;
+ private TimeLogger fTimeLoggerCreateDoc;
+ private TimeLogger fTimeLoggerCreateFolder;
+
+
/**
* Indicates if / how many documents are created in each folder
*/
@@ -106,7 +110,6 @@ public class ObjectGenerator {
*/
private int fContentSizeInK = 0;
-
private static final String NAMEPROPVALPREFIXDOC = "My_Document-";
private static final String NAMEPROPVALPREFIXFOLDER = "My_Folder-";
private static final String STRINGPROPVALPREFIXDOC = "My Doc StringProperty ";
@@ -130,6 +133,8 @@ public class ObjectGenerator {
fStringPropertyIdsToSetForFolder = new ArrayList<String>();
fNoDocumentsToCreate = 0;
fUseUuids = false;
+ fTimeLoggerCreateDoc = new TimeLogger("createDocument()");
+ fTimeLoggerCreateFolder = new TimeLogger("createFolder()");
}
public void setNumberOfDocumentsToCreatePerFolder(int noDocumentsToCreate) {
@@ -158,6 +163,8 @@ public class ObjectGenerator {
public void createFolderHierachy(int levels, int childrenPerLevel, String rootFolderId) {
resetCounters();
+ fTimeLoggerCreateDoc.reset();
+ fTimeLoggerCreateFolder.reset();
createFolderHierachy(rootFolderId, 0, levels, childrenPerLevel);
}
@@ -246,6 +253,7 @@ public class ObjectGenerator {
}
public void createSingleDocument(String folderId) {
+ fTimeLoggerCreateDoc.reset();
createDocument(folderId, 0, 0);
}
@@ -253,6 +261,16 @@ public class ObjectGenerator {
fDocumentsInTotalCount = fFoldersInTotalCount = 0;
}
+ public void printTimings() {
+ fTimeLoggerCreateDoc.printTimes();
+ fTimeLoggerCreateFolder.printTimes();
+ }
+
+ public void logTimings() {
+ fTimeLoggerCreateDoc.logTimes();
+ fTimeLoggerCreateFolder.logTimes();
+ }
+
private void createFolderHierachy(String parentId, int level, int levels, int childrenPerLevel) {
if (level>=levels)
@@ -261,8 +279,15 @@ public class ObjectGenerator {
+ ", max levels " + levels);
for (int i = 0; i < childrenPerLevel; i++) {
- PropertiesData props = createFolderProperties(i, level);
- String id = fObjSvc.createFolder(fRepositoryId, props, parentId, null, null, null, null);
+ PropertiesData props = createFolderProperties(i, level);
+ String id = null;
+ try {
+ fTimeLoggerCreateFolder.start();
+ id = fObjSvc.createFolder(fRepositoryId, props, parentId, null, null, null, null);
+ } finally {
+ fTimeLoggerCreateFolder.stop();
+ }
+
if (id != null) {
++fFoldersInTotalCount;
createFolderHierachy(id, level+1, levels, childrenPerLevel);
@@ -286,8 +311,14 @@ public class ObjectGenerator {
String id = null;
if (fContentSizeInK > 0)
contentStream = createContent();
- id = fObjSvc.createDocument(fRepositoryId, props, folderId, contentStream, versioningState,
- policies, addACEs, removeACEs, extension);
+ try {
+ fTimeLoggerCreateDoc.start();
+ id = fObjSvc.createDocument(fRepositoryId, props, folderId, contentStream, versioningState,
+ policies, addACEs, removeACEs, extension);
+ } finally {
+ fTimeLoggerCreateDoc.stop();
+ }
+
if (null == id)
throw new RuntimeException("createDocument failed.");
++fDocumentsInTotalCount;
Added: 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=929003&view=auto
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java (added)
+++ incubator/chemistry/trunk/opencmis/opencmis-test/opencmis-test-util/src/main/java/org/apache/opencmis/util/repository/TimeLogger.java Tue Mar 30 06:12:25 2010
@@ -0,0 +1,164 @@
+/*
+ * 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 java.util.LinkedList;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Simple utility class for time logging
+ * Note: NOT thread safe!
+ *
+ * @author Jens
+ *
+ */
+public class TimeLogger {
+ private static Log LOG = LogFactory.getLog(TimeLogger.class);
+
+ private static class TimeRecord {
+ public long fStart;
+ public long fStop;
+ };
+
+ private String fAction;
+ private LinkedList<TimeRecord> fTimeRecs = new LinkedList<TimeRecord>();
+ private final int maxSize = 2500;
+ TimeRecord fCurrentRec;
+
+ public TimeLogger() {
+ fAction = "";
+ fTimeRecs = new LinkedList<TimeRecord>();
+ }
+
+ public TimeLogger(String action) {
+ fAction = action;
+ }
+
+ public void start() {
+ createAndAddNewRecord();
+ fCurrentRec.fStart = System.currentTimeMillis();
+ }
+
+ public void stop() {
+ fCurrentRec.fStop = System.currentTimeMillis();
+ }
+
+ public void reset() {
+ fTimeRecs.clear();
+ }
+
+ public void logTimes() {
+ long size = fTimeRecs.size();
+ if (size==0)
+ LOG.info("No samples for " + fAction + " available. ");
+ else if (size==1)
+ LOG.info("Time elapsed for " + fAction + ": " + getLastTime());
+ else {
+ LOG.info("Timings for " + size + " samples: ");
+ LOG.info(" Average: " + getAverageTime() + "ms");
+ LOG.info(" Min : " + getMinTime() + "ms");
+ LOG.info(" Max : " + getMaxTime() + "ms");
+ LOG.info(" Total : " + getTotalTime() + "ms");
+ }
+ }
+
+ public void printTimes() {
+ long size = fTimeRecs.size();
+ if (size==0)
+ System.out.println("No samples for " + fAction + " available. ");
+ else if (size==1)
+ System.out.println("Time elapsed for " + fAction + ": " + getLastTime());
+ else {
+ System.out.println("Timings for " + size + " samples: ");
+ System.out.println(" Average: " + getAverageTime() + "ms");
+ System.out.println(" Min : " + getMinTime() + "ms");
+ System.out.println(" Max : " + getMaxTime() + "ms");
+ System.out.println(" Total : " + getTotalTime() + "ms");
+ }
+ }
+
+ public long getLastTime() {
+ TimeRecord lastRec = fTimeRecs.getLast();
+ if (null != lastRec)
+ return lastRec.fStop-lastRec.fStart;
+ else
+ return 0;
+ }
+
+ private void createAndAddNewRecord() {
+ if (fTimeRecs.size() < maxSize) {
+ fCurrentRec = new TimeRecord();
+ fTimeRecs.add(fCurrentRec);
+ }
+ }
+
+ private long getAverageTime() {
+ long sum = 0;
+ long size = fTimeRecs.size();
+
+ if (0 == fTimeRecs.size())
+ return 0;
+
+ for (TimeRecord tm : fTimeRecs) {
+ sum += tm.fStop - tm.fStart;
+ }
+ return (sum + size/2) / size;
+ }
+
+ private long getMinTime() {
+ long min = Long.MAX_VALUE;
+
+ if (0 == fTimeRecs.size())
+ return 0;
+
+ for (TimeRecord tm : fTimeRecs) {
+ long val = tm.fStop - tm.fStart;
+ if (val < min)
+ min = val;
+ }
+ return min;
+
+ }
+
+ private long getMaxTime() {
+ long max = Long.MIN_VALUE;
+
+ if (0 == fTimeRecs.size())
+ return 0;
+
+ for (TimeRecord tm : fTimeRecs) {
+ long val = tm.fStop - tm.fStart;
+ if (val > max)
+ max = val;
+ }
+ return max;
+ }
+
+ private long getTotalTime() {
+ long sum = 0;
+
+ for (TimeRecord tm : fTimeRecs) {
+ sum = tm.fStop - tm.fStart;
+ }
+ return sum;
+ }
+
+}