/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.system.server.profileservice.repository;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.jboss.profileservice.spi.DeploymentRepository;
import org.jboss.profileservice.spi.DeploymentRepositoryFactory;
import org.jboss.profileservice.spi.NoSuchProfileException;
import org.jboss.profileservice.spi.ProfileKey;
import org.jboss.profileservice.spi.ProfileRepository;
import org.jboss.profileservice.spi.metadata.ProfileMetaData;
import org.jboss.profileservice.spi.metadata.ProfileSourceMetaData;
/**
* The profile repository.
*
* This accepts any implementation of DeploymentRepositoryFactory and delegates
* the creation of the repository to one of the installed factories, based on
* the exposed types.
*
* TODO reuse DeploymentRepositories with the same sources ?
*
* @author <a href="mailto:emuckenh@redhat.com">Emanuel Muckenhuber</a>
* @version $Revision: 98983 $
*/
public class TypedProfileRepository implements ProfileRepository
{
/** The repository factories. */
private Map<String, DeploymentRepositoryFactory> repositoryFactories = new ConcurrentHashMap<String, DeploymentRepositoryFactory>();
/** The created repositories. */
private Map<ProfileKey, DeploymentRepository> repositories = new ConcurrentHashMap<ProfileKey, DeploymentRepository>();
public Collection<ProfileKey> getProfileKeys()
{
return this.repositories.keySet();
}
public DeploymentRepository getProfileDeploymentRepository(ProfileKey key) throws NoSuchProfileException
{
DeploymentRepository repository = this.repositories.get(key);
if(repository == null)
throw new NoSuchProfileException("No such repository for profile: " + key);
return repository;
}
public DeploymentRepository createProfileDeploymentRepository(ProfileKey key, ProfileMetaData metaData) throws Exception
{
if(metaData == null)
throw new IllegalArgumentException("Null metaData");
if(metaData.getName() == null)
throw new IllegalArgumentException("Null metaData name");
DeploymentRepository repository = this.repositories.get(key);
if(repository == null)
{
String type = null;
if(metaData.getSource() == null)
throw new IllegalStateException("No profile source.");
// Extract the profile source type
type = metaData.getSource().getType();
if( type == null )
throw new IllegalArgumentException("Null profile source type.");
ProfileSourceMetaData source = metaData.getSource();
// TODO check if there is a conflict with hotdeployment repositories
repository = createProfileDeploymentRepository(key, type , source);
if(repository != null)
{
this.repositories.put(key, repository);
}
}
return repository;
}
protected DeploymentRepository createProfileDeploymentRepository(ProfileKey key, String repositoryType, ProfileSourceMetaData metaData) throws Exception
{
DeploymentRepositoryFactory factory = this.repositoryFactories.get(repositoryType);
if(factory == null)
throw new IllegalStateException("No registered factory for repository type: "+ repositoryType);
// Let the factory create the repository
return factory.createDeploymentRepository(key, metaData);
}
public void removeProfileDeploymentRepository(ProfileKey key) throws Exception, NoSuchProfileException
{
DeploymentRepository repository = this.repositories.remove(key);
if(repository == null)
throw new NoSuchProfileException("No such repository for profile: " + key);
// Remove
repository.remove();
}
public void addRepositoryFactory(DeploymentRepositoryFactory factory)
{
if(factory == null)
throw new IllegalArgumentException("Null factory.");
if(factory.getTypes() == null)
throw new IllegalArgumentException("Empty factory type.");
for(String type : factory.getTypes())
this.repositoryFactories.put(type, factory);
}
public void removeRepositoryFactory(DeploymentRepositoryFactory factory)
{
if(factory == null)
throw new IllegalArgumentException("Null factory.");
if(factory.getTypes() == null)
throw new IllegalArgumentException("Empty factory type.");
for(String type : factory.getTypes())
this.repositoryFactories.remove(type);
}
/**
* InCallback to register a repository bean.
*
* @param repository the deploymentRepository to register
*/
public void registerDeploymentRepository(AbstractDeploymentRepository repository)
{
if(repository == null)
throw new IllegalArgumentException("null deployment repository");
ProfileKey repositoryKey = repository.getProfileKey();
if(repositoryKey == null)
throw new IllegalArgumentException("null profile key");
if(this.repositories.containsKey(repositoryKey))
throw new IllegalStateException("duplicate repository " + repositoryKey);
this.repositories.put(repositoryKey, repository);
}
/**
* UnInCallback to unregister a repository bean.
*
* @param repository the deploymentRepository to unregister
*/
public void unregisterDeploymentRepository(AbstractDeploymentRepository repository)
{
if(repository == null)
throw new IllegalArgumentException("null deployment repository");
ProfileKey repositoryKey = repository.getProfileKey();
if(repositoryKey == null)
throw new IllegalArgumentException("null profile key");
this.unregisterDeploymentRepository(repositoryKey);
}
public void unregisterDeploymentRepository(ProfileKey repositoryKey)
{
if(repositoryKey == null)
throw new IllegalArgumentException("null profile key");
this.repositories.remove(repositoryKey);
}
}