/**
* This file Copyright (c) 2003-2012 Magnolia International
* Ltd. (http://www.magnolia-cms.com). All rights reserved.
*
*
* This file is dual-licensed under both the Magnolia
* Network Agreement and the GNU General Public License.
* You may elect to use one or the other of these licenses.
*
* This file is distributed in the hope that it will be
* useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
* Redistribution, except as permitted by whichever of the GPL
* or MNA you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or
* modify this file under the terms of the GNU General
* Public License, Version 3, as published by the Free Software
* Foundation. You should have received a copy of the GNU
* General Public License, Version 3 along with this program;
* if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 2. For the Magnolia Network Agreement (MNA), this file
* and the accompanying materials are made available under the
* terms of the MNA which accompanies this distribution, and
* is available at http://www.magnolia-cms.com/mna.html
*
* Any modifications to this file must keep this entire header
* intact.
*
*/
package info.magnolia.test;
import info.magnolia.cms.beans.config.ContentRepository;
import info.magnolia.cms.core.Path;
import info.magnolia.cms.core.SystemProperty;
import info.magnolia.cms.security.DummyUser;
import info.magnolia.cms.util.ClasspathResourcesUtil;
import info.magnolia.context.MgnlContext;
import info.magnolia.context.SystemRepositoryStrategy;
import info.magnolia.importexport.BootstrapUtil;
import info.magnolia.objectfactory.Components;
import info.magnolia.test.mock.MockContext;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.jcr.ImportUUIDBehavior;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
/**
* Superclass for Tests requiring access to a real jcr repo.
* Make sure to call super.setUp() + super.tearDown() when overriding the methods provided in this class.
*
* Caution: since Magnolia 4.5 this is a JUnit-4 style test.
*
* @author ashapochka
*/
public abstract class RepositoryTestCase extends MgnlTestCase {
protected static final String REPO_CONF_PROPERTY = "magnolia.repositories.config";
protected static final String JACKRABBIT_REPO_CONF_PROPERTY = "magnolia.repositories.jackrabbit.config";
protected static final String EXTRACTED_REPO_CONF_FILE = "target/repositories.xml";
protected static final String EXTRACTED_JACKRABBIT_REPO_CONF_FILE = "target/repo-conf/extracted.xml";
private boolean autoStart = true;
private String repositoryConfigFileName;
private String jackrabbitRepositoryConfigFileName;
private boolean quiet = true;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
if (isAutoStart()) {
cleanUp();
startRepository();
}
}
protected void modifyContextesToUseRealRepository() {
// create a mock web context with same repository acquiring strategy as the system context
MockContext systemContext = (MockContext) MgnlContext.getSystemContext();
SystemRepositoryStrategy repositoryStrategy = Components.newInstance(SystemRepositoryStrategy.class);
systemContext.setRepositoryStrategy(repositoryStrategy);
MockContext ctx = (MockContext) MgnlContext.getInstance();
ctx.setRepositoryStrategy(repositoryStrategy);
systemContext.setUser(new DummyUser());
ctx.setUser(new DummyUser());
}
protected void startRepository() throws Exception {
final Logger logger = Logger.getLogger("info.magnolia");
final Level originalLogLevel = logger.getLevel();
if (this.isQuiet()) {
logger.setLevel(Level.WARN);
}
// why was this needed ?
// ContentRepository.REPOSITORY_USER = SystemProperty.getProperty("magnolia.connection.jcr.userId");
// ContentRepository.REPOSITORY_PSWD = SystemProperty.getProperty("magnolia.connection.jcr.password");
extractConfigFile(REPO_CONF_PROPERTY, getRepositoryConfigFileStream(), EXTRACTED_REPO_CONF_FILE);
extractConfigFile(JACKRABBIT_REPO_CONF_PROPERTY, getJackrabbitRepositoryConfigFileStream(), EXTRACTED_JACKRABBIT_REPO_CONF_FILE);
ContentRepository.init();
modifyContextesToUseRealRepository();
logger.setLevel(originalLogLevel);
}
protected void extractConfigFile(String propertyName, InputStream configFileStream, String extractToPath) throws Exception {
String targetFilename = Path.getAbsoluteFileSystemPath(extractToPath);
File targetFile = new File(targetFilename);
// extract resource to the filesystem (jackrabbit can't use a stream)
new File(targetFile.getParent()).mkdirs();
IOUtils.copy(configFileStream, new FileOutputStream(targetFile));
SystemProperty.setProperty(propertyName, extractToPath);
}
protected InputStream getRepositoryConfigFileStream() throws Exception {
String configFile = getRepositoryConfigFileName();
final URL resource = ClasspathResourcesUtil.getResource(configFile);
if (resource == null) {
throw new IllegalStateException("Resource not found: " + configFile);
}
return resource.openStream();
}
protected InputStream getJackrabbitRepositoryConfigFileStream() throws Exception {
String configFile = getJackrabbitRepositoryConfigFileName();
return ClasspathResourcesUtil.getResource(configFile).openStream();
}
protected String getRepositoryConfigFileName() {
if (StringUtils.isEmpty(repositoryConfigFileName)) {
repositoryConfigFileName = SystemProperty.getProperty(REPO_CONF_PROPERTY);
}
return repositoryConfigFileName;
}
protected String getJackrabbitRepositoryConfigFileName() {
if (StringUtils.isEmpty(jackrabbitRepositoryConfigFileName)) {
jackrabbitRepositoryConfigFileName = SystemProperty.getProperty(JACKRABBIT_REPO_CONF_PROPERTY);
}
return jackrabbitRepositoryConfigFileName;
}
@Override
@After
public void tearDown() throws Exception {
if (isAutoStart()) {
shutdownRepository(true);
}
super.tearDown();
}
protected void shutdownRepository(boolean cleanup) throws IOException {
final Logger logger = Logger.getLogger("info.magnolia");
final Level originalLogLevel = logger.getLevel();
if (this.isQuiet()) {
logger.setLevel(Level.WARN);
}
MgnlContext.release();
MgnlContext.getSystemContext().release();
ContentRepository.shutdown();
if (cleanup) {
cleanUp();
}
logger.setLevel(originalLogLevel);
}
protected void cleanUp() throws IOException {
FileUtils.deleteDirectory(new File(SystemProperty.getProperty("magnolia.repositories.home")));
}
protected void bootstrapSingleResource(String resource) throws Exception {
BootstrapUtil.bootstrap(new String[]{resource}, ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW);
}
protected void bootstrap(ClasspathResourcesUtil.Filter filter) throws Exception {
String[] resourcesToBootstrap = ClasspathResourcesUtil.findResources(filter);
BootstrapUtil.bootstrap(resourcesToBootstrap, ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW);
}
protected boolean isAutoStart() {
return this.autoStart;
}
protected void setAutoStart(boolean autoStart) {
this.autoStart = autoStart;
}
protected void setRepositoryConfigFileName(String repositoryConfigFileName) {
this.repositoryConfigFileName = repositoryConfigFileName;
}
protected void setJackrabbitRepositoryConfigFileName(String jackrabbitRepositoryConfigFileName) {
this.jackrabbitRepositoryConfigFileName = jackrabbitRepositoryConfigFileName;
}
protected boolean isQuiet() {
return this.quiet;
}
protected void setQuiet(boolean quiet) {
this.quiet = quiet;
}
}