/*
* JBoss, Home of Professional Open Source.
* Copyright 2009, 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;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.jboss.profileservice.spi.ProfileKey;
import org.jboss.profileservice.spi.metadata.ProfileMetaData;
import org.jboss.profileservice.spi.metadata.ProfileSourceMetaData;
import org.jboss.profileservice.spi.metadata.SubProfileMetaData;
import org.jboss.system.server.profile.repository.metadata.BasicProfileMetaData;
import org.jboss.system.server.profile.repository.metadata.BasicSubProfileMetaData;
import org.jboss.system.server.profileservice.repository.StaticProfileFactory;
import org.jboss.system.server.profileservice.repository.clustered.metadata.ClusteredProfileSourceMetaData;
import org.jboss.system.server.profileservice.repository.clustered.metadata.HotDeploymentClusteredProfileSourceMetaData;
import org.jboss.system.server.profileservice.repository.clustered.metadata.ImmutableClusteredProfileSourceMetaData;
/**
* Expands upon the StaticProfileFactory to include a subprofiles
* for farmed content.
*
* @author Brian Stansberry
*/
public class StaticClusteredProfileFactory extends StaticProfileFactory
{
/** The deploy-hasingleton profile name. */
private static final String HASINGLETON_NAME = "deploy-hasingleton";
/** The farm profile name. */
private static final String FARM_NAME = "farm";
/** The hasingleton uris. */
private List<URI> hasingletonURIs;
/** The farm uris. */
private List<URI> farmURIs;
// private String partitionName;
public List<URI> getHASingletonURIs()
{
return hasingletonURIs;
}
public void setHASingletonURIs(List<URI> hasingletonURIs)
{
this.hasingletonURIs = hasingletonURIs;
}
public List<URI> getFarmURIs()
{
return farmURIs;
}
public void setFarmURIs(List<URI> farmURIs)
{
this.farmURIs = farmURIs;
}
// public String getPartitionName()
// {
// return partitionName;
// }
//
// public void setPartitionName(String partitionName)
// {
// this.partitionName = partitionName;
// }
//
// @Override
// public void create() throws Exception
// {
// super.create();
//
// if (this.farmURIs != null || this.hasingletonURIs != null)
// {
// if (this.partitionName == null)
// {
// throw new IllegalStateException("Null partition name.");
// }
// }
// }
/**
* Create the cluster profiles, including the application profile from the
* StaticProfileFactory.
*
*/
@Override
protected String[] createApplicationProfiles(String[] applicationsSubProfiles)
{
// Create the application profile
String applicationProfileName = super.createApplicationProfile(applicationsSubProfiles);
// Create the farm profile
ProfileMetaData farm = null;
if (getFarmURIs() != null)
{
ProfileKey farmKey = new ProfileKey(FARM_NAME);
URI[] farmURIs = getFarmURIs().toArray(new URI[getFarmURIs().size()]);
String[] farmSubProfiles = new String[] { applicationProfileName };
farm = createClusteredProfileMetaData(
FARM_NAME, true, farmURIs, farmSubProfiles);
addProfile(farmKey, farm);
}
// Create the hasingleton profile
if (getHASingletonURIs() != null)
{
ProfileKey hasingletonKey = new ProfileKey(HASINGLETON_NAME);
URI[] hasingletonURIs = getHASingletonURIs().toArray(new URI[getHASingletonURIs().size()]);
// Note HASingleton can't depend on others or it will get undeployed
// prematurely
String[] hasingletonSubProfiles = new String[0];
ProfileMetaData hasingletons = createProfileMetaData(
HASINGLETON_NAME, true, hasingletonURIs, hasingletonSubProfiles);
addProfile(hasingletonKey, hasingletons);
}
// Return the dependencies for the root profile
return farm == null ? new String[] { applicationProfileName } : new String[] { FARM_NAME };
}
private ProfileMetaData createClusteredProfileMetaData(String name, boolean hotDeployment, URI[] uris, String[] subProfiles)
{
// Create profile
BasicProfileMetaData metaData = new BasicProfileMetaData();
metaData.setName(name);
// Create profile sources
ProfileSourceMetaData source = createClusteredSource(uris, hotDeployment);
metaData.setSource(source);
List<SubProfileMetaData> profileList = new ArrayList<SubProfileMetaData>();
for(String subProfile : subProfiles)
{
BasicSubProfileMetaData md = new BasicSubProfileMetaData();
md.setName(subProfile);
profileList.add(md);
}
metaData.setSubprofiles(profileList);
return metaData;
}
/**
* Create a profile repository source meta data.
*
* @param uris the uris for the repository
* @param hotDeployment to create a hotDeployment profile
*
* @return the profile source meta data.
*/
protected ProfileSourceMetaData createClusteredSource(URI[] uris, boolean hotDeployment)
{
ClusteredProfileSourceMetaData source = null;
if(hotDeployment)
{
source = new HotDeploymentClusteredProfileSourceMetaData();
}
else
{
source = new ImmutableClusteredProfileSourceMetaData();
}
// source.setPartitionName(getPartitionName());
List<String> sources = new ArrayList<String>();
for(URI uri : uris)
sources.add(uri.toString());
source.setSources(sources);
return source;
}
}