org.glassfish.jersey.internal.util.PropertiesHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ehcache Show documentation
Show all versions of ehcache Show documentation
Ehcache is an open source, standards-based cache used to boost performance,
offload the database and simplify scalability. Ehcache is robust, proven and full-featured and
this has made it the most widely-used Java-based cache.
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2012-2013 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* http://glassfish.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package org.glassfish.jersey.internal.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ws.rs.RuntimeType;
import org.glassfish.jersey.internal.LocalizationMessages;
/**
* Helper class containing convenience methods for reading
* {@code org.glassfish.jersey.server.ResourceConfig} and {@link javax.ws.rs.core.Configuration} properties.
*
* @author Martin Matula (martin.matula at oracle.com)
*/
public final class PropertiesHelper {
private static final Logger LOGGER = Logger.getLogger(PropertiesHelper.class.getName());
/**
* Get system properties.
*
* This method delegates to {@link System#getProperties()} while running it in a privileged
* code block.
*
* @return privileged action to obtain system properties.
*/
public static PrivilegedAction getSystemProperties() {
return new PrivilegedAction() {
@Override
public Properties run() {
return System.getProperties();
}
};
}
/**
* Get system property.
*
* This method delegates to {@link System#getProperty(String)} while running it in a privileged
* code block.
*
* @param name system property name.
* @return privileged action to obtain system property value that will return {@code null}
* if there's no such system property.
*/
public static PrivilegedAction getSystemProperty(final String name) {
return new PrivilegedAction() {
@Override
public String run() {
return System.getProperty(name);
}
};
}
/**
* Get system property.
*
* This method delegates to {@link System#getProperty(String)} while running it in a privileged
* code block.
*
* @param name system property name.
* @param def default property value.
* @return privileged action to obtain system property value that will return the default value
* if there's no such system property.
*/
public static PrivilegedAction getSystemProperty(final String name, final String def) {
return new PrivilegedAction() {
@Override
public String run() {
return System.getProperty(name, def);
}
};
}
/**
* Return value of a specified property. If the property is not set or the real value type is not compatible with
* defaultValue type, the specified defaultValue is returned. Calling this method is equivalent to calling
* {@code PropertyHelper.getValue(properties, key, defaultValue, (Class) defaultValue.getClass())}
*
* @param properties Map of properties to get the property value from.
* @param key Name of the property.
* @param defaultValue Default value to be returned if the specified property is not set or cannot be read.
* @param Type of the property value.
* @return Value of the property or defaultValue.
*/
public static T getValue(Map properties, String key, T defaultValue) {
return getValue(properties, null, key, defaultValue);
}
/**
* Return value of a specified property. If the property is not set or the real value type is not compatible with
* defaultValue type, the specified defaultValue is returned. Calling this method is equivalent to calling
* {@code PropertyHelper.getValue(properties, runtimeType, key, defaultValue, (Class) defaultValue.getClass())}
*
* @param properties Map of properties to get the property value from.
* @param runtimeType Runtime type which is used to check whether there is a property with the same
* {@code key} but post-fixed by runtime type (.server
* or {@code .client}) which would override the {@code key} property.
* @param key Name of the property.
* @param defaultValue Default value to be returned if the specified property is not set or cannot be read.
* @param Type of the property value.
* @return Value of the property or defaultValue.
*/
@SuppressWarnings("unchecked")
public static T getValue(Map properties, RuntimeType runtimeType, String key, T defaultValue) {
return getValue(properties, runtimeType, key, defaultValue, (Class) defaultValue.getClass());
}
/**
* Returns value of a specified property. If the property is not set or the real value type is not compatible with
* the specified value type, returns defaultValue.
*
* @param properties Map of properties to get the property value from.
* @param key Name of the property.
* @param defaultValue Default value of the property.
* @param type Type to retrieve the value as.
* @param Type of the property value.
* @return Value of the property or null.
*/
public static T getValue(Map properties, String key, T defaultValue, Class type) {
return getValue(properties, null, key, defaultValue, type);
}
/**
* Returns value of a specified property. If the property is not set or the real value type is not compatible with
* the specified value type, returns defaultValue.
*
* @param properties Map of properties to get the property value from.
* @param runtimeType Runtime type which is used to check whether there is a property with the same
* {@code key} but post-fixed by runtime type (.server
* or {@code .client}) which would override the {@code key} property.
* @param key Name of the property.
* @param defaultValue Default value of the property.
* @param type Type to retrieve the value as.
* @param Type of the property value.
* @return Value of the property or null.
*/
public static T getValue(Map properties, RuntimeType runtimeType, String key,
T defaultValue, Class type) {
T value = getValue(properties, runtimeType, key, type);
if (value == null) {
value = defaultValue;
}
return value;
}
/**
* Returns value of a specified property. If the property is not set or the real value type is not compatible with
* the specified value type, returns null.
*
* @param properties Map of properties to get the property value from.
* @param key Name of the property.
* @param type Type to retrieve the value as.
* @param Type of the property value.
* @return Value of the property or null.
*/
public static T getValue(Map properties, String key, Class type) {
return getValue(properties, null, key, type);
}
/**
* Returns value of a specified property. If the property is not set or the real value type is not compatible with
* the specified value type, returns null.
*
* @param properties Map of properties to get the property value from.
* @param runtimeType Runtime type which is used to check whether there is a property with the same
* {@code key} but post-fixed by runtime type (.server
* or {@code .client}) which would override the {@code key} property.
* @param key Name of the property.
* @param type Type to retrieve the value as.
* @param Type of the property value.
* @return Value of the property or null.
*/
public static T getValue(Map properties, RuntimeType runtimeType, String key, Class type) {
Object value = null;
if (runtimeType != null) {
value = properties.get(key + '.' + runtimeType.name().toLowerCase());
}
if (value == null) {
value = properties.get(key);
}
if (value == null) {
return null;
}
return convertValue(value, type);
}
/**
* Convert {@code Object} value to a value of the specified class type.
*
* @param value {@code Object} value to convert.
* @param type conversion type.
* @param converted value type.
* @return value converted to the specified class type.
*/
public static T convertValue(Object value, Class type) {
if (!type.isInstance(value)) {
// TODO: Move string value readers from server to common and utilize them here
final Constructor constructor = AccessController.doPrivileged(ReflectionHelper.getStringConstructorPA(type));
if (constructor != null) {
try {
return type.cast(constructor.newInstance(value));
} catch (Exception e) {
// calling the constructor wasn't successful - ignore and try valueOf()
}
}
final Method valueOf = AccessController.doPrivileged(ReflectionHelper.getValueOfStringMethodPA(type));
if (valueOf != null) {
try {
return type.cast(valueOf.invoke(null, value));
} catch (Exception e) {
// calling valueOf wasn't successful
}
}
// at this point we don't know what to return -> return null
if (LOGGER.isLoggable(Level.WARNING)) {
LOGGER.warning(LocalizationMessages.PROPERTIES_HELPER_GET_VALUE_NO_TRANSFORM(String.valueOf(value),
value.getClass().getName(), type.getName()));
}
return null;
}
return type.cast(value);
}
/**
* Get the value of the property with a given name converted to {@code boolean}. Returns {@code false} if the value is
* not convertible.
*
* @param properties key-value map of properties.
* @param name property name.
* @return {@code boolean} property value or {@code false} if the property is not convertible.
*/
public static boolean isProperty(final Map properties, final String name) {
return properties.containsKey(name) && isProperty(properties.get(name));
}
/**
* Get the value of the property converted to {@code boolean}. Returns {@code false} if the value is not convertible.
*
* @param value property value.
* @return {@code boolean} property value or {@code false} if the property is not convertible.
*/
public static boolean isProperty(final Object value) {
if (value instanceof Boolean) {
return Boolean.class.cast(value);
} else {
return value != null && Boolean.parseBoolean(value.toString());
}
}
/**
* Prevent instantiation.
*/
private PropertiesHelper() {
}
}