/**
* 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.io.File;
import javax.jcr.LoginException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This is a utility to simulate session behavior for the test suite.
*
* @author Michael Neale
*/
public class RepositorySessionUtil {
private static ThreadLocal<RulesRepository> repo = new ThreadLocal<RulesRepository>();
private static Repository multiThreadedRepository;
private static Session session = null;
private static final Logger log = LoggerFactory.getLogger(RepositorySessionUtil.class);
// private static final Logger log = Logger.getLogger( RepositorySessionUtil.class );
public static boolean deleteDir( File dir ) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
if (!deleteDir(new File(dir, children[i]))) {
return false;
}
}
}
// The directory is now empty so delete it
return dir.delete();
}
public static RulesRepository getRepository() throws RulesRepositoryException {
RulesRepository repoInstance = repo.get();
if (repoInstance == null) {
log.info("Creating a new Repository Instance..");
File dir = new File("repository");
log.info("DELETING test repo: " + dir.getAbsolutePath());
deleteDir(dir);
log.info("TEST repo was deleted.");
try {
//configurator = new JackrabbitRepository
// create a repo instance (startup)
multiThreadedRepository = RulesRepositoryConfigurator.getInstance(null).getJCRRepository();
// create a session
//Session session;
session = multiThreadedRepository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(session);
// clear out and setup
if (admin.isRepositoryInitialized()) {
admin.clearRulesRepository();
}
RulesRepositoryConfigurator.getInstance(null).setupRepository(session);
repoInstance = new RulesRepository(session);
multiThreadedRepository.login(new SimpleCredentials("ADMINISTRATOR", "password".toCharArray()));
// loonie hack
// DroolsRepositoryAccessManager.adminThreadlocal.set( adminSession );
repo.set(repoInstance);
} catch (Exception e) {
throw new RulesRepositoryException(e);
}
}
return repoInstance;
}
public static synchronized RulesRepository getMultiThreadedRepository() throws RulesRepositoryException {
if (multiThreadedRepository == null) {
File dir = new File("repository");
log.info("DELETING test repo: " + dir.getAbsolutePath());
deleteDir(dir);
log.info("TEST repo was deleted.");
try {
// create a repo instance (startup)
multiThreadedRepository = RulesRepositoryConfigurator.getInstance(null).getJCRRepository();
// create a session to config repo
Session session = multiThreadedRepository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(session);
// clear out and setup
if (admin.isRepositoryInitialized()) {
admin.clearRulesRepository();
}
RulesRepositoryConfigurator.getInstance(null).setupRepository( session);
} catch (Exception e) {
throw new RulesRepositoryException(e);
}
}
// associate this repo instance with thread specific sessions every time.
Session session;
try {
session = multiThreadedRepository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
RulesRepository threadLocalRepo = new RulesRepository(session);
return threadLocalRepo;
} catch (LoginException e) {
e.printStackTrace();
} catch (RepositoryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void shutdown() throws RepositoryException {
RulesRepositoryConfigurator.getInstance(null).shutdown();
repo.set(null);
multiThreadedRepository = null;
}
}