/** * 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.camel.component.bean; import org.apache.camel.spi.ClassResolver; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.StringHelper; /** * Helper for the bean component. */ public final class BeanHelper { private BeanHelper() { // utility class } /** * Determines and maps the given value is valid according to the supported * values by the bean component. * * @param value the value * @return the parameter type the given value is being mapped as, or <tt>null</tt> if not valid. */ public static Class<?> getValidParameterType(String value) { if (ObjectHelper.isEmpty(value)) { return null; } // trim value value = value.trim(); // single quoted is valid if (value.startsWith("'") && value.endsWith("'")) { return String.class; } // double quoted is valid if (value.startsWith("\"") && value.endsWith("\"")) { return String.class; } // true or false is valid (boolean) if (value.equals("true") || value.equals("false")) { return Boolean.class; } // null is valid (to force a null value) if (value.equals("null")) { return Object.class; } // simple language tokens is valid if (StringHelper.hasStartToken(value, "simple")) { return Object.class; } // numeric is valid boolean numeric = true; for (char ch : value.toCharArray()) { if (!Character.isDigit(ch)) { numeric = false; break; } } if (numeric) { return Number.class; } // not valid return null; } /** * Determines if the given value is valid according to the supported * values by the bean component. * * @param value the value * @return <tt>true</tt> if valid, <tt>false</tt> otherwise */ public static boolean isValidParameterValue(String value) { if (ObjectHelper.isEmpty(value)) { // empty value is valid return true; } return getValidParameterType(value) != null; } /** * Determines if the given parameter type is assignable to the expected type. * <p/> * This implementation will check if the given parameter type matches the expected type as class using either * <ul> * <li>FQN class name - com.foo.MyOrder</li> * <li>Simple class name - MyOrder</li> * </ul> * If the given parameter type is <b>not</b> a class, then <tt>null</tt> is returned * * @param resolver the class resolver * @param parameterType the parameter type as a String, can be a FQN or a simple name of the class * @param expectedType the expected type * @return <tt>null</tt> if parameter type is <b>not</b> a class, <tt>true</tt> if parameter type is assignable, <tt>false</tt> if not assignable */ public static Boolean isAssignableToExpectedType(ClassResolver resolver, String parameterType, Class<?> expectedType) { // if its a class, then it should be assignable Class<?> parameterClass = resolver.resolveClass(parameterType); if (parameterClass == null && parameterType.equals(expectedType.getSimpleName())) { // it was not the FQN class name, but the simple name instead, which matched return true; } // not a class so return null if (parameterClass == null) { return null; } // if there was a class, then it must be assignable to match return parameterClass.isAssignableFrom(expectedType); } }