/* * IronJacamar, a Java EE Connector Architecture implementation * Copyright 2015, Red Hat Inc, 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 Eclipse Public License 1.0 as * published by the Free Software Foundation. * * 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 Eclipse * Public License for more details. * * You should have received a copy of the Eclipse 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.ironjacamar.validator.rules; import org.ironjacamar.common.api.metadata.spec.ConfigProperty; import org.ironjacamar.validator.Failure; import org.ironjacamar.validator.Severity; import org.ironjacamar.validator.ValidateClass; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; /** * A ConfigPropertiesHelper. * * @author Jeff Zhang * @version $Revision: $ */ public class ConfigPropertiesHelper { /** Valid types */ public static final Set<Class> VALID_TYPES; /** Valid types */ public static final Set<Class> WARNING_TYPES; static { VALID_TYPES = new HashSet<Class>(9); VALID_TYPES.add(Boolean.class); VALID_TYPES.add(Byte.class); VALID_TYPES.add(Character.class); VALID_TYPES.add(Double.class); VALID_TYPES.add(Float.class); VALID_TYPES.add(Integer.class); VALID_TYPES.add(Long.class); VALID_TYPES.add(Short.class); VALID_TYPES.add(String.class); WARNING_TYPES = new HashSet<Class>(8); WARNING_TYPES.add(boolean.class); WARNING_TYPES.add(byte.class); WARNING_TYPES.add(char.class); WARNING_TYPES.add(double.class); WARNING_TYPES.add(float.class); WARNING_TYPES.add(int.class); WARNING_TYPES.add(long.class); WARNING_TYPES.add(short.class); } /** * validate ConfigProperties type * * @param vo ValidateClass * @param section section in the spec document * @param failMsg fail or warn message * @return list of failures */ public static List<Failure> validateConfigPropertiesType(ValidateClass vo, String section, String failMsg) { List<Failure> failures = new ArrayList<Failure>(1); for (ConfigProperty cpmd : vo.getConfigProperties()) { try { containGetOrIsMethod(vo, "get", cpmd, section, failMsg, failures); } catch (Throwable t) { try { containGetOrIsMethod(vo, "is", cpmd, section, failMsg, failures); } catch (Throwable it) { // Ignore } } } if (failures.isEmpty()) return null; return failures; } /** * validated object contain 'get or 'is' Method * * @param vo ValidateClass * @param getOrIs 'get or 'is' String * @param cpmd ConfigProperty metadata * @param section section in the spec document * @param failMsg fail or warn message * @param failures list of failures * @throws NoSuchMethodException */ private static void containGetOrIsMethod(ValidateClass vo, String getOrIs, ConfigProperty cpmd, String section, String failMsg, List<Failure> failures) throws NoSuchMethodException { String methodName = getOrIs + cpmd.getConfigPropertyName().getValue().substring(0, 1).toUpperCase(Locale.US); if (cpmd.getConfigPropertyName().getValue().length() > 1) { methodName += cpmd.getConfigPropertyName().getValue().substring(1); } Method method = SecurityActions.getMethod(vo.getClazz(), methodName, (Class[])null); if (!VALID_TYPES.contains(method.getReturnType())) { StringBuilder sb = new StringBuilder("Class: " + vo.getClazz().getName()); sb = sb.append(" Property: " + cpmd.getConfigPropertyName().getValue()); sb = sb.append(" Type: " + method.getReturnType().getName()); Failure failure; if (WARNING_TYPES.contains(method.getReturnType())) { failure = new Failure(Severity.WARNING, section, failMsg, sb.toString()); } else { failure = new Failure(Severity.ERROR, section, failMsg, sb.toString()); } failures.add(failure); } } }