/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* 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:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.services.repository.internal;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.FactoryBean;
import org.eclipse.virgo.kernel.services.internal.KernelServicesLogEvents;
import org.eclipse.virgo.medic.eventlog.EventLogger;
import org.eclipse.virgo.repository.ArtifactBridge;
import org.eclipse.virgo.repository.Repository;
import org.eclipse.virgo.repository.RepositoryCreationException;
import org.eclipse.virgo.repository.RepositoryFactory;
import org.eclipse.virgo.repository.configuration.PropertiesRepositoryConfigurationReader;
import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
import org.eclipse.virgo.repository.configuration.RepositoryConfigurationException;
import org.eclipse.virgo.util.math.OrderedPair;
public final class RepositoryFactoryBean implements FactoryBean<Repository> {
private final Properties repositoryProperties;
private final EventLogger eventLogger;
private final RepositoryFactory repositoryFactory;
private volatile Repository repository;
private final File workDirectory;
private final Set<ArtifactBridge> artifactBridges;
private final String mBeanDomain;
public RepositoryFactoryBean(Properties repositoryProperties, EventLogger eventLogger, RepositoryFactory repositoryFactory, File workDirectory,
Set<ArtifactBridge> artifactBridges, String mBeanDomain) {
this.repositoryProperties = repositoryProperties;
this.eventLogger = eventLogger;
this.repositoryFactory = repositoryFactory;
this.workDirectory = workDirectory;
this.artifactBridges = artifactBridges;
this.mBeanDomain = mBeanDomain;
}
public Repository getObject() throws Exception {
if (this.repository == null) {
this.repository = createRepository();
}
return this.repository;
}
public Class<? extends Repository> getObjectType() {
return Repository.class;
}
public boolean isSingleton() {
return true;
}
public void destroy() {
Repository localRepository = this.repository;
if (localRepository != null) {
this.repository = null;
localRepository.stop();
}
}
private Repository createRepository() throws RepositoryConfigurationException, RepositoryCreationException {
PropertiesRepositoryConfigurationReader configurationReader = new PropertiesRepositoryConfigurationReader(this.workDirectory,
this.artifactBridges, this.eventLogger, this.mBeanDomain);
OrderedPair<Map<String, RepositoryConfiguration>, List<String>> configurations = configurationReader.readConfiguration(this.repositoryProperties);
Map<String, RepositoryConfiguration> configurationMap = configurations.getFirst();
List<String> chainList = configurations.getSecond();
if (chainList.isEmpty()) {
this.eventLogger.log(KernelServicesLogEvents.KERNEL_REPOSITORY_CHAIN_EMPTY);
return new EmptyRepository(); // no chain
}
List<RepositoryConfiguration> repositoryConfigurationChain = new ArrayList<RepositoryConfiguration>(chainList.size());
for (String repositoryName : chainList) {
RepositoryConfiguration repositoryConfiguration = configurationMap.get(repositoryName);
if (repositoryConfiguration == null) {
this.eventLogger.log(KernelServicesLogEvents.KERNEL_REPOSITORY_CHAIN_ENTRY_NOT_VALID, repositoryName);
throw new RepositoryConfigurationException("Cannot resolve repository '" + repositoryName + "' in chain.");
}
repositoryConfigurationChain.add(repositoryConfiguration);
}
return repositoryFactory.createRepository(repositoryConfigurationChain);
}
}