package com.sampullara.cli; import java.util.Properties; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.beans.IntrospectionException; /** * Created by IntelliJ IDEA. * <p/> * User: samp * Date: Nov 11, 2007 * Time: 3:42:27 PM */ public class PropertiesArgs { /** * Parse properties instead of String arguments. Any additional arguments need to be passed some other way. * This is often used in a second pass when the property filename is passed on the command line. Because of * required properties you must be careful to set them all in the property file. * * @param target Either an instance or a class * @param arguments The properties that contain the arguments */ public static void parse(Object target, Properties arguments) { Class clazz; if (target instanceof Class) { clazz = (Class) target; } else { clazz = target.getClass(); } for (Field field : clazz.getDeclaredFields()) { processField(target, field, arguments); } try { BeanInfo info = Introspector.getBeanInfo(clazz); for (PropertyDescriptor pd : info.getPropertyDescriptors()) { processProperty(target, pd, arguments); } } catch (IntrospectionException e) { // If its not a JavaBean we ignore it } } private static void processField(Object target, Field field, Properties arguments) { Argument argument = field.getAnnotation(Argument.class); if (argument != null) { String name = Args.getName(argument, field); String alias = Args.getAlias(argument); Class type = field.getType(); Object value = arguments.get(name); if (value == null && alias != null) { value = arguments.get(alias); } if (value != null) { if (type == Boolean.TYPE || type == Boolean.class) { value = true; } Args.setField(type, field, target, value, argument.delimiter()); } else { if (argument.required()) { throw new IllegalArgumentException("You must set argument " + name); } } } } private static void processProperty(Object target, PropertyDescriptor property, Properties arguments) { Method writeMethod = property.getWriteMethod(); if (writeMethod != null) { Argument argument = writeMethod.getAnnotation(Argument.class); if (argument != null) { String name = Args.getName(argument, property); String alias = Args.getAlias(argument); Object value = arguments.get(name); if (value == null && alias != null) { value = arguments.get(alias); } if (value != null) { Class type = property.getPropertyType(); if (type == Boolean.TYPE || type == Boolean.class) { value = true; } Args.setProperty(type, property, target, value, argument.delimiter()); } else { if (argument.required()) { throw new IllegalArgumentException("You must set argument " + name); } } } } } }