/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright 2006 - 2009 Pentaho Corporation. All rights reserved.
*
*/
package org.pentaho.test.platform.plugin.services.cache;
import java.io.File;
import java.math.BigDecimal;
import junit.framework.Assert;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.pentaho.platform.api.engine.ICacheManager;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.test.platform.engine.core.BaseTest;
@SuppressWarnings("nls")
public class CacheManagerTest extends BaseTest {
private static final String SOLUTION_PATH = "cache/test-src/solution";
private static final String ALT_SOLUTION_PATH = "test-src/solution";
private static final String PENTAHO_XML_PATH = "/system/pentahoObjects.spring.xml";
@Override
public String getSolutionPath() {
File file = new File(SOLUTION_PATH + PENTAHO_XML_PATH);
if(file.exists()) {
System.out.println("File exist returning " + SOLUTION_PATH);
return SOLUTION_PATH;
} else {
System.out.println("File does not exist returning " + ALT_SOLUTION_PATH);
return ALT_SOLUTION_PATH;
}
}
// private final StringBuffer longString = new StringBuffer();
public void testCache() {
// Make sure we have a cache first...
ICacheManager cacheManager = PentahoSystem.getCacheManager(null); // TODO sbarkdull, need to get real session in here
Assert.assertNotNull(cacheManager);
Assert.assertTrue(cacheManager.cacheEnabled());
// Test Session Based Caching
StandaloneSession userSession1 = new StandaloneSession(
"Standalone Session", "1234-5678-90"); //$NON-NLS-1$ //$NON-NLS-2$
StandaloneSession userSession2 = new StandaloneSession(
"Standalone Session", "abc-def-ghi-jkl"); //$NON-NLS-1$ //$NON-NLS-2$
// ================================ Create Objects
// User Objects
// Cache any-old String...
String user1StringObject = "User1's String Object"; //$NON-NLS-1$
// Make sure we can cache these Document objects...
Document user1Document = DocumentHelper.createDocument();
Element user1RootNode = user1Document.addElement("user1"); //$NON-NLS-1$
Element user1FileNode = user1RootNode.addElement("file"); //$NON-NLS-1$
user1FileNode.addAttribute("name", "test"); //$NON-NLS-1$ //$NON-NLS-2$
String user1CompareXMLOriginal = user1Document.asXML();
// User2's Objects
// Cache any-old String...
String user2StringObject = "User2's String Object"; //$NON-NLS-1$
Document user2Document = DocumentHelper.createDocument();
Element user2RootNode = user2Document.addElement("user2"); //$NON-NLS-1$
Element user2FileNode = user2RootNode.addElement("folder"); //$NON-NLS-1$
user2FileNode.addAttribute("name", "test2"); //$NON-NLS-1$ //$NON-NLS-2$
String user2CompareXMLOriginal = user2Document.asXML();
// Global Objects
Integer globalInt = new Integer(372);
BigDecimal globalBigDecimal = new BigDecimal("2342.123334444211"); //$NON-NLS-1$
StringBuffer globalStringBuffer = new StringBuffer();
globalStringBuffer
.append("This is a really long string to stick in a string buffer"); //$NON-NLS-1$
// Ok - we now have some stuff to jam into the cache.
cacheManager.putInSessionCache(userSession1,
"StringObject", user1StringObject); //$NON-NLS-1$
cacheManager.putInSessionCache(userSession1, "repoDoc", user1Document); //$NON-NLS-1$
cacheManager.putInSessionCache(userSession2,
"StringObject", user2StringObject); //$NON-NLS-1$
cacheManager.putInSessionCache(userSession2, "repoDoc", user2Document); //$NON-NLS-1$
// Get them back out
Object user1CachedStringObject = cacheManager.getFromSessionCache(
userSession1, "StringObject"); //$NON-NLS-1$
Assert.assertEquals(user1StringObject, (String) user1CachedStringObject);
Object user1CachedDocument = cacheManager.getFromSessionCache(
userSession1, "repoDoc"); //$NON-NLS-1$
String user1CompareXMLCached = ((Document) user1CachedDocument).asXML();
Assert.assertEquals(user1CompareXMLOriginal, user1CompareXMLCached);
Object user2CachedStringObject = cacheManager.getFromSessionCache(
userSession2, "StringObject"); //$NON-NLS-1$
Assert
.assertEquals(user2StringObject,
(String) user2CachedStringObject);
Object user2CachedDocument = cacheManager.getFromSessionCache(
userSession2, "repoDoc"); //$NON-NLS-1$
String user2CompareXMLCached = ((Document) user2CachedDocument).asXML();
Assert.assertEquals(user2CompareXMLOriginal, user2CompareXMLCached);
// OK - We've verified that their objects are unique to each individual
// user.
// Test Removals from session only
// Remove a single user-session based object.
cacheManager.removeFromSessionCache(userSession1, "StringObject"); //$NON-NLS-1$
// Try to get it back anyway.
Object notThere = cacheManager.getFromSessionCache(userSession1,
"StringObject"); //$NON-NLS-1$
Assert.assertNull(notThere);
// Make sure that User2 is unaffected
Object shouldBeThere = cacheManager.getFromSessionCache(userSession2,
"StringObject"); //$NON-NLS-1$
Assert.assertNotNull(shouldBeThere);
// Kill user1's session
cacheManager.killSessionCache(userSession1);
notThere = cacheManager.getFromSessionCache(userSession1, "repoDoc"); //$NON-NLS-1$
Assert.assertNull(notThere);
// Make sure that User2 is still unaffected
shouldBeThere = cacheManager.getFromSessionCache(userSession2,
"StringObject"); //$NON-NLS-1$
Assert.assertNotNull(shouldBeThere);
// Test Global Caching
// Put stuff in
cacheManager.putInGlobalCache("globalIntegerKey", globalInt); //$NON-NLS-1$
cacheManager.putInGlobalCache("globalBigDecimalKey", globalBigDecimal); //$NON-NLS-1$
cacheManager.putInGlobalCache(
"globalStringBufferKey", globalStringBuffer); //$NON-NLS-1$
Object cachedGlobalInt = cacheManager
.getFromGlobalCache("globalIntegerKey"); //$NON-NLS-1$
Assert.assertEquals(globalInt, cachedGlobalInt);
Object cachedGlobalBigDecimal = cacheManager
.getFromGlobalCache("globalBigDecimalKey"); //$NON-NLS-1$
Assert.assertEquals(globalBigDecimal, cachedGlobalBigDecimal);
Object cachedGlobalStringBuffer = cacheManager
.getFromGlobalCache("globalStringBufferKey"); //$NON-NLS-1$
Assert.assertEquals(globalStringBuffer, cachedGlobalStringBuffer);
// Test clear all session-based keys. This should leave the global stuff
// alone.
cacheManager.killSessionCaches();
notThere = cacheManager.getFromSessionCache(userSession2,
"StringObject"); //$NON-NLS-1$
Assert.assertNull(notThere);
notThere = cacheManager.getFromSessionCache(userSession2, "repoDoc"); //$NON-NLS-1$
Assert.assertNull(notThere);
shouldBeThere = cacheManager.getFromGlobalCache("globalIntegerKey"); //$NON-NLS-1$
Assert.assertNotNull(shouldBeThere);
// Totally clear out the cache.
cacheManager.clearCache();
notThere = cacheManager.getFromGlobalCache("globalIntegerKey"); //$NON-NLS-1$
Assert.assertNull(notThere);
notThere = cacheManager.getFromGlobalCache("globalBigDecimalKey"); //$NON-NLS-1$
Assert.assertNull(notThere);
notThere = cacheManager.getFromGlobalCache("globalStringBufferKey"); //$NON-NLS-1$
Assert.assertNull(notThere);
cacheManager.addCacheRegion(ICacheManager.GLOBAL);
// Force cache overload - make sure it spools objects to disk...
// Assumes cache size is set to 2000 objects maximum.
for (int i = 0; i < 10000; i++) {
String someCachedString = "This is the string to cache " + i; //$NON-NLS-1$
String someCachedKey = "SomeCachedKey" + i; //$NON-NLS-1$
if ((i % 1000) == 0) {
sleep(5);
}
cacheManager.putInGlobalCache(someCachedKey, someCachedString);
}
// Let cache stabalize, and decide what hasn't been used for a while.
// 15 seconds should do it.
sleep(15);
// Get first item from the cache...
shouldBeThere = cacheManager.getFromGlobalCache("SomeCachedKey1"); //$NON-NLS-1$
Assert.assertEquals(shouldBeThere, "This is the string to cache 1"); //$NON-NLS-1$
// Get middle item from the cache...
shouldBeThere = cacheManager.getFromGlobalCache("SomeCachedKey5000"); //$NON-NLS-1$
Assert.assertEquals(shouldBeThere, "This is the string to cache 5000"); //$NON-NLS-1$
// Get last item from the cache...
shouldBeThere = cacheManager.getFromGlobalCache("SomeCachedKey999"); //$NON-NLS-1$
Assert.assertEquals(shouldBeThere, "This is the string to cache 999"); //$NON-NLS-1$
// Clear cache again...
cacheManager.clearCache();
// Make sure...
notThere = cacheManager.getFromGlobalCache("SomeCachedKey2"); //$NON-NLS-1$
Assert.assertNull(notThere);
notThere = cacheManager.getFromGlobalCache("SomeCachedKey5002"); //$NON-NLS-1$
Assert.assertNull(notThere);
notThere = cacheManager.getFromGlobalCache("SomeCachedKey998"); //$NON-NLS-1$
Assert.assertNull(notThere);
// Done with tests.
}
public static void main(final String[] args) {
CacheManagerTest test = new CacheManagerTest();
try {
test.testCache();
} finally {
}
}
private void sleep(final int time) {
try {
System.out.println("***** Sleeping for " + time + " seconds *****"); //$NON-NLS-1$ //$NON-NLS-2$
Thread.sleep(time * 1000);
} catch (Exception ignored) {
}
}
}