/*
* 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.mx.remoting.connector;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import javax.management.remote.JMXProviderException;
/**
* This is a help class for the JMXConnectorFactory and JMXConnectorServerFactory. They both have the same requirements
* in regards to processing JMXServiceURL, so just putting the code in one place instead of the same code in both of the
* classes.
*
* @author <a href="mailto:tom@jboss.org">Tom Elrod</a>
*/
public class ConnectorFactoryUtil
{
private ConnectorFactoryUtil()
{
// need to only have public static methods
}
public static String normalizeProtocol(String protocol)
{
// convert specical characters per spec.
protocol = protocol.replace('+', '.');
protocol = protocol.replace('-', '_');
return protocol;
}
public static void validateEnvironmentMap(Map environment)
{
// Per spec (javadoc), all the keys in the environment map must be Strings.
// In order to be totally compliant, will check for this, but really just slows things down.
Set keys = environment.keySet();
Iterator itr = keys.iterator();
while(itr.hasNext())
{
Object keyValue = null;
try
{
keyValue = itr.next();
String keyAsString = (String) keyValue;
}
catch(ClassCastException e)
{
throw new IllegalArgumentException("All keys within environment map must be of type java.lang.String. " +
keyValue + " is of type " + keyValue.getClass().getName());
}
}
}
public static ClassLoader locateClassLoader(Map environment, String classLoaderKey)
{
ClassLoader classloader = null;
Object val = environment.get(classLoaderKey);
if(val != null)
{
if(val instanceof ClassLoader)
{
classloader = (ClassLoader) val;
}
else
{
throw new IllegalArgumentException("Error using value specified for " + classLoaderKey +
" because is not an instance of " + ClassLoader.class.getName());
}
}
else
{
// just use current caller's thread's classloader
classloader = Thread.currentThread().getContextClassLoader();
}
environment.put(classLoaderKey, classloader);
return classloader;
}
public static List locateProviderPackage(Map environment, String providerPackageKey)
throws JMXProviderException
{
String providerPackage = null;
// First look for the provider package within the environment map
Object val = environment.get(providerPackageKey);
// once again, to be spec compliant ("If the provider package list is not a String,
// or if it contains an element that is an empty string, a JMXProviderException is thrown.")
if(providerPackage != null)
{
if(val instanceof String)
{
providerPackage = ((String) val).trim();
// now have to make sure not an empty entry
if(providerPackage.startsWith("|") || providerPackage.endsWith("|") ||
providerPackage.indexOf("||") != -1)
{
throw new JMXProviderException("Error processing " + providerPackageKey + " from the " +
"environment map. An empty provider package exists.");
}
}
else
{
throw new JMXProviderException("Error processing " + providerPackageKey + " from the " +
"environment map. Is is not of type String.");
}
}
else
{
// Now try system property
providerPackage = System.getProperty(providerPackageKey);
}
List providerPackages = new ArrayList();
if(providerPackage != null && providerPackage.length() > 0)
{
StringTokenizer tokenizer = new StringTokenizer(providerPackage, "|");
while(tokenizer.hasMoreElements())
{
providerPackages.add(tokenizer.nextElement());
}
}
return providerPackages;
}
}