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=934907&r1=934906&r2=934907&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
 Fri Apr 16 14:21:47 2010
@@ -50,557 +50,567 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 /**
- * A simple helper class for the tests that generates a sample folder 
hierarchy and
- * optionally documents in it.
+ * A simple helper class for the tests that generates a sample folder hierarchy
+ * and optionally documents in it.
  * 
  * @author Jens
- *
+ * 
  */
 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=934907&r1=934906&r2=934907&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
 Fri Apr 16 14:21:47 2010
@@ -24,234 +24,234 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 /**
- * Simple utility class for time logging
- * Note: NOT thread safe!
+ * 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 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;
+               }
+
+               return totalTime;
+       }
 
-  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; 
-  }
-  
 }


Reply via email to