X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fadapters%2FSetterConfiguration.java;h=57323a54b409531f53667e9d771c4f9d542a0060;hb=4759a6709085fa9426a1fc1842444d61f9f61e94;hp=b2ab5f6d7044745182393717b2809d3a5b5c018b;hpb=2680fc967c8e19bcc91d3a62cdb8e7ad25aa204e;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/adapters/SetterConfiguration.java b/system/general/src/main/java/org/wamblee/system/adapters/SetterConfiguration.java index b2ab5f6d..57323a54 100644 --- a/system/general/src/main/java/org/wamblee/system/adapters/SetterConfiguration.java +++ b/system/general/src/main/java/org/wamblee/system/adapters/SetterConfiguration.java @@ -52,7 +52,7 @@ public class SetterConfiguration { private Map _setters; /** - * Constructs the setter configuration. By default all setters are added. + * Constructs the setter configuration. By default no setters are added. * * @param aClass * Class which is being configured. @@ -60,27 +60,30 @@ public class SetterConfiguration { public SetterConfiguration(Class aClass) { _class = aClass; _publicOnly = true; - initSetters(); + _setters = new HashMap(); } - private void initSetters() { - _setters = new HashMap(); + /** + * Makes sure that all available setters are used. + */ + public SetterConfiguration initAllSetters() { + _setters.clear(); for (Method method: getAllSetters(_class, _publicOnly) ) { _setters.put(method, createParameterValues(method)); } + return this; } /** * Called to set whether non-public setters are also used. By default only - * public setters are used. This resets all changes made and selects all - * public setters if non-public is false and all setters if it is true. + * public setters are used. The currently selected setters remain chosen. * * @param aIsNonPublic * Non public flag. */ - public void setNonPublic(boolean aIsNonPublic) { + public SetterConfiguration setNonPublic(boolean aIsNonPublic) { _publicOnly = !aIsNonPublic; - initSetters(); + return this; } /** @@ -97,55 +100,59 @@ public class SetterConfiguration { * Removes a setter from the set of methods. * * @param aName - * Name of the setter to remove (without the "set" prefix). + * Name of the setter to remove. * @return Reference to the current object to allow call chaining. */ public SetterConfiguration remove(String aName) { - final String name = createSetterName(aName); - Map setters = new HashMap(); for (Method method : _setters.keySet()) { - if (method.getName().equals(name)) { + if (method.getName().equals(aName)) { _setters.remove(method); return this; } } throw new IllegalArgumentException( - "No setter configured by the name of '" + aName + "'"); + "No method configured by the name of '" + aName + "'"); } - + /** - * Creates the name of a setter based on the name of the setter without the - * "set" prefix. - * - * @param aName - * Setter name. - * @return Setter name. + * Removes the method from the set of methods. + * @param aMethod Method to remove. + * @return */ - private String createSetterName(String aName) { - return "set" + aName.substring(0, 1).toUpperCase() + aName.substring(1); + public SetterConfiguration remove(Method aMethod) { + if ( !aMethod.getDeclaringClass().isAssignableFrom(_class) ) { + throw new RuntimeException("Method " + aMethod + " not found in class " + _class + " or its superclasses"); + } + for (Method method : _setters.keySet()) { + if (method.equals(aMethod)) { + _setters.remove(method); + return this; + } + } + throw new IllegalArgumentException( + "Method '" + aMethod + "' was not configured. "); } - + /** * Adds a given setter name to the setters. * - * @param aName + * @param aName Name of a setter method. * @return Reference to the current object to allow call chaining. */ - public SetterConfiguration add(String aName) { - final String name = createSetterName(aName); + public SetterConfiguration add(final String aName) { int oldlen = _setters.size(); List methods = new ArrayList(); CollectionFilter.filter(getAllSetters(_class, _publicOnly), methods, new Condition() { @Override public boolean matches(Method aObject) { - return aObject.getName().equals(name); + return aObject.getName().equals(aName); } }); if (methods.size() == 0 ) { - throw new IllegalArgumentException("No setter found for '" + aName - + "' in " + _class.getName()); + throw new IllegalArgumentException("Method '" + aName + + "' not found in " + _class.getName()); } // TODO is it possible to get more than one setter here in case the subclass overrides // the baseclass method? @@ -164,7 +171,7 @@ public class SetterConfiguration { * @throws IllegalArgumentException * In case no setter is found or multiple setters are found. */ - public SetterConfiguration add(final Class aType) { + public SetterConfiguration addSetter(final Class aType) { List result = new ArrayList(); CollectionFilter.filter(getAllSetters(_class, _publicOnly), result, new Condition() { @@ -201,7 +208,7 @@ public class SetterConfiguration { * * @return List of all setters. */ - private static List getAllSetters(Class aClass, + public static List getAllSetters(Class aClass, boolean aPublicOnly) { List result = new ArrayList(); for (Method method : getAllMethods(aClass)) { @@ -216,10 +223,14 @@ public class SetterConfiguration { return result; } - private static ParameterValues createParameterValues(Method method) { - return new ParameterValues( - new String[] { getSetterName(method) }, new Class[] { method - .getParameterTypes()[0] }); + private static ParameterValues createParameterValues(Method aMethod) { + + Class[] paramTypes = aMethod.getParameterTypes(); + String[] paramNames = new String[paramTypes.length]; + for (int i = 0; i < paramTypes.length; i++) { + paramNames[i] = aMethod.getName() + "." + i; + } + return new ParameterValues(paramNames, paramTypes); } private static final List getAllMethods(Class aClass) { @@ -277,30 +288,15 @@ public class SetterConfiguration { * @return Parameter values. */ public ParameterValues values(String aMethod) { - String name = createSetterName(aMethod); for (Method method : _setters.keySet()) { - if (method.getName().equals(name)) { + if (method.getName().equals(aMethod)) { return _setters.get(method); } } - throw new IllegalArgumentException("No setter method '" + name + throw new IllegalArgumentException("No setter method '" + aMethod + "' found"); } - /** - * Gets the setter name for a given setter method. This is the name of the - * setter without the "set" prefix and with the first character converted to - * lowercase. - * - * @param aMethod - * Method. - * @return Setter name. - */ - private static String getSetterName(Method aMethod) { - String result = aMethod.getName().substring(3); - return result.substring(0, 1).toLowerCase() + result.substring(1); - } - public List getSetters() { return new ArrayList(_setters.keySet()); }