blob: 6103bc8d0d6bf0d15af29dcb06aa77e7425bd06e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.ra;
import javax.naming.Context;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.jgroups.JChannel;
/**
* Various utility functions
*/
public final class ActiveMQRaUtils {
/**
* Private constructor
*/
private ActiveMQRaUtils() {
}
/**
* Compare two strings.
*
* @param me First value
* @param you Second value
* @return True if object equals else false.
*/
@SuppressWarnings("StringEquality")
public static boolean compare(final String me, final String you) {
// If both null or intern equals
if (me == you) {
return true;
}
// if me null and you are not
if (me == null) {
return false;
}
// me will not be null, test for equality
return me.equals(you);
}
/**
* Compare two integers.
*
* @param me First value
* @param you Second value
* @return True if object equals else false.
*/
public static boolean compare(final Integer me, final Integer you) {
// If both null or intern equals
if (me == you) {
return true;
}
// if me null and you are not
if (me == null) {
return false;
}
// me will not be null, test for equality
return me.equals(you);
}
/**
* Compare two longs.
*
* @param me First value
* @param you Second value
* @return True if object equals else false.
*/
public static boolean compare(final Long me, final Long you) {
// If both null or intern equals
if (me == you) {
return true;
}
// if me null and you are not
if (me == null) {
return false;
}
// me will not be null, test for equality
return me.equals(you);
}
/**
* Compare two doubles.
*
* @param me First value
* @param you Second value
* @return True if object equals else false.
*/
public static boolean compare(final Double me, final Double you) {
// If both null or intern equals
if (me == you) {
return true;
}
// if me null and you are not
if (me == null) {
return false;
}
// me will not be null, test for equality
return me.equals(you);
}
/**
* Compare two booleans.
*
* @param me First value
* @param you Second value
* @return True if object equals else false.
*/
public static boolean compare(final Boolean me, final Boolean you) {
// If both null or intern equals
if (me == you) {
return true;
}
// if me null and you are not
if (me == null) {
return false;
}
// me will not be null, test for equality
return me.equals(you);
}
/**
* Lookup an object in the default initial context
*
* @param context The context to use
* @param name the name to lookup
* @param clazz the expected type
* @return the object
* @throws Exception for any error
*/
public static Object lookup(final Context context, final String name, final Class<?> clazz) throws Exception {
return context.lookup(name);
}
/**
* Used on parsing JNDI Configuration
*
* @param config
* @return hash-table with configuration option pairs
*/
public static Hashtable<String, String> parseHashtableConfig(final String config) {
Hashtable<String, String> hashtable = new Hashtable<>();
String[] topElements = config.split(";");
for (String element : topElements) {
String[] expression = element.split("=");
if (expression.length != 2) {
throw new IllegalArgumentException("Invalid expression " + element + " at " + config);
}
hashtable.put(expression[0].trim(), expression[1].trim());
}
return hashtable;
}
public static List<Map<String, Object>> parseConfig(final String config) {
List<Map<String, Object>> result = new ArrayList<>();
String[] topElements = config.split(",");
for (String topElement : topElements) {
HashMap<String, Object> map = new HashMap<>();
result.add(map);
String[] elements = topElement.split(";");
for (String element : elements) {
String[] expression = element.split("=");
if (expression.length != 2) {
throw new IllegalArgumentException("Invalid expression " + element + " at " + config);
}
map.put(expression[0].trim(), expression[1].trim());
}
}
return result;
}
public static List<String> parseConnectorConnectorConfig(String config) {
List<String> res = new ArrayList<>();
String[] elements = config.split(",");
for (String element : elements) {
res.add(element.trim());
}
return res;
}
/**
* Within AS7 the RA is loaded by JCA. properties can only be passed in String form. However if
* RA is configured using jgroups stack, we need to pass a Channel object. As is impossible with
* JCA, we use this method to allow a JChannel object to be located.
*/
public static JChannel locateJGroupsChannel(final String locatorClass, final String name) {
return AccessController.doPrivileged(new PrivilegedAction<JChannel>() {
@Override
public JChannel run() {
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class<?> aClass = loader.loadClass(locatorClass);
Object o = aClass.newInstance();
Method m = aClass.getMethod("locateChannel", new Class[]{String.class});
return (JChannel) m.invoke(o, name);
}
catch (Throwable e) {
ActiveMQRALogger.LOGGER.debug(e.getMessage(), e);
return null;
}
}
});
}
/**
* This seems duplicate code all over the place, but for security reasons we can't let something like this to be open in a
* utility class, as it would be a door to load anything you like in a safe VM.
* For that reason any class trying to do a privileged block should do with the AccessController directly.
*/
private static Object safeInitNewInstance(final String className) {
return AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
ClassLoader loader = getClass().getClassLoader();
try {
Class<?> clazz = loader.loadClass(className);
return clazz.newInstance();
}
catch (Throwable t) {
try {
loader = Thread.currentThread().getContextClassLoader();
if (loader != null)
return loader.loadClass(className).newInstance();
}
catch (RuntimeException e) {
throw e;
}
catch (Exception e) {
}
throw new IllegalArgumentException("Could not find class " + className);
}
}
});
}
}