Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/ObjectGenerator.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/ObjectGenerator.java?rev=936943&r1=936942&r2=936943&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/ObjectGenerator.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/ObjectGenerator.java Thu Apr 22 16:34:53 2010 @@ -58,559 +58,559 @@ import org.apache.commons.logging.LogFac */ public class ObjectGenerator { - private static Log log = LogFactory.getLog(ObjectGenerator.class); - private BindingsObjectFactory fFactory; - NavigationService fNavSvc; - ObjectService fObjSvc; - private String fRepositoryId; - private TimeLogger fTimeLoggerCreateDoc; - private TimeLogger fTimeLoggerCreateFolder; - private TimeLogger fTimeLoggerDelete; - private boolean fCleanup; - List<String> fTopLevelDocsCreated; // list of ids created on first level - List<String> fTopLevelFoldersCreated; // list of ids created on first level - - /** - * Indicates if / how many documents are created in each folder - */ - private int fNoDocumentsToCreate; - - /** - * The type id of the document id that is created. - */ - private String fDocTypeId = BaseTypeId.CMIS_DOCUMENT.value(); - - /** - * The type id of the folder that is created. - */ - private String fFolderTypeId = BaseTypeId.CMIS_FOLDER.value(); - - /** - * A list of property ids. For each element in this list a String property - * value is created for each creation of a document. All ids must be valid - * string property id of the type fDocTypeId - */ - private List<String> fStringPropertyIdsToSetForDocument; - - /** - * A list of property ids. For each element in this list a String property - * value is created for each creation of a folder. All ids must be valid - * string property id of the type fFolderTypeId - */ - private List<String> fStringPropertyIdsToSetForFolder; - - /** - * number of documents created in total - */ - private int fDocumentsInTotalCount = 0; - - /** - * number of folders created in total - */ - private int fFoldersInTotalCount = 0; - - /** - * size of content in KB, if 0 create documents without content - */ - 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 "; - private static final String STRINGPROPVALPREFIXFOLDER = "My Folder StringProperty "; - private static int PROPVALCOUNTER_DOC_STRING_PROP = 0; - private static int PROPVALCOUNTER_FOLDER_STRING_PROP = 0; - /** - * use UUIDs to generate folder and document names - */ - private boolean fUseUuids; - - public ObjectGenerator(BindingsObjectFactory factory, NavigationService navSvc, ObjectService objSvc, - String repositoryId) { - super(); - fFactory = factory; - fNavSvc = navSvc; - fObjSvc = objSvc; - fRepositoryId = repositoryId; - // create an empty list of properties to generate by default for folder - // and document - fStringPropertyIdsToSetForDocument = new ArrayList<String>(); - fStringPropertyIdsToSetForFolder = new ArrayList<String>(); - fNoDocumentsToCreate = 0; - fUseUuids = false; - fTimeLoggerCreateDoc = new TimeLogger("createDocument()"); - fTimeLoggerCreateFolder = new TimeLogger("createFolder()"); - fTimeLoggerDelete = new TimeLogger("Delete"); - fCleanup = false; - fTopLevelDocsCreated = new ArrayList<String>(); - fTopLevelFoldersCreated = new ArrayList<String>(); - } - - public void setNumberOfDocumentsToCreatePerFolder(int noDocumentsToCreate) { - fNoDocumentsToCreate = noDocumentsToCreate; - } - - public void setFolderTypeId(String folderTypeId) { - fFolderTypeId = folderTypeId; - } - - public void setDocumentTypeId(String docTypeId) { - fDocTypeId = docTypeId; - } - - public void setDocumentPropertiesToGenerate(List<String> propertyIds) { - fStringPropertyIdsToSetForDocument = propertyIds; - } - - public void setFolderPropertiesToGenerate(List<String> propertyIds) { - fStringPropertyIdsToSetForFolder = propertyIds; - } - - public void setContentSizeInKB(int sizeInK) { - fContentSizeInK = sizeInK; - } - - public void setCleanUpAfterCreate(boolean doCleanup) { - 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(); - fTimeLoggerCreateFolder.reset(); - fTopLevelFoldersCreated.clear(); - fTopLevelDocsCreated.clear(); - createFolderHierachy(rootFolderId, 0, levels, childrenPerLevel); - if (fCleanup) - deleteTree(); - } - - public void setUseUuidsForNames(boolean useUuids) { - /** - * use UUIDs to generate folder and document names - */ - fUseUuids = useUuids; - } - - /** - * retrieve the index-th folder from given level of the hierarchy starting - * at rootId - * - * @param rootId - * @param level - * @param index - * @return - */ - public String getFolderId(String rootId, int level, int index) { - String objectId = rootId; - final String requiredProperties = PropertyIds.OBJECT_ID + "," + PropertyIds.OBJECT_TYPE_ID + "," - + PropertyIds.BASE_TYPE_ID; - // Note: This works because first folders are created then documents - for (int i = 0; i < level; i++) { - ObjectInFolderList result = fNavSvc.getChildren(fRepositoryId, objectId, requiredProperties, - PropertyIds.OBJECT_TYPE_ID, false, IncludeRelationships.NONE, null, true, BigInteger.valueOf(-1), - BigInteger.valueOf(-1), null); - List<ObjectInFolderData> children = result.getObjects(); - ObjectData child = children.get(index).getObject(); - objectId = (String) child.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue(); - } - return objectId; - } - - /** - * retrieve the index-th document from given folder - * - * @param folderId - * folder to retrieve document from - * @param index - * index of document to retrieve from this folder - * @return - */ - public String getDocumentId(String folderId, int index) { - String docId = null; - final String requiredProperties = PropertyIds.OBJECT_ID + "," + PropertyIds.OBJECT_TYPE_ID + "," - + PropertyIds.BASE_TYPE_ID; - ObjectInFolderList result = fNavSvc.getChildren(fRepositoryId, folderId, requiredProperties, - PropertyIds.OBJECT_TYPE_ID, false, IncludeRelationships.NONE, null, true, BigInteger.valueOf(-1), - BigInteger.valueOf(-1), null); - List<ObjectInFolderData> children = result.getObjects(); - int numDocsFound = 0; - for (int i = 0; i < children.size(); i++) { - ObjectData child = children.get(i).getObject(); - docId = (String) child.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue(); - if (child.getBaseTypeId().equals(BaseTypeId.CMIS_DOCUMENT)) { - if (numDocsFound == index) - return docId; - else - numDocsFound++; - } - } - return docId; - } - - /** - * return the total number of documents created - * - * @return - */ - public int getDocumentsInTotal() { - return fDocumentsInTotalCount; - } - - /** - * return the total number of folders created - * - * @return - */ - public int getFoldersInTotal() { - return fFoldersInTotalCount; - } - - /** - * return the total number of objects created - * - * @return - */ - public int getObjectsInTotal() { - return fDocumentsInTotalCount + fFoldersInTotalCount; - } - - public String createSingleDocument(String folderId) { - fTimeLoggerCreateDoc.reset(); - String objectId = createDocument(folderId, 0, 0); - if (fCleanup) - deleteObject(objectId); - 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; - } - - public void printTimings() { - fTimeLoggerCreateDoc.printTimes(); - fTimeLoggerCreateFolder.printTimes(); - if (fCleanup) - fTimeLoggerDelete.printTimes(); - } - - public void logTimings() { - fTimeLoggerCreateDoc.logTimes(); - fTimeLoggerCreateFolder.logTimes(); - if (fCleanup) - fTimeLoggerDelete.logTimes(); - } - - private void createFolderHierachy(String parentId, int level, int levels, int childrenPerLevel) { - String id = null; - - if (level >= levels) - return; - - log.debug(" create folder for parent id: " + parentId + ", in level " + level + ", max levels " + levels); - - for (int i = 0; i < childrenPerLevel; i++) { - Properties props = createFolderProperties(i, level); - try { - fTimeLoggerCreateFolder.start(); - id = fObjSvc.createFolder(fRepositoryId, props, parentId, null, null, null, null); - if (level == 0) - fTopLevelFoldersCreated.add(id); - } finally { - fTimeLoggerCreateFolder.stop(); - } - - if (id != null) { - ++fFoldersInTotalCount; - createFolderHierachy(id, level + 1, levels, childrenPerLevel); - } - } - for (int j = 0; j < fNoDocumentsToCreate; j++) { - id = createDocument(parentId, j, level); - if (level == 0) - fTopLevelDocsCreated.add(id); - } - } - - private String createFolder(String parentId) { - Properties 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) { - ContentStream contentStream = null; - VersioningState versioningState = VersioningState.NONE; - List<String> policies = null; - Acl addACEs = null; - Acl removeACEs = null; - ExtensionsData extension = null; - - // log.info("create document in folder " + folderId); - Properties props = createDocumentProperties(no, level); - String id = null; - if (fContentSizeInK > 0) - contentStream = createContent(); - 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; - return id; - } - - private void deleteTree() { - - // delete all documents from first level - for (String id : fTopLevelDocsCreated) { - deleteObject(id); - } - - // delete recursively all folders from first level - for (String id : fTopLevelFoldersCreated) { - try { - fTimeLoggerDelete.start(); - fObjSvc.deleteTree(fRepositoryId, id, true, UnfileObject.DELETE, true, null); - } finally { - fTimeLoggerDelete.stop(); - } - } - } - - private void deleteObject(String objectId) { - try { - fTimeLoggerDelete.start(); - fObjSvc.deleteObject(fRepositoryId, objectId, true, null); - } finally { - fTimeLoggerDelete.stop(); - } - } - - private ContentStream createContent() { - ContentStreamImpl content = new ContentStreamImpl(); - content.setFileName("data.txt"); - content.setMimeType("text/plain"); - int len = fContentSizeInK * 1024; // size of document in K - byte[] b = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x0c, 0x0a, - 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x0c, 0x0a }; // 32 - // Bytes - ByteArrayOutputStream ba = new ByteArrayOutputStream(len); - try { - for (int j = 0; j < fContentSizeInK; j++) { - // write 1K of data - for (int i = 0; i < 32; i++) - ba.write(b); - } - } catch (IOException e) { - throw new RuntimeException("Failed to fill content stream with data", e); - } - content.setStream(new ByteArrayInputStream(ba.toByteArray())); - return content; - } - - private Properties createFolderProperties(int no, int level) { - List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>(); - properties.add(fFactory.createPropertyStringData(PropertyIds.NAME, generateFolderNameValue(no, level))); - properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, fFolderTypeId)); - // Generate some property values for custom attributes - for (String stringPropId : fStringPropertyIdsToSetForFolder) { - properties.add(fFactory.createPropertyStringData(stringPropId, generateStringPropValueFolder())); - } - Properties props = fFactory.createPropertiesData(properties); - return props; - } - - private Properties createDocumentProperties(int no, int level) { - List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>(); - properties.add(fFactory.createPropertyStringData(PropertyIds.NAME, generateDocNameValue(no, level))); - properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, fDocTypeId)); - // Generate some property values for custom attributes - for (String stringPropId : fStringPropertyIdsToSetForDocument) { - properties.add(fFactory.createPropertyStringData(stringPropId, generateStringPropValueDoc())); - } - Properties props = fFactory.createPropertiesData(properties); - return props; - } - - private static synchronized int incrementPropCounterDocStringProp() { - return PROPVALCOUNTER_DOC_STRING_PROP++; - } - - private static synchronized int incrementPropCounterFolderStringProp() { - return PROPVALCOUNTER_FOLDER_STRING_PROP++; - } - - private String generateDocNameValue(int no, int level) { - if (fUseUuids) - return UUID.randomUUID().toString(); - else - return NAMEPROPVALPREFIXDOC + level + "-" + no; - } - - private String generateFolderNameValue(int no, int level) { - if (fUseUuids) - return UUID.randomUUID().toString(); - else - return NAMEPROPVALPREFIXFOLDER + level + "-" + no; - } - - private static String generateStringPropValueDoc() { - return STRINGPROPVALPREFIXDOC + incrementPropCounterDocStringProp(); - } - - private static String generateStringPropValueFolder() { - return STRINGPROPVALPREFIXFOLDER + incrementPropCounterFolderStringProp(); - } - - public void dumpFolder(String folderId, String propertyFilter) { - log.info("starting dumpFolder() id " + folderId + " ..."); - boolean allRequiredPropertiesArePresent = propertyFilter != null && propertyFilter.equals("*"); // can - // be - // optimized - final String requiredProperties = allRequiredPropertiesArePresent ? propertyFilter : PropertyIds.OBJECT_ID - + "," + PropertyIds.NAME + "," + PropertyIds.OBJECT_TYPE_ID + "," + PropertyIds.BASE_TYPE_ID; - // if all required properties are contained in the filter use we use the - // filter otherwise - // we use our own set and get those from the filter later in an extra - // call - String propertyFilterIntern = allRequiredPropertiesArePresent ? propertyFilter : requiredProperties; - dumpFolder(folderId, propertyFilterIntern, 0); - } - - private void dumpFolder(String folderId, String propertyFilter, int depth) { - boolean allRequiredPropertiesArePresent = propertyFilter.equals("*"); // can - // be - // optimized - StringBuilder prefix = new StringBuilder(); - for (int i = 0; i < depth; i++) - prefix.append(" "); - - ObjectInFolderList result = fNavSvc.getChildren(fRepositoryId, folderId, propertyFilter, null, false, - IncludeRelationships.NONE, null, true, BigInteger.valueOf(-1), BigInteger.valueOf(-1), null); - List<ObjectInFolderData> folders = result.getObjects(); - if (null != folders) { - log.info(prefix + "found " + folders.size() + " children in folder " + folderId); - int no = 0; - for (ObjectInFolderData folder : folders) { - log.info(prefix.toString() + ++no + ": found object with id: " + folder.getObject().getId() - + " and path segment: " + folder.getPathSegment()); - dumpObjectProperties(folder.getObject(), depth, propertyFilter, !allRequiredPropertiesArePresent); - String objectTypeBaseId = folder.getObject().getBaseTypeId().value(); - if (objectTypeBaseId.equals(BaseTypeId.CMIS_FOLDER.value())) { - dumpFolder(folder.getObject().getId(), propertyFilter, depth + 1); - } else if (objectTypeBaseId.equals(BaseTypeId.CMIS_DOCUMENT.value())) { - dumpObjectProperties(folder.getObject(), depth + 1, propertyFilter, - !allRequiredPropertiesArePresent); - } - } - } - log.info(""); // add empty line - } - - private void dumpObjectProperties(ObjectData object, int depth, String propertyFilter, boolean mustFetchProperties) { - final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - StringBuilder prefix = new StringBuilder(); - for (int i = 0; i < depth; i++) - prefix.append(" "); - - log.info(prefix + "found object id " + object.getId()); - Map<String, PropertyData<?>> propMap; - if (mustFetchProperties) { - String objId = (String) object.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue(); - Properties props = fObjSvc.getProperties(fRepositoryId, objId, propertyFilter, null); - propMap = props.getProperties(); - } else { - propMap = object.getProperties().getProperties(); - } - StringBuilder valueStr = new StringBuilder("["); - for (Map.Entry<String, PropertyData<?>> entry : propMap.entrySet()) { - if (entry.getValue().getValues().size() > 1) { - if (entry.getValue().getFirstValue() instanceof GregorianCalendar) { - for (Object obj : entry.getValue().getValues()) { - GregorianCalendar cal = (GregorianCalendar) obj; - valueStr.append(df.format(cal.getTime()) + ", "); - } - valueStr.append("]"); - } else { - valueStr = new StringBuilder(entry.getValue().getValues().toString()); - } - } else { - Object value = entry.getValue().getFirstValue(); - if (null != value) { - valueStr = new StringBuilder(value.toString()); - if (value instanceof GregorianCalendar) { - valueStr = new StringBuilder(df.format(((GregorianCalendar) entry.getValue().getFirstValue()) - .getTime())); - } - } - } - log.info(prefix + entry.getKey() + ": " + valueStr); - } - log.info(""); // add empty line - } + private static Log log = LogFactory.getLog(ObjectGenerator.class); + private BindingsObjectFactory fFactory; + NavigationService fNavSvc; + ObjectService fObjSvc; + private String fRepositoryId; + private TimeLogger fTimeLoggerCreateDoc; + private TimeLogger fTimeLoggerCreateFolder; + private TimeLogger fTimeLoggerDelete; + private boolean fCleanup; + List<String> fTopLevelDocsCreated; // list of ids created on first level + List<String> fTopLevelFoldersCreated; // list of ids created on first level + + /** + * Indicates if / how many documents are created in each folder + */ + private int fNoDocumentsToCreate; + + /** + * The type id of the document id that is created. + */ + private String fDocTypeId = BaseTypeId.CMIS_DOCUMENT.value(); + + /** + * The type id of the folder that is created. + */ + private String fFolderTypeId = BaseTypeId.CMIS_FOLDER.value(); + + /** + * A list of property ids. For each element in this list a String property + * value is created for each creation of a document. All ids must be valid + * string property id of the type fDocTypeId + */ + private List<String> fStringPropertyIdsToSetForDocument; + + /** + * A list of property ids. For each element in this list a String property + * value is created for each creation of a folder. All ids must be valid + * string property id of the type fFolderTypeId + */ + private List<String> fStringPropertyIdsToSetForFolder; + + /** + * number of documents created in total + */ + private int fDocumentsInTotalCount = 0; + + /** + * number of folders created in total + */ + private int fFoldersInTotalCount = 0; + + /** + * size of content in KB, if 0 create documents without content + */ + 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 "; + private static final String STRINGPROPVALPREFIXFOLDER = "My Folder StringProperty "; + private static int PROPVALCOUNTER_DOC_STRING_PROP = 0; + private static int PROPVALCOUNTER_FOLDER_STRING_PROP = 0; + /** + * use UUIDs to generate folder and document names + */ + private boolean fUseUuids; + + public ObjectGenerator(BindingsObjectFactory factory, NavigationService navSvc, ObjectService objSvc, + String repositoryId) { + super(); + fFactory = factory; + fNavSvc = navSvc; + fObjSvc = objSvc; + fRepositoryId = repositoryId; + // create an empty list of properties to generate by default for folder + // and document + fStringPropertyIdsToSetForDocument = new ArrayList<String>(); + fStringPropertyIdsToSetForFolder = new ArrayList<String>(); + fNoDocumentsToCreate = 0; + fUseUuids = false; + fTimeLoggerCreateDoc = new TimeLogger("createDocument()"); + fTimeLoggerCreateFolder = new TimeLogger("createFolder()"); + fTimeLoggerDelete = new TimeLogger("Delete"); + fCleanup = false; + fTopLevelDocsCreated = new ArrayList<String>(); + fTopLevelFoldersCreated = new ArrayList<String>(); + } + + public void setNumberOfDocumentsToCreatePerFolder(int noDocumentsToCreate) { + fNoDocumentsToCreate = noDocumentsToCreate; + } + + public void setFolderTypeId(String folderTypeId) { + fFolderTypeId = folderTypeId; + } + + public void setDocumentTypeId(String docTypeId) { + fDocTypeId = docTypeId; + } + + public void setDocumentPropertiesToGenerate(List<String> propertyIds) { + fStringPropertyIdsToSetForDocument = propertyIds; + } + + public void setFolderPropertiesToGenerate(List<String> propertyIds) { + fStringPropertyIdsToSetForFolder = propertyIds; + } + + public void setContentSizeInKB(int sizeInK) { + fContentSizeInK = sizeInK; + } + + public void setCleanUpAfterCreate(boolean doCleanup) { + 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(); + fTimeLoggerCreateFolder.reset(); + fTopLevelFoldersCreated.clear(); + fTopLevelDocsCreated.clear(); + createFolderHierachy(rootFolderId, 0, levels, childrenPerLevel); + if (fCleanup) + deleteTree(); + } + + public void setUseUuidsForNames(boolean useUuids) { + /** + * use UUIDs to generate folder and document names + */ + fUseUuids = useUuids; + } + + /** + * retrieve the index-th folder from given level of the hierarchy starting + * at rootId + * + * @param rootId + * @param level + * @param index + * @return + */ + public String getFolderId(String rootId, int level, int index) { + String objectId = rootId; + final String requiredProperties = PropertyIds.OBJECT_ID + "," + PropertyIds.OBJECT_TYPE_ID + "," + + PropertyIds.BASE_TYPE_ID; + // Note: This works because first folders are created then documents + for (int i = 0; i < level; i++) { + ObjectInFolderList result = fNavSvc.getChildren(fRepositoryId, objectId, requiredProperties, + PropertyIds.OBJECT_TYPE_ID, false, IncludeRelationships.NONE, null, true, BigInteger.valueOf(-1), + BigInteger.valueOf(-1), null); + List<ObjectInFolderData> children = result.getObjects(); + ObjectData child = children.get(index).getObject(); + objectId = (String) child.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue(); + } + return objectId; + } + + /** + * retrieve the index-th document from given folder + * + * @param folderId + * folder to retrieve document from + * @param index + * index of document to retrieve from this folder + * @return + */ + public String getDocumentId(String folderId, int index) { + String docId = null; + final String requiredProperties = PropertyIds.OBJECT_ID + "," + PropertyIds.OBJECT_TYPE_ID + "," + + PropertyIds.BASE_TYPE_ID; + ObjectInFolderList result = fNavSvc.getChildren(fRepositoryId, folderId, requiredProperties, + PropertyIds.OBJECT_TYPE_ID, false, IncludeRelationships.NONE, null, true, BigInteger.valueOf(-1), + BigInteger.valueOf(-1), null); + List<ObjectInFolderData> children = result.getObjects(); + int numDocsFound = 0; + for (int i = 0; i < children.size(); i++) { + ObjectData child = children.get(i).getObject(); + docId = (String) child.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue(); + if (child.getBaseTypeId().equals(BaseTypeId.CMIS_DOCUMENT)) { + if (numDocsFound == index) + return docId; + else + numDocsFound++; + } + } + return docId; + } + + /** + * return the total number of documents created + * + * @return + */ + public int getDocumentsInTotal() { + return fDocumentsInTotalCount; + } + + /** + * return the total number of folders created + * + * @return + */ + public int getFoldersInTotal() { + return fFoldersInTotalCount; + } + + /** + * return the total number of objects created + * + * @return + */ + public int getObjectsInTotal() { + return fDocumentsInTotalCount + fFoldersInTotalCount; + } + + public String createSingleDocument(String folderId) { + fTimeLoggerCreateDoc.reset(); + String objectId = createDocument(folderId, 0, 0); + if (fCleanup) + deleteObject(objectId); + 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; + } + + public void printTimings() { + fTimeLoggerCreateDoc.printTimes(); + fTimeLoggerCreateFolder.printTimes(); + if (fCleanup) + fTimeLoggerDelete.printTimes(); + } + + public void logTimings() { + fTimeLoggerCreateDoc.logTimes(); + fTimeLoggerCreateFolder.logTimes(); + if (fCleanup) + fTimeLoggerDelete.logTimes(); + } + + private void createFolderHierachy(String parentId, int level, int levels, int childrenPerLevel) { + String id = null; + + if (level >= levels) + return; + + log.debug(" create folder for parent id: " + parentId + ", in level " + level + ", max levels " + levels); + + for (int i = 0; i < childrenPerLevel; i++) { + Properties props = createFolderProperties(i, level); + try { + fTimeLoggerCreateFolder.start(); + id = fObjSvc.createFolder(fRepositoryId, props, parentId, null, null, null, null); + if (level == 0) + fTopLevelFoldersCreated.add(id); + } finally { + fTimeLoggerCreateFolder.stop(); + } + + if (id != null) { + ++fFoldersInTotalCount; + createFolderHierachy(id, level + 1, levels, childrenPerLevel); + } + } + for (int j = 0; j < fNoDocumentsToCreate; j++) { + id = createDocument(parentId, j, level); + if (level == 0) + fTopLevelDocsCreated.add(id); + } + } + + private String createFolder(String parentId) { + Properties 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) { + ContentStream contentStream = null; + VersioningState versioningState = VersioningState.NONE; + List<String> policies = null; + Acl addACEs = null; + Acl removeACEs = null; + ExtensionsData extension = null; + + // log.info("create document in folder " + folderId); + Properties props = createDocumentProperties(no, level); + String id = null; + if (fContentSizeInK > 0) + contentStream = createContent(); + 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; + return id; + } + + private void deleteTree() { + + // delete all documents from first level + for (String id : fTopLevelDocsCreated) { + deleteObject(id); + } + + // delete recursively all folders from first level + for (String id : fTopLevelFoldersCreated) { + try { + fTimeLoggerDelete.start(); + fObjSvc.deleteTree(fRepositoryId, id, true, UnfileObject.DELETE, true, null); + } finally { + fTimeLoggerDelete.stop(); + } + } + } + + private void deleteObject(String objectId) { + try { + fTimeLoggerDelete.start(); + fObjSvc.deleteObject(fRepositoryId, objectId, true, null); + } finally { + fTimeLoggerDelete.stop(); + } + } + + private ContentStream createContent() { + ContentStreamImpl content = new ContentStreamImpl(); + content.setFileName("data.txt"); + content.setMimeType("text/plain"); + int len = fContentSizeInK * 1024; // size of document in K + byte[] b = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x0c, 0x0a, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x0c, 0x0a }; // 32 + // Bytes + ByteArrayOutputStream ba = new ByteArrayOutputStream(len); + try { + for (int j = 0; j < fContentSizeInK; j++) { + // write 1K of data + for (int i = 0; i < 32; i++) + ba.write(b); + } + } catch (IOException e) { + throw new RuntimeException("Failed to fill content stream with data", e); + } + content.setStream(new ByteArrayInputStream(ba.toByteArray())); + return content; + } + + private Properties createFolderProperties(int no, int level) { + List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>(); + properties.add(fFactory.createPropertyStringData(PropertyIds.NAME, generateFolderNameValue(no, level))); + properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, fFolderTypeId)); + // Generate some property values for custom attributes + for (String stringPropId : fStringPropertyIdsToSetForFolder) { + properties.add(fFactory.createPropertyStringData(stringPropId, generateStringPropValueFolder())); + } + Properties props = fFactory.createPropertiesData(properties); + return props; + } + + private Properties createDocumentProperties(int no, int level) { + List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>(); + properties.add(fFactory.createPropertyStringData(PropertyIds.NAME, generateDocNameValue(no, level))); + properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, fDocTypeId)); + // Generate some property values for custom attributes + for (String stringPropId : fStringPropertyIdsToSetForDocument) { + properties.add(fFactory.createPropertyStringData(stringPropId, generateStringPropValueDoc())); + } + Properties props = fFactory.createPropertiesData(properties); + return props; + } + + private static synchronized int incrementPropCounterDocStringProp() { + return PROPVALCOUNTER_DOC_STRING_PROP++; + } + + private static synchronized int incrementPropCounterFolderStringProp() { + return PROPVALCOUNTER_FOLDER_STRING_PROP++; + } + + private String generateDocNameValue(int no, int level) { + if (fUseUuids) + return UUID.randomUUID().toString(); + else + return NAMEPROPVALPREFIXDOC + level + "-" + no; + } + + private String generateFolderNameValue(int no, int level) { + if (fUseUuids) + return UUID.randomUUID().toString(); + else + return NAMEPROPVALPREFIXFOLDER + level + "-" + no; + } + + private static String generateStringPropValueDoc() { + return STRINGPROPVALPREFIXDOC + incrementPropCounterDocStringProp(); + } + + private static String generateStringPropValueFolder() { + return STRINGPROPVALPREFIXFOLDER + incrementPropCounterFolderStringProp(); + } + + public void dumpFolder(String folderId, String propertyFilter) { + log.info("starting dumpFolder() id " + folderId + " ..."); + boolean allRequiredPropertiesArePresent = propertyFilter != null && propertyFilter.equals("*"); // can + // be + // optimized + final String requiredProperties = allRequiredPropertiesArePresent ? propertyFilter : PropertyIds.OBJECT_ID + + "," + PropertyIds.NAME + "," + PropertyIds.OBJECT_TYPE_ID + "," + PropertyIds.BASE_TYPE_ID; + // if all required properties are contained in the filter use we use the + // filter otherwise + // we use our own set and get those from the filter later in an extra + // call + String propertyFilterIntern = allRequiredPropertiesArePresent ? propertyFilter : requiredProperties; + dumpFolder(folderId, propertyFilterIntern, 0); + } + + private void dumpFolder(String folderId, String propertyFilter, int depth) { + boolean allRequiredPropertiesArePresent = propertyFilter.equals("*"); // can + // be + // optimized + StringBuilder prefix = new StringBuilder(); + for (int i = 0; i < depth; i++) + prefix.append(" "); + + ObjectInFolderList result = fNavSvc.getChildren(fRepositoryId, folderId, propertyFilter, null, false, + IncludeRelationships.NONE, null, true, BigInteger.valueOf(-1), BigInteger.valueOf(-1), null); + List<ObjectInFolderData> folders = result.getObjects(); + if (null != folders) { + log.info(prefix + "found " + folders.size() + " children in folder " + folderId); + int no = 0; + for (ObjectInFolderData folder : folders) { + log.info(prefix.toString() + ++no + ": found object with id: " + folder.getObject().getId() + + " and path segment: " + folder.getPathSegment()); + dumpObjectProperties(folder.getObject(), depth, propertyFilter, !allRequiredPropertiesArePresent); + String objectTypeBaseId = folder.getObject().getBaseTypeId().value(); + if (objectTypeBaseId.equals(BaseTypeId.CMIS_FOLDER.value())) { + dumpFolder(folder.getObject().getId(), propertyFilter, depth + 1); + } else if (objectTypeBaseId.equals(BaseTypeId.CMIS_DOCUMENT.value())) { + dumpObjectProperties(folder.getObject(), depth + 1, propertyFilter, + !allRequiredPropertiesArePresent); + } + } + } + log.info(""); // add empty line + } + + private void dumpObjectProperties(ObjectData object, int depth, String propertyFilter, boolean mustFetchProperties) { + final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + StringBuilder prefix = new StringBuilder(); + for (int i = 0; i < depth; i++) + prefix.append(" "); + + log.info(prefix + "found object id " + object.getId()); + Map<String, PropertyData<?>> propMap; + if (mustFetchProperties) { + String objId = (String) object.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue(); + Properties props = fObjSvc.getProperties(fRepositoryId, objId, propertyFilter, null); + propMap = props.getProperties(); + } else { + propMap = object.getProperties().getProperties(); + } + StringBuilder valueStr = new StringBuilder("["); + for (Map.Entry<String, PropertyData<?>> entry : propMap.entrySet()) { + if (entry.getValue().getValues().size() > 1) { + if (entry.getValue().getFirstValue() instanceof GregorianCalendar) { + for (Object obj : entry.getValue().getValues()) { + GregorianCalendar cal = (GregorianCalendar) obj; + valueStr.append(df.format(cal.getTime()) + ", "); + } + valueStr.append("]"); + } else { + valueStr = new StringBuilder(entry.getValue().getValues().toString()); + } + } else { + Object value = entry.getValue().getFirstValue(); + if (null != value) { + valueStr = new StringBuilder(value.toString()); + if (value instanceof GregorianCalendar) { + valueStr = new StringBuilder(df.format(((GregorianCalendar) entry.getValue().getFirstValue()) + .getTime())); + } + } + } + log.info(prefix + entry.getKey() + ": " + valueStr); + } + log.info(""); // add empty line + } }
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/TimeLogger.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/TimeLogger.java?rev=936943&r1=936942&r2=936943&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/TimeLogger.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-util/src/main/java/org/apache/chemistry/opencmis/util/repository/TimeLogger.java Thu Apr 22 16:34:53 2010 @@ -30,228 +30,228 @@ import org.apache.commons.logging.LogFac * */ public class TimeLogger { - private static Log LOG = LogFactory.getLog(TimeLogger.class); + 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 for action " + fAction + ": "); - 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 for action " + fAction + ": "); - 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; - } - - //////////////////////////////////////////////////////////////////////////// - // //////// - // - // 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; - } + 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 for action " + fAction + ": "); + 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 for action " + fAction + ": "); + 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; + } + + // ////////////////////////////////////////////////////////////////////////// + // //////// + // + // 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; - } + return totalTime; + } }
