package org.jboss.seam.deployment;
import static org.jboss.seam.util.Strings.split;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import org.jboss.seam.util.EnumerationEnumeration;
public class SeamDeploymentProperties
{
private ClassLoader classLoader;
private Enumeration<URL> urlEnum;
public SeamDeploymentProperties(ClassLoader classLoader)
{
this.classLoader = classLoader;
}
/**
* The resource bundle used to control Seam deployment
*/
public static final String RESOURCE_BUNDLE = "META-INF/seam-deployment.properties";
// All resource bundles to use, including legacy names
private static final String[] RESOURCE_BUNDLES = { RESOURCE_BUNDLE, "META-INF/seam-scanner.properties" };
/**
* Get a list of possible values for a given key.
*
* First, System properties are tried, followed by the specified resource
* bundle (first in classpath only).
*
* Colon (:) deliminated lists are split out.
*
*/
public List<String> getPropertyValues(String key)
{
List<String>values = new ArrayList<String>();
addPropertiesFromSystem(key, values);
addPropertiesFromResourceBundle(key, values);
return values;
}
private void addPropertiesFromSystem(String key, List<String> values)
{
addProperty(key, System.getProperty(key), values);
}
private void addPropertiesFromResourceBundle(String key, List<String> values)
{
try
{
while ( getResources().hasMoreElements() )
{
URL url = getResources().nextElement();
Properties properties = new Properties();
InputStream propertyStream = url.openStream();
try
{
properties.load(propertyStream);
addProperty(key, properties.getProperty(key), values);
}
finally
{
if (propertyStream != null)
{
propertyStream.close();
}
}
}
}
catch (IOException e)
{
// No - op, file is optional
}
}
/*
* Add the property to the set of properties only if it hasn't already been added
*/
private void addProperty(String key, String value, List<String> values)
{
if (value != null)
{
String[] properties = split(value, ":");
for (String property : properties)
{
values.add(property);
}
}
}
private Enumeration<URL> getResources() throws IOException
{
if (urlEnum == null)
{
Enumeration<URL>[] enumerations = new Enumeration[RESOURCE_BUNDLES.length];
for (int i = 0; i < RESOURCE_BUNDLES.length; i ++)
{
enumerations[i] = classLoader.getResources(RESOURCE_BUNDLES[i]);
}
urlEnum = new EnumerationEnumeration<URL>(enumerations);
}
return urlEnum;
}
}