blob: 155b355d703d5b9a0cc9471b3b183bcadc61b973 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* 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.apache.jackrabbit.extension;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import javax.jcr.Credentials;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory;
/**
* The <code>ExtensionFrameworkTestBase</code> TODO
*
* @author Felix Meschberger
*/
public class ExtensionFrameworkTestBase extends TestCase {
/** Logger for test cases */
protected static final Log log =
LogFactory.getLog("org.apache.jackrabbit.extension.test");
protected static final String WORKSPACE = "default";
protected static final String USER = "admin";
protected static final String PROVIDER_URL = "ClassLoader";
protected static final String REPOSITORY_NAME = "ClassLoaderRepository";
protected static final String ROOT_NODE = "/services";
protected static final String ID1 = "org.apache.jackrabbit.app.services";
protected static final String ID2 = "org.apache.jackrabbit.test";
protected RepositoryImpl repository;
protected Session session;
public ExtensionFrameworkTestBase() {
super();
}
public ExtensionFrameworkTestBase(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
if (!"repositoryStart".equals(getName())) {
Context ctx = getInitialContext();
repository = (RepositoryImpl) ctx.lookup(REPOSITORY_NAME);
Credentials creds = new SimpleCredentials(USER, USER.toCharArray());
session = repository.login(creds, WORKSPACE);
}
}
public void repositoryStart() throws Exception {
InputStream config = getClass().getResourceAsStream("/repository.xml");
String home = new File("cltest").getAbsolutePath();
RepositoryConfig rc = RepositoryConfig.create(config, home);
RepositoryImpl repository = RepositoryImpl.create(rc);
try {
Context ctx = getInitialContext();
ctx.bind(REPOSITORY_NAME, repository);
} catch (NamingException ne) {
repository.shutdown();
throw ne;
}
}
public void repositoryStop() throws Exception {
// this is special, logout here and clean repository
disconnect();
if (repository != null) {
repository.shutdown();
repository = null;
}
Context ctx = getInitialContext();
ctx.unbind(REPOSITORY_NAME);
}
protected void tearDown() throws Exception {
disconnect();
repository = null;
super.tearDown();
}
private Context getInitialContext() throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
DummyInitialContextFactory.class.getName());
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
}
private void disconnect() {
if (session != null) {
try {
removeTestData(session);
} catch (RepositoryException re) {
// ignore
}
session.logout();
session = null;
}
}
//---------- RepositoryLoader ----------------------------------------------
protected void fillTestData(Session session) throws RepositoryException {
try {
session.getItem(ROOT_NODE).remove();
session.save();
} catch (PathNotFoundException ignore) {
// ok, if root no extisting
}
// make sure the root is available
ensurePath(session, ROOT_NODE);
fillExtension(session, ROOT_NODE+"/delivery/core", ID1, "delivery.core", null, null, null);
fillExtension(session, ROOT_NODE+"/delivery/cache", ID1, "delivery.cache", null, null, null);
fillExtension(session, ROOT_NODE+"/delivery/link", ID1, "delivery.link", null, null, null);
fillExtension(session, ROOT_NODE+"/delivery/script", ID1, "delivery.script", null, null, null);
fillExtension(session, ROOT_NODE+"/delivery/gfx", ID1, "delivery.gfx", null, null, null);
fillExtension(session, ROOT_NODE+"/development/jsp", ID1, "development.jsp", null, null,
"org.apache.jackrabbit.extension.configuration.ItemConfiguration");
fillExtension(session, ROOT_NODE+"/development/ecma", ID1, "development.ecma", null, null, null);
String devCore = ROOT_NODE + "/development/core";
fillExtension(session, devCore, ID1, "development.core",
"org.apache.jackrabbit.extension.DevCoreTest", devCore+"/classes", null);
putClass(session, devCore, "DevCoreTest.class");
// duplicate extension - ok for iterator, not ok for explicit finding
fillExtension(session, ROOT_NODE+"/delivery/gfx2", ID1, "delivery.gfx", null, null, null);
}
protected static void removeTestData(Session session) throws RepositoryException {
session.getItem(ROOT_NODE).remove();
session.save();
}
private static void fillExtension(Session session, String path, String id,
String name, String clazz, String classPath, String configClass)
throws RepositoryException {
// get the extension's node
Node extNode = ensurePath(session, path);
// mark as an extension
extNode.addMixin(ExtensionManager.NODE_EXTENSION_TYPE);
// fill rest
trySetProperty(extNode, ExtensionDescriptor.PROP_REP_NAME, name, false);
trySetProperty(extNode, ExtensionDescriptor.PROP_REP_ID, id, false);
trySetProperty(extNode, ExtensionDescriptor.PROP_REP_CLASS, clazz, false);
trySetProperty(extNode, ExtensionDescriptor.PROP_REP_CLASSPATH, classPath, true);
trySetProperty(extNode, ExtensionDescriptor.PROP_REP_CONFIGURATION_CLASS, configClass, false);
// save the node
extNode.save();
}
protected static Node ensurePath(Session session, String path) throws RepositoryException {
StringTokenizer tokener = new StringTokenizer(path, "/");
Node node = session.getRootNode();
while (tokener.hasMoreTokens()) {
String label = tokener.nextToken();
if (node.hasNode(label)) {
node = node.getNode(label);
} else {
node = node.addNode(label, "nt:unstructured");
}
}
// save all modifications
session.save();
return node;
}
protected static void trySetProperty(Node extNode, String prop, String value,
boolean multiple) throws RepositoryException {
// nothing if no value
if (value == null || value.length() == 0) {
return;
}
// single value
if (!multiple) {
extNode.setProperty(prop, value);
return;
}
// split multivalue on ","
List valueList = new ArrayList();
StringTokenizer tokener = new StringTokenizer(value, ",");
while (tokener.hasMoreTokens()) {
valueList.add(tokener.nextToken());
}
// create value objects
ValueFactory vf = extNode.getSession().getValueFactory();
Value[] values = new Value[valueList.size()];
for (int i=0; i < values.length; i++) {
values[i] = vf.createValue((String) valueList.get(i));
}
// set the property
extNode.setProperty(prop, values);
}
private void putClass(Session session, String extLoc, String cls) throws RepositoryException {
String name = getClass().getName();
int lastDot = name.lastIndexOf('.');
if (lastDot > 0) name = name.substring(0, lastDot);
extLoc += "/classes/" + name.replace('.', '/');
// extLoc += "/classes/" +
// base.getPackage().getName().replace('.', '/');
Node pNode = ensurePath(session, extLoc);
Node file = pNode.addNode(cls, "nt:file");
Node content = file.addNode("jcr:content", "nt:resource");
content.setProperty("jcr:mimeType", "application/octet-stream");
content.setProperty("jcr:lastModified", Calendar.getInstance());
InputStream ins = getClass().getResourceAsStream("/"+cls+".bin");
if (ins != null) {
try {
content.setProperty("jcr:data", ins);
} finally {
try {
ins.close();
} catch (IOException ignore) {}
}
}
pNode.save();
}
}