org.mvel2.util.PropertyTools Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mvel2 Show documentation
Show all versions of mvel2 Show documentation
MVEL is a powerful expression language for Java-based applications.
It provides a plethora of features and is suited for everything
from the smallest property binding and extraction, to full blown scripts.
/**
* MVEL 2.0
* Copyright (C) 2007 The Codehaus
* Mike Brock, Dhanji Prasanna, John Graham, Mark Proctor
*
* Licensed 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.mvel2.util;
import org.mvel2.ParserContext;
import org.mvel2.compiler.PropertyVerifier;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
import static java.lang.String.valueOf;
import static java.lang.reflect.Modifier.PUBLIC;
import static java.lang.reflect.Modifier.STATIC;
import static java.lang.reflect.Modifier.isPublic;
import static org.mvel2.DataConversion.canConvert;
import static org.mvel2.util.ParseTools.boxPrimitive;
public class PropertyTools {
public static boolean isEmpty(Object o) {
if (o != null) {
if (o instanceof Object[]) {
return ((Object[]) o).length == 0 ||
(((Object[]) o).length == 1 && isEmpty(((Object[]) o)[0]));
}
else {
return ("".equals(valueOf(o)))
|| "null".equals(valueOf(o))
|| (o instanceof Collection && ((Collection) o).size() == 0)
|| (o instanceof Map && ((Map) o).size() == 0);
}
}
return true;
}
public static Method getSetter(Class clazz, String property) {
property = ReflectionUtil.getSetter(property);
for (Method meth : clazz.getMethods()) {
if ((meth.getModifiers() & PUBLIC) != 0 && meth.getParameterTypes().length == 1
&& property.equals(meth.getName())) {
return meth;
}
}
return null;
}
public static Method getSetter(Class clazz, String property, Class type) {
String simple = "set" + property;
property = ReflectionUtil.getSetter(property);
for (Method meth : clazz.getMethods()) {
if ((meth.getModifiers() & PUBLIC) != 0 && meth.getParameterTypes().length == 1 &&
(property.equals(meth.getName()) || simple.equals(meth.getName()))
&& (type == null || canConvert(meth.getParameterTypes()[0], type))) {
return meth;
}
}
return null;
}
public static boolean hasGetter(Field field) {
Method meth = getGetter(field.getDeclaringClass(), field.getName());
return meth != null && field.getType().isAssignableFrom(meth.getReturnType());
}
public static boolean hasSetter(Field field) {
Method meth = getSetter(field.getDeclaringClass(), field.getName());
return meth != null && meth.getParameterTypes().length == 1 &&
field.getType().isAssignableFrom(meth.getParameterTypes()[0]);
}
public static Method getGetter(Class clazz, String property) {
String simple = "get" + property;
String simpleIsGet = "is" + property;
String isGet = ReflectionUtil.getIsGetter(property);
String getter = ReflectionUtil.getGetter(property);
Method candidate = null;
for (Method meth : clazz.getMethods()) {
if ((meth.getModifiers() & PUBLIC) != 0 && (meth.getModifiers() & STATIC) == 0 && meth.getParameterTypes().length == 0
&& (getter.equals(meth.getName()) || property.equals(meth.getName()) || ((isGet.equals(meth.getName()) || simpleIsGet.equals(meth.getName())) && meth.getReturnType() == boolean.class)
|| simple.equals(meth.getName()))) {
if (candidate == null || candidate.getReturnType().isAssignableFrom(meth.getReturnType())) {
candidate = meth;
}
}
}
return candidate;
}
public static Class getReturnType(Class clazz, String property, ParserContext ctx) {
return new PropertyVerifier(property, ctx, clazz).analyze();
}
public static Member getFieldOrAccessor(Class clazz, String property) {
for (Field f : clazz.getFields()) {
if (property.equals(f.getName())) {
if ((f.getModifiers() & PUBLIC) != 0) return f;
break;
}
}
return getGetter(clazz, property);
}
public static Member getFieldOrWriteAccessor(Class clazz, String property) {
Field field;
try {
if ((field = clazz.getField(property)) != null &&
isPublic(field.getModifiers())) {
return field;
}
}
catch (NullPointerException e) {
return null;
}
catch (NoSuchFieldException e) {
// do nothing.
}
return getSetter(clazz, property);
}
public static Member getFieldOrWriteAccessor(Class clazz, String property, Class type) {
for (Field f : clazz.getFields()) {
if (property.equals(f.getName()) && (type == null || canConvert(f.getType(), type))) {
return f;
}
}
return getSetter(clazz, property, type);
}
public static boolean contains(Object toCompare, Object testValue) {
if (toCompare == null)
return false;
else if (toCompare instanceof String)
return ((String) toCompare).contains(valueOf(testValue));
// return ((String) toCompare).indexOf(valueOf(testValue)) > -1;
else if (toCompare instanceof Collection)
return ((Collection) toCompare).contains(testValue);
else if (toCompare instanceof Map)
return ((Map) toCompare).containsKey(testValue);
else if (toCompare.getClass().isArray()) {
for (Object o : ((Object[]) toCompare)) {
if (testValue == null && o == null) return true;
else if (o != null && o.equals(testValue)) return true;
}
}
return false;
}
public static Object getPrimitiveInitialValue(Class type) {
if (type == int.class) {
return 0;
}
else if (type == boolean.class) {
return false;
}
else if (type == char.class) {
return (char) 0;
}
else if (type == double.class) {
return 0d;
}
else if (type == long.class) {
return 0l;
}
else if (type == float.class) {
return 0f;
}
else if (type == short.class) {
return (short) 0;
}
else if (type == byte.class) {
return (byte) 0;
}
else {
return 0;
}
}
public static boolean isAssignable(Class to, Class from) {
return (to.isPrimitive() ? boxPrimitive(to) : to).isAssignableFrom(from.isPrimitive() ? boxPrimitive(from) : from);
}
/**
* Get the JVM version
* @return first mvel.java.version
, then java.version
* @see System.getProperty("mvel.java.version");
* @see System.getProperty("java.version");
*/
public static String getJavaVersion() {
return System.getProperty("mvel.java.version")!=null ?
System.getProperty("mvel.java.version") :
System.getProperty("java.version");
}
}