/**
* Copyright 2010 JBoss Inc
*
* Licensed 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.drools.repository;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.UnsupportedRepositoryOperationException;
import org.drools.repository.AssetItem;
import org.drools.repository.RulesRepository;
import org.drools.repository.RulesRepositoryException;
import org.drools.repository.VersionableItem;
import org.junit.Ignore;
import org.junit.Test;
import junit.framework.TestCase;
/**
* This is a bit of a hacked scalability test.
* It will add 5000 odd rule nodes, and then do some basic operations.
* It will take a LONG time to add these nodes, and does it in batches.
*
*/
public class ScalabilityTest extends RepositoryTestCase {
private static final int NUM = 5000;
private RulesRepository repo;
@Test
public void testDummy() {
}
@Test @Ignore
public void xxtestRun() throws Exception {
Properties properties = new Properties();
properties.put(JCRRepositoryConfigurator.REPOSITORY_ROOT_DIRECTORY, "./scalabilityTestRepo");
RulesRepositoryConfigurator config = RulesRepositoryConfigurator.getInstance(properties);
Session session = config.getJCRRepository().login(
new SimpleCredentials("alan_parsons", "password".toCharArray()));
config.setupRepository(session);
repo = new RulesRepository(session);
long start = System.currentTimeMillis();
setupData( repo );
System.out.println("time to add, version and tag 5000: " + (System.currentTimeMillis() - start));
List list = listACat(repo);
System.out.println("list size is: " + list.size());
start = System.currentTimeMillis();
AssetItem item = (AssetItem) list.get( 0 );
item.updateContent( "this is a description" );
item.checkin( "newer" );
System.out.println("time to update and version: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
item = (AssetItem) list.get( 42 );
item.updateContent( "this is a description" );
item.updateContent( "wooooooooooooooooooooooooooooooooooot" );
item.checkin( "latest" );
System.out.println("time to update and version: " + (System.currentTimeMillis() - start));
}
// /** This tests it "bare" just setting properties on node types directly. */
// public void xxxtestBare() throws Exception {
// hackit();
// }
private List listACat(RulesRepository repo) {
long start = System.currentTimeMillis();
List results = repo.findAssetsByCategory( "HR/CAT_1", 0, -1 ).assets;
System.out.println("Time for listing a cat: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
List results2 = repo.findAssetsByCategory( "HR/CAT_1", 0, -1 ).assets;
System.out.println("Time for listing a cat: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
results2 = repo.findAssetsByCategory( "HR/CAT_100", 0, -1 ).assets;
System.out.println("Time for listing a cat: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
results2 = repo.findAssetsByCategory( "HR/CAT_100", 0, -1 ).assets;
System.out.println("Time for listing a cat: " + (System.currentTimeMillis() - start));
return results;
}
/** To run this, need to hack the addRule method to not save a session */
private void setupData(RulesRepository repo) throws Exception {
int count = 1;
List list = new ArrayList();
String prefix = "HR/";
String cat = prefix + "CAT_1";
for (int i=1; i <= NUM; i++ ) {
if (i % 500 == 0) {
repo.getSession().save();
for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
AssetItem element = (AssetItem) iter.next();
element.getNode().checkin();
}
list.clear();
}
if (i > 2500) {
prefix = "FINANCE/";
}
if (count == 100) {
count = 1;
cat = prefix + "CAT_" + i;
System.err.println("changing CAT");
System.gc();
} else {
count++;
}
String ruleName = "rule_" + i + "_" + System.currentTimeMillis();
System.out.println("ADDING rule: " + ruleName);
AssetItem item = repo.loadDefaultPackage().addAsset( ruleName, "Foo(bar == " + i + ")panic(" + i + ");" );
item.addCategory( cat );
list.add( item );
}
}
// private void hackit() throws Exception {
//
//
// RulesRepository repo = new RulesRepository(true);
// Session session = repo.getSession();
//
//
// Node folderNode = session.getRootNode().getNode("drools:repository/drools:rule_area");
//
// for (int i=1 ; i <= 50; i++) {
//
// System.out.println("doing: Rule " + i);
//
// //create the node - see section 6.7.22.6 of the spec
// Node ruleNode = folderNode.addNode("Rule_" + i, RuleItem.RULE_NODE_TYPE_NAME );
//
// ruleNode.setProperty(RuleItem.TITLE_PROPERTY_NAME, "Rule_" + i);
//
// //TODO: set this property correctly once we've figured out logging in / JAAS
// ruleNode.setProperty(RuleItem.CONTRIBUTOR_PROPERTY_NAME, "not yet implemented");
//
// ruleNode.setProperty(RuleItem.DESCRIPTION_PROPERTY_NAME, "");
// ruleNode.setProperty(RuleItem.FORMAT_PROPERTY_NAME, RuleItem.RULE_FORMAT);
// ruleNode.setProperty(RuleItem.LHS_PROPERTY_NAME, "LHS_" + i);
// ruleNode.setProperty(RuleItem.RHS_PROPERTY_NAME, "RHS_" + i);
// ruleNode.setProperty( VersionableItem.CHECKIN_COMMENT, "Initial" );
//
//
// Calendar lastModified = Calendar.getInstance();
// ruleNode.setProperty(RuleItem.LAST_MODIFIED_PROPERTY_NAME, lastModified);
// if (i % 500 == 0) {
// System.out.println("saving......");
// session.save();
// System.out.println("finished.");
// }
// }
//
// }
}