/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.load.perf;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
import org.exoplatform.services.jcr.util.IdGenerator;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import javax.jcr.Node;
/**
* Created by The eXo Platform SAS Author : Vitaliy Obmanjuk vitaliy.obmanjuk@exoplatform.com.ua
* 20.07.2006
*
* @version $Id: TestPerformance.java 34801 2009-07-31 15:44:50Z dkatayev $
*/
public class TestPerformance extends JcrAPIBaseTest
{
private Node testRoot = null;
private int NODES_COUNT_SHORT_SESSION = 30;
private int NODES_COUNT_LONG_SESSION = 300;
private static String TEST_FILE = null;
public void setUp() throws Exception
{
super.setUp();
session.refresh(false);
if (!(root.hasNode("testRoot")))
{
testRoot = root.addNode("testRoot", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_LONG_SESSION; i++)
{
testRoot.addNode("setUpNode" + i, "nt:base");
}
root.save();
log.info("" + NODES_COUNT_LONG_SESSION + " nodes added");
}
else
{
testRoot = root.getNode("testRoot");
}
}
public void tearDown() throws Exception
{
}
// defaults:
// NODES_COUNT_SHORT_SESSION
// nt:unstructured
public void testAddNodeOfTypeNtBaseShortSession() throws Exception
{
float time = 0;
Node testAddNodeOfTypeNtBase = testRoot.addNode("testAddNodeOfTypeNtBase", "nt:unstructured");
long startTime = System.currentTimeMillis();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testAddNodeOfTypeNtBase.addNode("NodeOfTypeNtBase#" + i, "nt:base");
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testAddNodeOfTypeNtBase.remove();
session.save();
log.info("[1.1 addNode short session ] average time: " + time + "ms");
}
public void testSetPropertyShortSession() throws Exception
{
float time = 0;
Node testSetProperty = testRoot.addNode("testSetProperty", "nt:unstructured");
long startTime = System.currentTimeMillis();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testSetProperty.setProperty("testProperty" + i, "1234567890");
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testSetProperty.remove();
session.save();
log.info("[2.1 setProperty short session ] average time: " + time + "ms");
}
public void testAddMixReferenceableToNodeOfTypeNtBaseShortSession() throws Exception
{
float time = 0;
Node testAddMixReferenceableToNodeOfTypeNtBase =
testRoot.addNode("testAddMixReferenceableToNodeOfTypeNtBase", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testAddMixReferenceableToNodeOfTypeNtBase.addNode("NodeOfTypeNtBase#" + i, "nt:base");
nodesList.add(tmpNode);
}
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.addMixin("mix:referenceable");
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testAddMixReferenceableToNodeOfTypeNtBase.remove();
session.save();
log.info("[3.1 add mix:referenceable short session ] average time: " + time + "ms");
}
public void testSaveNodesShortSession() throws Exception
{
float time = 0;
Node testSaveNodesShortSession = testRoot.addNode("testSaveNodesShortSession", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testSaveNodesShortSession.addNode("NodeOfTypeNtBase#" + i, "nt:base");
}
long startTime = System.currentTimeMillis();
session.save();
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testSaveNodesShortSession.remove();
session.save();
log.info("[4.1 nodes saving short session.save ] average time: " + time + "ms");
}
public void testSaveNodesLongSession() throws Exception
{
float time = 0;
Node testSaveNodesLongSession = testRoot.addNode("testSaveNodesLongSession", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_LONG_SESSION; i++)
{
testSaveNodesLongSession.addNode("NodeOfTypeNtBase#" + i, "nt:base");
}
long startTime = System.currentTimeMillis();
session.save();
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_LONG_SESSION);
testSaveNodesLongSession.remove();
session.save();
log.info("[4.2 nodes saving long session.save ] average time: " + time + "ms");
}
public void testSavePropertiesShortSession() throws Exception
{
float time = 0;
Node testSavePropertiesShortSession = testRoot.addNode("testSavePropertiesShortSession", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testSavePropertiesShortSession.setProperty("testProperty" + i, IdGenerator.generate());
}
long startTime = System.currentTimeMillis();
session.save();
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testSavePropertiesShortSession.remove();
session.save();
log.info("[5.1 properties saving short session.save ] average time: " + time + "ms");
}
public void testSavePropertiesLongSession() throws Exception
{
float time = 0;
Node testSavePropertiesLongSession = testRoot.addNode("testSavePropertiesLongSession", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_LONG_SESSION; i++)
{
testSavePropertiesLongSession.setProperty("testProperty" + i, IdGenerator.generate());
}
long startTime = System.currentTimeMillis();
session.save();
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_LONG_SESSION);
testSavePropertiesLongSession.remove();
session.save();
log.info("[5.2 properties saving long session.save ] average time: " + time + "ms");
}
public void testAddVersionableMixinShortSession() throws Exception
{
float time = 0;
Node testAddVersionableMixin = testRoot.addNode("testAddVersionableMixin", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testAddVersionableMixin.addNode("NodeOfTypeNtBase#" + i, "nt:base");
nodesList.add(tmpNode);
}
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.addMixin("mix:versionable");
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testAddVersionableMixin.remove();
session.save();
log.info("[6.1 add mix:versionable short session ] average time: " + time + "ms");
}
public void testCheckinShortSession() throws Exception
{
float time = 0;
Node testCheckin = testRoot.addNode("testCheckin", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testRoot.addNode("NodeOfTypeNtUnstructured#" + i, "nt:unstructured");
tmpNode.addMixin("mix:versionable");
nodesList.add(tmpNode);
}
session.save();
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.checkin();
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
// to make node removeable
for (Node tmpNode : nodesList)
{
tmpNode.checkout();
}
testCheckin.remove();
session.save();
log.info("[7.1 checkin short session ] average time: " + time + "ms");
}
public void testCheckoutShortSession() throws Exception
{
float time = 0;
Node testCheckout = testRoot.addNode("testCheckout", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testCheckout.addNode("NodeOfTypeNtUnstructured#" + i, "nt:unstructured");
tmpNode.addMixin("mix:versionable");
session.save();
tmpNode.checkin();
nodesList.add(tmpNode);
}
session.save();
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.checkout();
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testCheckout.remove();
session.save();
log.info("[8.1 checkout short session ] average time: " + time + "ms");
}
public void testRemoveNodesShortSession() throws Exception
{
float time = 0;
Node testRemoveNodes = testRoot.addNode("testRemoveNodes", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testRemoveNodes.addNode("NodeOfTypeNtUnstructured#" + i, "nt:unstructured");
nodesList.add(tmpNode);
}
// session.save();
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.remove();
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testRemoveNodes.remove();
session.save();
log.info("[9.1 remove nodes short session ] average time: " + time + "ms");
}
public void testRemovePropertiesShortSession() throws Exception
{
float time = 0;
Node testRemoveProperties = testRoot.addNode("testRemoveProperties", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testRemoveProperties.addNode("NodeOfTypeNtUnstructured#" + i, "nt:unstructured");
tmpNode.setProperty("testProperty", IdGenerator.generate());
nodesList.add(tmpNode);
}
// session.save();
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.getProperty("testProperty").remove();
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testRemoveProperties.remove();
session.save();
log.info("[9.2 remove properties short session ] average time: " + time + "ms");
}
public void testSaveRemovedNodesShortSession() throws Exception
{
float time = 0;
Node testSaveRemovedNodes = testRoot.addNode("testSaveRemovedNodes", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testSaveRemovedNodes.addNode("NodeOfTypeNtUnstructured#" + i, "nt:unstructured");
nodesList.add(tmpNode);
}
session.save();
for (Node tmpNode : nodesList)
{
tmpNode.remove();
}
long startTime = System.currentTimeMillis();
session.save();
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testSaveRemovedNodes.remove();
session.save();
log.info("[10.1 save removed nodes short session ] average time: " + time + "ms");
}
public void testSaveRemovedPropertiesShortSession() throws Exception
{
float time = 0;
Node testSaveRemovedNodes = testRoot.addNode("testSaveRemovedNodes", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testSaveRemovedNodes.addNode("NodeOfTypeNtUnstructured#" + i, "nt:unstructured");
tmpNode.setProperty("testProperty", IdGenerator.generate());
nodesList.add(tmpNode);
}
session.save();
for (Node tmpNode : nodesList)
{
tmpNode.getProperty("testProperty").remove();
}
long startTime = System.currentTimeMillis();
session.save();
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testSaveRemovedNodes.remove();
session.save();
log.info("[10.2 save removed properties short session ] average time: " + time + "ms");
}
public void testLockShortSession() throws Exception
{
float time = 0;
Node testLock = testRoot.addNode("testLock", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testLock.addNode("NodeOfTypeNtUnstructuredLock#" + i, "nt:unstructured");
tmpNode.addMixin("mix:lockable");
nodesList.add(tmpNode);
}
session.save();
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.lock(true, true);
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
// to make node removeable
for (Node tmpNode : nodesList)
{
tmpNode.unlock();
}
testLock.remove();
session.save();
log.info("[11.1 lock short session ] average time: " + time + "ms");
}
public void testUnlockShortSession() throws Exception
{
float time = 0;
Node testUnlock = testRoot.addNode("testUnlock", "nt:unstructured");
ArrayList<Node> nodesList = new ArrayList<Node>();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
Node tmpNode = testUnlock.addNode("NodeOfTypeNtUnstructuredUnLock#" + i, "nt:unstructured");
tmpNode.addMixin("mix:lockable");
session.save();
tmpNode.lock(true, true);
nodesList.add(tmpNode);
}
session.save();
long startTime = System.currentTimeMillis();
for (Node tmpNode : nodesList)
{
tmpNode.unlock();
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testUnlock.remove();
session.save();
log.info("[12.1 unlock short session ] average time: " + time + "ms");
}
public void testComplexOperationsAddNtFilePlusNtResource() throws Exception
{
// variables for the execution time
int FILE_SIZE = 100;// 100 K
Node testAddNtFilePlusNtResource = testRoot.addNode("testAddNtFilePlusNtResource", "nt:unstructured");
TEST_FILE = createBLOBTempFile(FILE_SIZE).getAbsolutePath();
long startTime = System.currentTimeMillis();
for (int i = 0; i < NODES_COUNT_SHORT_SESSION; i++)
{
String name = new String("nnn-" + i);
Node cool = testAddNtFilePlusNtResource.addNode(name, "nt:file");
Node contentNode = cool.addNode("jcr:content", "nt:resource");
contentNode.setProperty("jcr:encoding", "UTF-8");
InputStream is = new FileInputStream(TEST_FILE);
contentNode.setProperty("jcr:data", is);
contentNode.setProperty("jcr:mimeType", "text/plain");
contentNode.setProperty("jcr:lastModified", session.getValueFactory().createValue(Calendar.getInstance()));
is.close();
}
long endTime = System.currentTimeMillis();
log.info("[13.1 adding nt:file ] average time: "
+ ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION) + "ms");
try
{
startTime = System.currentTimeMillis();
session.save();
endTime = System.currentTimeMillis();
log.info("[13.2 saving nt:file ] average time: "
+ ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION) + "ms");
}
catch (Exception e)
{
log.error(e);
fail("Error Save!!!");
}
testAddNtFilePlusNtResource.remove();
session.save();
}
public void testGetNodeOfTypeNtBaseShortSession() throws Exception
{
float time = 0;
Node testAddNodeOfTypeNtBase = testRoot.addNode("testAddNodeOfTypeNtBase", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testAddNodeOfTypeNtBase.addNode("NodeOfTypeNtBase#" + i, "nt:base");
}
long startTime = System.currentTimeMillis();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testAddNodeOfTypeNtBase.getNode("NodeOfTypeNtBase#" + i);
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testAddNodeOfTypeNtBase.remove();
session.save();
log.info("[14.1 getNode short session ] average time: " + time + "ms");
}
public void testGetPropertyShortSession() throws Exception
{
float time = 0;
Node testSetProperty = testRoot.addNode("testSetProperty", "nt:unstructured");
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testSetProperty.setProperty("testProperty" + i, "1234567890");
}
long startTime = System.currentTimeMillis();
for (int i = 1; i < NODES_COUNT_SHORT_SESSION; i++)
{
testSetProperty.getProperty("testProperty" + i);
}
long endTime = System.currentTimeMillis();
time += ((float)((endTime - startTime)) / NODES_COUNT_SHORT_SESSION);
testSetProperty.remove();
session.save();
log.info("[15.1 getProperty short session ] average time: " + time + "ms");
}
// jcr 1.5 case
// protected File createBLOBTempFile(int sizeInKb) throws IOException {
// return createBLOBTempFile("exo_jcr_test_temp_file_", sizeInKb);
// }
//
// protected File createBLOBTempFile(String prefix, int sizeInKb) throws IOException {
// // create test file
// int BUFFER_SIZE = 1024; // 1KB
// byte SYMBOL = 65; // symbol A
// byte[] data = new byte[BUFFER_SIZE]; // 1KB
// Arrays.fill(data, (byte) SYMBOL); // symbol A
// File testFile = File.createTempFile(prefix, ".tmp");
// FileOutputStream tempOut = new FileOutputStream(testFile);
// for (int i = 0; i < sizeInKb; i++) {
// tempOut.write(data);
// }
// tempOut.close();
// testFile.deleteOnExit(); // delete on test exit
// log.info("Temp file created: " + testFile.getAbsolutePath() + " size: " + testFile.length());
// return testFile;
// }
}