/**
* 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.Properties;
import javax.jcr.Credentials;
import javax.jcr.LoginException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.RepositoryFactory;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Workspace;
import org.drools.repository.util.ClassUtil;
/**
* This abstract class is required so different JCR implementations can provide their own configuration mechanism.
*
* This contains code to initialise the repository using the {@link javax.jcr.RepositoryFactory} interface defined by the JCR 2.0
* specification. This configurator loads the properties from the {@link PROPERTIES_FILE "/drools_repository.properties"}
* resource, and passes these to the {@link javax.jcr.RepositoryFactory#getRepository(java.util.Map)}.
*
* @author Michael Neale
*/
public abstract class JCRRepositoryConfigurator {
protected RepositoryFactory factory;
protected Repository repository;
public static final String JCR_IMPL_CLASS = "org.drools.repository.jcr.impl";
protected static String defaultJCRImplClass = null;
public static final String REPOSITORY_ROOT_DIRECTORY = "repository.root.directory";
/**
* @return a new Repository instance. There should only be one instance of this in an application. Generally, one repository
* (which may be binded to JNDI) can spawn multiple sessions for each user as needed. Typically this would be created
* on application startup.
* @param repositoryRootDirectory The directory where the data is stored. If empty, the repository will be generated there the
* first time it is used. If it is null, then a default location will be used (it won't fail).
*/
public Repository getJCRRepository( Properties properties ) throws RepositoryException {
try {
String jcrImplementationClass = properties.getProperty(JCR_IMPL_CLASS);
//Instantiate real repo.
if (jcrImplementationClass==null) {
jcrImplementationClass = defaultJCRImplClass;
}
// Use the JCR 2.0 RepositoryFactory to get a repository using the properties as input ...
// We're not yet supporting JSE 1.6, so until then this needs to stay commented out
// for (RepositoryFactory factory : ServiceLoader.load(RepositoryFactory.class)) {
// Repository repo = factory.getRepository(properties);
// if (repo != null) {
// this.factory = factory;
// return repo;
// }
// }
Class<?> jcrFactory = ClassUtil.forName(jcrImplementationClass, this.getClass());
RepositoryFactory factory = (RepositoryFactory) jcrFactory.newInstance();
repository = factory.getRepository(properties);
this.factory = factory;
return repository;
} catch (Exception re) {
throw new RepositoryException(re);
}
// If here, then we couldn't find a repository factory ...
// String msg = "Unable to find an appropriate JCR 2.0 RepositoryFactory; check the 'drools_repository.properties' configuration file.";
// throw new RepositoryException(msg);
}
public abstract Session login(String userName) throws LoginException,RepositoryException;
public Session login (String userName, String password) throws RepositoryException {
Credentials credentials = new SimpleCredentials(userName, password.toCharArray());
return repository.login( credentials );
}
public abstract void registerNodeTypesFromCndFile(String cndFileName, Session session, Workspace workspace) throws RepositoryException;
/**
* Method called when the JCR implementation is no longer needed.
*/
public abstract void shutdown();
}