Package org.odftoolkit.simple.integrationtest

Source Code of org.odftoolkit.simple.integrationtest.PerformanceIT

/*
  Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
*/

package org.odftoolkit.simple.integrationtest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.junit.Test;
import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.simple.Document;
import org.odftoolkit.simple.SpreadsheetDocument;
import org.w3c.dom.NodeList;

public class PerformanceIT {

  private static final Logger LOG = Logger.getLogger(PerformanceIT.class.getName());
  private static String TEST_FILE_FOLDER;
  private static String[] TEST_FILE_NAME;
  //private static final String timesheetTemplate = "timesheetTemplate.ods";
  //private static final String memorysheetTemplate = "memorysheetTemplate.ods";
  private double[] totalTime = new double[3];
  private double[] totalLoadTimeForEach = null;
  private double[] totalSaveTimeForEach = null;
  private double[] totalParseTimeForEach = null;
  private double[] memoryfootprint = null;
  private String time_spreadsheet = null;
  private String memory_spreadsheet = null;
  private String REPORT_FILE_FOLDER = null;
  private int count = 1;
  private String testTag = "new test";

  public PerformanceIT() {
    TEST_FILE_FOLDER = PerformanceIT.class.getClassLoader().getResource("").getPath()
        + System.getProperty("testresourcefolder")
        + File.separatorChar;

    testTag = System.getProperty("testflag");
    String executeTimesTest = System.getProperty("executetimes");
    if (executeTimesTest != null) {
      count = Integer.parseInt(executeTimesTest);
    }

    REPORT_FILE_FOLDER = getOutputPath() + File.separatorChar;

    memory_spreadsheet = REPORT_FILE_FOLDER + "memorylog.ods";
    time_spreadsheet = REPORT_FILE_FOLDER + "timelog.ods";

  }

  private String getOutputPath() {
    File rootpath = new File(PerformanceIT.class.getClassLoader().getResource("").getPath());
    File parent = rootpath.getParentFile();
    File outputpath = new File(parent, "performance-reports");
    if (!outputpath.exists()) {
      outputpath.mkdir();
    }
    return outputpath.getPath();
  }

  @Test
  public void testPerformance() {
    try {
      init();
      // 1. Collect Test result
      test();
      // 2. Save to spreadsheet
      writeToLog();
    } catch (Exception e) {
      Logger.getLogger(PerformanceIT.class.getName()).log(Level.SEVERE, null, e);

    }
  }

  private void init() {

    readFileList(TEST_FILE_FOLDER);
    if (TEST_FILE_NAME == null) {
      return;
    }

    totalTime[0] = 0;
    totalTime[1] = 0;
    totalTime[2] = 0;

    totalLoadTimeForEach = new double[TEST_FILE_NAME.length];
    totalSaveTimeForEach = new double[TEST_FILE_NAME.length];
    totalParseTimeForEach = new double[TEST_FILE_NAME.length];
    memoryfootprint = new double[TEST_FILE_NAME.length * 3];

    for (int i = 0; i < TEST_FILE_NAME.length; i++) {
      totalLoadTimeForEach[i] = 0;
      totalSaveTimeForEach[i] = 0;
      totalParseTimeForEach[i] = 0;
      memoryfootprint[3 * i] = 0;
      memoryfootprint[3 * i + 1] = 0;
      memoryfootprint[3 * i + 2] = 0;
    }

  }

  private void readFileList(String folder) {
    String filename;

    LOG.log(Level.INFO, "[PerformaceTest] Reading test documents from {0}", folder);
    File myFolder = new File(folder);
    if (!myFolder.isDirectory()) {
      return;
    }
    File[] files = myFolder.listFiles();
    ArrayList myList = new ArrayList();

    for (int i = 0; i < files.length; i++) {
      filename = files[i].getName();
      if (filename.endsWith("ods") || filename.endsWith("odp") || filename.endsWith("odt")) {
        myList.add(filename);
      }
      //TEST_FILE_NAME[i]=files[i].getName();
      //LOG.info("name="+TEST_FILE_NAME[i]);
    }

    LOG.log(Level.INFO, "[PerformaceTest] {0} test files are loaded", myList.size());
    if (myList.size() > 0) {
      TEST_FILE_NAME = (String[]) myList.toArray(new String[1]);
    }
  }

  private void writeToLog() throws Exception {
    FileInputStream timefile, memoryfile;
    Document timedoc, memorydoc;

    if (TEST_FILE_NAME == null) {
      return;
    }

    try {
      timefile = new FileInputStream(time_spreadsheet);
      timedoc = Document.loadDocument(timefile);
    } catch (FileNotFoundException e) {
      //Create an empty spreadsheet
      timedoc = SpreadsheetDocument.newSpreadsheetDocument();
      OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) timedoc.getContentDom().getElementsByTagNameNS(
          OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
      spreadsheet.removeChild(spreadsheet.getFirstChild());
    }

    try {
      memoryfile = new FileInputStream(memory_spreadsheet);
      memorydoc = Document.loadDocument(memoryfile);
    } catch (FileNotFoundException e) {
      //Create an empty spreadsheet
      memorydoc = SpreadsheetDocument.newSpreadsheetDocument();
      OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) memorydoc.getContentDom().getElementsByTagNameNS(
          OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
      spreadsheet.removeChild(spreadsheet.getFirstChild());
    }

    String[] summaryName = new String[]{"Load All Documents", "Parse All Documents", "Save All Documents"};
    updateTableCells(timedoc, "Summary", totalTime, summaryName);
    updateTableCells(timedoc, "Load ODF", totalLoadTimeForEach, TEST_FILE_NAME);
    updateTableCells(timedoc, "Parse ODF", totalParseTimeForEach, TEST_FILE_NAME);
    updateTableCells(timedoc, "Save ODF", totalSaveTimeForEach, TEST_FILE_NAME);

    String[] memorylabel = new String[TEST_FILE_NAME.length * 3];
    for (int i = 0; i < TEST_FILE_NAME.length; i++) {
      memorylabel[3 * i] = "load " + TEST_FILE_NAME[i];
      memorylabel[3 * i + 1] = "parse " + TEST_FILE_NAME[i];
      memorylabel[3 * i + 2] = "save " + TEST_FILE_NAME[i];
    }
    updateTableCells(memorydoc, "Memory footprint", memoryfootprint, memorylabel);

    timedoc.save(time_spreadsheet);
    LOG.log(Level.INFO, "[PerformaceTest] Test results are written to {0}", time_spreadsheet);
    memorydoc.save(memory_spreadsheet);
    LOG.log(Level.INFO, "[PerformaceTest] Test results are written to {0}", memory_spreadsheet);
  }

  private void updateTableCells(Document odfdoc, String tablename,
      double[] values, String[] labels) {
    int i = 0, j = 0;
    TableTableRowElement td;
    TableTableCellElement cell;
    OdfFileDom dom;
    NodeList tableList;
    TableTableElement myTable;
    NodeList lst;
    OdfTextParagraph p;
    OfficeSpreadsheetElement spreadsheet = null;

    try {
      dom = odfdoc.getContentDom();
      tableList = dom.getElementsByTagNameNS(
          OdfDocumentNamespace.TABLE.getUri(), "table");
      spreadsheet = (OfficeSpreadsheetElement) dom.getElementsByTagNameNS(
          OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);

      i = 0;
      if (tableList.getLength() > 0) {
        for (; i < tableList.getLength(); i++) {
          String currentname = ((TableTableElement) tableList.item(i)).getTableNameAttribute();
          if (currentname == null) {
            currentname = "";
          }
          if (currentname.equalsIgnoreCase(tablename)) {
            break;
          }
        }
      }
      if (i < tableList.getLength()) //table with the specific table name is found
      {
        myTable = (TableTableElement) tableList.item(i);
      } else { //table with the specific table name is not found. Create table
        myTable = dom.newOdfElement(TableTableElement.class);
        myTable.setTableNameAttribute(tablename);
        spreadsheet.appendChild(myTable);
      }

      lst = myTable.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-row");
      if (lst.getLength() == 0) { //the first table row is not existed. Create table row
        td = dom.newOdfElement(TableTableRowElement.class);
        cell = dom.newOdfElement(TableTableCellElement.class);
        p = dom.newOdfElement(OdfTextParagraph.class);
        if (tablename.startsWith("Memory")) {
          p.setTextContent("memory(b)");
        } else {
          p.setTextContent("time(ms)");
        }
        td.appendChild(cell);
        cell.appendChild(p);
        myTable.appendChild(td);
      } else {
        td = (TableTableRowElement) lst.item(0); //the first table row is existed.
      }
      cell = dom.newOdfElement(TableTableCellElement.class);
      td.appendChild(cell);
      p = dom.newOdfElement(OdfTextParagraph.class);
      p.setTextContent(testTag);
      cell.appendChild(p);


      for (i = 1; i < values.length + 1; i++) {
        if (i < lst.getLength()) { //table row is existed
          td = (TableTableRowElement) lst.item(i);
        } else { //table row is not existed.
          td = dom.newOdfElement(TableTableRowElement.class);
          myTable.appendChild(td);
          //append first cell with labels
          cell = dom.newOdfElement(TableTableCellElement.class);
          td.appendChild(cell);
          p = dom.newOdfElement(OdfTextParagraph.class);
          p.setTextContent(labels[j]);
          cell.appendChild(p);
        }
        cell = dom.newOdfElement(TableTableCellElement.class);
        cell.setOfficeValueTypeAttribute("float");
        cell.setOfficeValueAttribute(new Double(values[j]));
        p = dom.newOdfElement(OdfTextParagraph.class);
        p.setTextContent(values[j] + "");
        cell.appendChild(p);
        td.appendChild(cell);
        j++;
      }
    } catch (Exception e) {
      LOG.log(Level.SEVERE, null, e);
    }
  }

  private void firsttry() throws Exception {
    Document doc = null;
    OdfFileDom dom = null;
    String filename = null;

    for (int j = 0; j < TEST_FILE_NAME.length; j++) {
      filename = TEST_FILE_FOLDER + TEST_FILE_NAME[j];
      LOG.log(Level.INFO, "filename:{0}", filename);
      doc = Document.loadDocument(filename);
      dom = doc.getContentDom();
      doc.save(filename);
    }
  }

  private void test() throws Exception {
    long start, end;
    Document doc = null;
    OdfFileDom dom = null;
    String filename = null;

    if (TEST_FILE_NAME == null) {
      return;
    }

    firsttry();

    for (int i = 0; i < count; i++) {
      for (int j = 0; j < TEST_FILE_NAME.length; j++) {
        filename = TEST_FILE_FOLDER + TEST_FILE_NAME[j];
        start = System.currentTimeMillis();
        doc = Document.loadDocument(filename);
        end = System.currentTimeMillis();
        totalLoadTimeForEach[j] += end - start;
        totalTime[0] += end - start;
        if (i == 0) {
          System.gc();
          memoryfootprint[3 * j] = Runtime.getRuntime().totalMemory()
              - Runtime.getRuntime().freeMemory();
        }

        start = System.currentTimeMillis();
        dom = doc.getContentDom();
        end = System.currentTimeMillis();
        totalParseTimeForEach[j] += end - start;
        totalTime[1] += end - start;
        if (i == 0) {
          System.gc();
          memoryfootprint[3 * j + 1] = Runtime.getRuntime().totalMemory()
              - Runtime.getRuntime().freeMemory();
        }

        start = System.currentTimeMillis();
        doc.save(filename);
        end = System.currentTimeMillis();
        totalSaveTimeForEach[j] += end - start;
        totalTime[2] += end - start;

        doc = null;
        dom = null;
        if (i == 0) {
          System.gc();
          memoryfootprint[3 * j + 2] = Runtime.getRuntime().totalMemory()
              - Runtime.getRuntime().freeMemory();
        }
      }
    }

    for (int i = 0; i < 3; i++) {
      totalTime[i] = totalTime[i] / count;
    }

    for (int i = 0; i < TEST_FILE_NAME.length; i++) {
      totalLoadTimeForEach[i] = totalLoadTimeForEach[i] / count;
      totalParseTimeForEach[i] = totalParseTimeForEach[i] / count;
      totalSaveTimeForEach[i] = totalSaveTimeForEach[i] / count;
    }
  }
}
TOP

Related Classes of org.odftoolkit.simple.integrationtest.PerformanceIT

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.