/*
- * Copyright 2008 the original author or authors.
- *
+ * Copyright 2005-2010 the original author or authors.
+ *
* 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.
*/
package org.wamblee.system.adapters;
-import org.wamblee.collections.CollectionFilter;
-
-import org.wamblee.conditions.Condition;
-import org.wamblee.conditions.FixedCondition;
-
-import org.wamblee.general.Pair;
-
-import org.wamblee.reflection.ReflectionUtils;
-
-import org.wamblee.system.core.DefaultProvidedInterface;
-import org.wamblee.system.core.DefaultRequiredInterface;
-import org.wamblee.system.core.ProvidedInterface;
-import org.wamblee.system.core.RequiredInterface;
-import org.wamblee.system.core.Scope;
-import org.wamblee.system.core.SystemAssemblyException;
-
-import java.awt.CompositeContext;
-
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
-
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
+import org.wamblee.collections.CollectionFilter;
+import org.wamblee.conditions.Condition;
+import org.wamblee.reflection.ReflectionUtils;
+import org.wamblee.system.core.RequiredInterface;
+import org.wamblee.system.core.Scope;
+import org.wamblee.system.core.SystemAssemblyException;
/**
- * Represents the configuration for exposing the setters of a class as
- * required interfaces.
- *
+ * Represents the configuration for exposing the setters of a class as required
+ * interfaces.
+ *
* @author Erik Brakkee
*/
public class SetterConfiguration {
- /**
- * DOCUMENT ME!
- */
- private Class _class;
+ private Class clazz;
- /**
- * DOCUMENT ME!
- */
private boolean publicOnly;
- /**
- * DOCUMENT ME!
- */
private Map<Method, ParameterValues> setters;
-/**
- * Constructs the setter configuration. By default no setters are added.
- *
- * @param aClass
- * Class which is being configured.
- */
+ /**
+ * Constructs the setter configuration. By default no setters are added.
+ *
+ * @param aClass
+ * Class which is being configured.
+ */
public SetterConfiguration(Class aClass) {
- _class = aClass;
- publicOnly = true;
- setters = new HashMap<Method, ParameterValues>();
+ clazz = aClass;
+ publicOnly = true;
+ setters = new HashMap<Method, ParameterValues>();
}
/**
* Makes sure that all available setters are used.
- *
- * @return DOCUMENT ME!
+ *
*/
public SetterConfiguration initAllSetters() {
setters.clear();
- for (Method method : getAllSetters(_class, publicOnly)) {
+ for (Method method : getAllSetters(clazz, publicOnly)) {
setters.put(method, createParameterValues(method));
}
}
/**
- * Called to set whether non-public setters are also used. By
- * default only public setters are used. The currently selected setters
- * remain chosen.
- *
- * @param aIsNonPublic Non public flag.
- *
- * @return DOCUMENT ME!
+ * Called to set whether non-public setters are also used. By default only
+ * public setters are used. The currently selected setters remain chosen.
+ *
+ * @param aIsNonPublic
+ * Non public flag.
+ *
*/
public SetterConfiguration setNonPublic(boolean aIsNonPublic) {
publicOnly = !aIsNonPublic;
/**
* Removes all setters.
- *
+ *
* @return Reference to the current object to allow call chaining.
*/
public SetterConfiguration clear() {
/**
* Removes a setter from the set of methods.
- *
- * @param aName Name of the setter to remove.
- *
+ *
+ * @param aName
+ * Name of the setter to remove.
+ *
* @return Reference to the current object to allow call chaining.
- *
- * @throws IllegalArgumentException DOCUMENT ME!
+ *
*/
public SetterConfiguration remove(String aName) {
for (Method method : setters.keySet()) {
/**
* Removes the method from the set of methods.
- *
- * @param aMethod Method to remove.
- *
+ *
+ * @param aMethod
+ * Method to remove.
+ *
* @return
- *
- * @throws RuntimeException DOCUMENT ME!
- * @throws IllegalArgumentException DOCUMENT ME!
+ *
*/
public SetterConfiguration remove(Method aMethod) {
- if (!aMethod.getDeclaringClass().isAssignableFrom(_class)) {
- throw new RuntimeException("Method " + aMethod
- + " not found in class " + _class + " or its superclasses");
+ if (!aMethod.getDeclaringClass().isAssignableFrom(clazz)) {
+ throw new RuntimeException("Method " + aMethod +
+ " not found in class " + clazz + " or its superclasses");
}
for (Method method : setters.keySet()) {
}
}
- throw new IllegalArgumentException("Method '" + aMethod
- + "' was not configured. ");
+ throw new IllegalArgumentException("Method '" + aMethod +
+ "' was not configured. ");
}
/**
* Adds a given setter name to the setters.
- *
- * @param aName Name of a setter method.
- *
+ *
+ * @param aName
+ * Name of a setter method.
+ *
* @return Reference to the current object to allow call chaining.
- *
- * @throws IllegalArgumentException DOCUMENT ME!
+ *
*/
public SetterConfiguration add(final String aName) {
- int oldlen = setters.size();
List<Method> methods = new ArrayList<Method>();
- CollectionFilter.filter(getAllSetters(_class, publicOnly), methods,
+ CollectionFilter.filter(getAllSetters(clazz, publicOnly), methods,
new Condition<Method>() {
@Override
public boolean matches(Method aObject) {
});
if (methods.size() == 0) {
- throw new IllegalArgumentException("Method '" + aName
- + "' not found in " + _class.getName());
+ throw new IllegalArgumentException("Method '" + aName +
+ "' not found in " + clazz.getName());
}
- // TODO is it possible to get more than one setter here in case the subclass overrides
- // the baseclass method?
+ // TODO is it possible to get more than one setter here in case the
+ // subclass overrides
+ // the baseclass method?
setters.put(methods.get(0), createParameterValues(methods.get(0)));
return this;
}
/**
- * Adds a given setter identified by the type it accepts to the
- * list of setters.N
- *
- * @param aType Type to look for. Note that this must be the exact type as
- * autoboxing and autounboxing is not used.
- *
+ * Adds a given setter identified by the type it accepts to the list of
+ * setters.N
+ *
+ * @param aType
+ * Type to look for. Note that this must be the exact type as
+ * autoboxing and autounboxing is not used.
+ *
* @return Reference to the current object to allow call chaining.
- *
- * @throws IllegalArgumentException In case no setter is found or multiple
- * setters are found.
+ *
+ * @throws IllegalArgumentException
+ * In case no setter is found or multiple setters are found.
*/
public SetterConfiguration addSetter(final Class aType) {
List<Method> result = new ArrayList<Method>();
- CollectionFilter.filter(getAllSetters(_class, publicOnly), result,
+ CollectionFilter.filter(getAllSetters(clazz, publicOnly), result,
new Condition<Method>() {
@Override
public boolean matches(Method aObject) {
});
if (result.size() == 0) {
- throw new IllegalArgumentException("No setter found in class '"
- + _class.getName() + "' that has a setter with argument type '"
- + aType.getName() + "'");
+ throw new IllegalArgumentException("No setter found in class '" +
+ clazz.getName() + "' that has a setter with argument type '" +
+ aType.getName() + "'");
}
if (result.size() > 1) {
- String setters = "";
+ StringBuffer settersString = new StringBuffer();
for (Method method : result) {
- setters += (method.getName() + " ");
+ settersString.append((method.getName() + " "));
}
throw new IllegalArgumentException(
- "Multiple setters found in class '" + _class.getName()
- + " that accept type '" + aType.getName() + "': " + setters);
+ "Multiple setters found in class '" + clazz.getName() +
+ " that accept type '" + aType.getName() + "': " +
+ settersString);
}
Method method = result.get(0);
/**
* Gets all setters for the current class.
- *
- * @param aClass DOCUMENT ME!
- * @param aPublicOnly DOCUMENT ME!
- *
+ *
+ *
* @return List of all setters.
*/
public static List<Method> getAllSetters(Class aClass, boolean aPublicOnly) {
for (Method method : getAllMethods(aClass)) {
if (!aPublicOnly || Modifier.isPublic(method.getModifiers())) {
- if (method.getName().startsWith("set")
- && (method.getParameterTypes().length == 1)) {
+ if (method.getName().startsWith("set") &&
+ (method.getParameterTypes().length == 1)) {
method.setAccessible(true);
result.add(method);
}
return result;
}
- /**
- * DOCUMENT ME!
- *
- * @param aMethod DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
private static ParameterValues createParameterValues(Method aMethod) {
- Class[] paramTypes = aMethod.getParameterTypes();
+ Class[] paramTypes = aMethod.getParameterTypes();
String[] paramNames = new String[paramTypes.length];
for (int i = 0; i < paramTypes.length; i++) {
return new ParameterValues(paramNames, paramTypes);
}
- /**
- * DOCUMENT ME!
- *
- * @param aClass DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
private static final List<Method> getAllMethods(Class aClass) {
return ReflectionUtils.getAllMethods(aClass);
}
/**
* Gets the required interfaces based on the configured setteres.
- *
+ *
* @return List of required interfaces.
*/
public List<RequiredInterface> getRequiredInterfaces() {
/**
* Invokes all configured setters with the appropriate values.
- *
- * @param aScope Scope within which invocation takes place.
- * @param aObject Object on which the invocation takes place.
- *
- * @throws IllegalArgumentException DOCUMENT ME!
- * @throws SystemAssemblyException DOCUMENT ME!
+ *
+ * @param aScope
+ * Scope within which invocation takes place.
+ * @param aObject
+ * Object on which the invocation takes place.
+ *
*/
public void inject(Scope aScope, Object aObject) {
- if (!_class.isInstance(aObject)) {
- throw new IllegalArgumentException("Object '" + aObject
- + "' is not an instance of " + _class.getName());
+ if (!clazz.isInstance(aObject)) {
+ throw new IllegalArgumentException("Object '" + aObject +
+ "' is not an instance of " + clazz.getName());
}
for (Method method : setters.keySet()) {
try {
method.invoke(aObject, values.values(aScope));
} catch (IllegalAccessException e) {
- throw new SystemAssemblyException("Problem invoking " + method
- + " with " + values, e);
+ throw new SystemAssemblyException("Problem invoking " + method +
+ " with " + values, e);
} catch (InvocationTargetException e) {
- throw new SystemAssemblyException("Problem invoking " + method
- + " with " + values, e);
+ throw new SystemAssemblyException("Problem invoking " + method +
+ " with " + values, e);
}
}
}
/**
- * Returns the parameter values for allowing detailed configuration
- * of how parameter values are set.
- *
- * @param aMethod Setter name without the "set" prefix with the first
- * character converted to lower case.
- *
+ * Returns the parameter values for allowing detailed configuration of how
+ * parameter values are set.
+ *
+ * @param aMethod
+ * Setter name without the "set" prefix with the first character
+ * converted to lower case.
+ *
* @return Parameter values.
- *
- * @throws IllegalArgumentException DOCUMENT ME!
+ *
*/
public ParameterValues values(String aMethod) {
for (Method method : setters.keySet()) {
}
}
- throw new IllegalArgumentException("No setter method '" + aMethod
- + "' found");
+ throw new IllegalArgumentException("No setter method '" + aMethod +
+ "' found");
}
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
public List<Method> getSetters() {
return new ArrayList<Method>(setters.keySet());
}