/*
* Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stephane Lacoin
*/
package org.nuxeo.ecm.core.test;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.runners.model.FrameworkMethod;
import org.nuxeo.ecm.core.api.ClientException;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.PathRef;
import org.nuxeo.ecm.core.event.EventService;
import org.nuxeo.ecm.core.test.annotations.BackendType;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfigs;
import org.nuxeo.ecm.core.test.annotations.RepositoryInit;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.RuntimeFeature;
import org.nuxeo.runtime.test.runner.SimpleFeature;
import com.google.inject.Binder;
import com.google.inject.Scopes;
import com.google.inject.name.Names;
@Deploy({
"org.nuxeo.ecm.core.schema",
"org.nuxeo.ecm.core.query",
"org.nuxeo.ecm.core.api",
"org.nuxeo.ecm.core.event",
"org.nuxeo.ecm.core",
"org.nuxeo.ecm.core.convert",
"org.nuxeo.ecm.core.storage.sql",
"org.nuxeo.ecm.core.storage.sql.test"
})
@Features(RuntimeFeature.class)
public class MultiRepositoriesCoreFeature extends SimpleFeature {
private static final Log log = LogFactory.getLog(CoreFeature.class);
private final Map<String,RepositorySettings> repositories =
new HashMap<String,RepositorySettings>();
public RepositorySettings getRepository(String name) {
return repositories.get(name);
}
public BackendType getBackendType(String name) {
return repositories.get(name).getBackendType();
}
protected void setupRepos(FeaturesRunner runner) {
RepositoryConfigs configs = runner.getDescription().getAnnotation(RepositoryConfigs.class);
if (configs == null) {
RepositorySettings repo = new RepositorySettings(runner);
repositories.put(repo.repositoryName, repo);
} else {
for (RepositoryConfig config:configs.value()) {
RepositorySettings repository = new RepositorySettings(runner, config);
repositories.put(repository.repositoryName, repository);
}
}
}
@Override
public void initialize(FeaturesRunner runner)
throws Exception {
setupRepos(runner);
// for (RepositorySettings repo:repositories.values()) {
// runner.getFeature(RuntimeFeature.class).addServiceProvider(CoreSession.class, repo);
// }
}
@Override
public void start(FeaturesRunner runner) throws Exception {
for (RepositorySettings repository:repositories.values()) {
repository.initialize();
}
}
@Override
public void configure(FeaturesRunner runner, Binder binder) {
for (RepositorySettings repository:repositories.values()) {
binder.bind(RepositorySettings.class).
annotatedWith(Names.named(repository.repositoryName)).
toInstance(repository);
binder.bind(CoreSession.class).
annotatedWith(Names.named(repository.repositoryName)).
toProvider(repository).in(Scopes.SINGLETON);
}
}
@Override
public void beforeRun(FeaturesRunner runner) throws Exception {
for (RepositorySettings repository:repositories.values()) {
initializeSession(runner, repository);
}
}
@Override
public void afterRun(FeaturesRunner runner) throws Exception {
//TODO cleanupSession(runner);
Framework.getService(EventService.class).waitForAsyncCompletion();
for (RepositorySettings repository:repositories.values()) {
repository.shutdown();
}
}
@Override
public void afterMethodRun(FeaturesRunner runner, FrameworkMethod method,
Object test) throws Exception {
for (RepositorySettings repository:repositories.values()) {
if (repository.getGranularity() == Granularity.METHOD) {
cleanupSession(runner, repository);
}
}
}
protected void cleanupSession(FeaturesRunner runner, RepositorySettings repository) {
CoreSession session = runner.getInjector().getInstance(CoreSession.class);
try {
session.removeChildren(new PathRef("/"));
} catch (ClientException e) {
log.error("Unable to reset repository", e);
}
initializeSession(runner, repository);
}
protected void initializeSession(FeaturesRunner runner, RepositorySettings repository) {
CoreSession session = repository.get();
RepositoryInit initializer = repository.getInitializer();
if (initializer == null) {
return;
}
try {
initializer.populate(session);
session.save();
} catch (ClientException e) {
throw new RuntimeException("Cannot populate repository", e);
}
}
public void setRepositorySettings(RepositorySettings settings) {
repositories.clear();
repositories.put(settings.repositoryName, settings);
}
}