001 /*****************************************************************************
002 * Copyright (C) PicoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 * Original code by *
009 *****************************************************************************/
010 package org.picocontainer.injectors;
011
012 import org.picocontainer.ComponentMonitor;
013 import org.picocontainer.NameBinding;
014 import org.picocontainer.Parameter;
015 import org.picocontainer.PicoContainer;
016
017 import java.lang.reflect.AccessibleObject;
018 import java.lang.reflect.Method;
019 import java.lang.reflect.Type;
020 import java.util.Set;
021
022 @SuppressWarnings("serial")
023 public class NamedMethodInjector<T> extends SetterInjector<T> {
024
025 private final boolean optional;
026
027 public NamedMethodInjector(Object key,
028 Class<?> impl,
029 Parameter[] parameters,
030 ComponentMonitor monitor,
031 boolean optional) {
032 this(key, impl, parameters, monitor, "set", optional);
033 }
034
035 public NamedMethodInjector(Object key,
036 Class<?> impl,
037 Parameter[] parameters,
038 ComponentMonitor monitor) {
039 this(key, impl, parameters, monitor, "set", true);
040 }
041
042 public NamedMethodInjector(Object key,
043 Class<?> impl,
044 Parameter[] parameters,
045 ComponentMonitor monitor,
046 String prefix) {
047 this(key, impl, parameters, monitor, prefix, true);
048 }
049
050 public NamedMethodInjector(Object key,
051 Class<?> impl,
052 Parameter[] parameters,
053 ComponentMonitor monitor,
054 String prefix,
055 boolean optional) {
056 super(key, impl, parameters, monitor, prefix, true);
057 this.optional = optional;
058 }
059
060 @Override
061 protected NameBinding makeParameterNameImpl(final AccessibleObject member) {
062 return new NameBinding() {
063 public String getName() {
064 String name = ((Method)member).getName().substring(prefix.length()); // string off 'set' or chosen prefix
065 return name.substring(0,1).toLowerCase() + name.substring(1); // change "SomeThing" to "someThing"
066 }
067 };
068 }
069
070 @Override
071 protected void unsatisfiedDependencies(PicoContainer container, Set<Type> unsatisfiableDependencyTypes) {
072 if (!optional) {
073 super.unsatisfiedDependencies(container, unsatisfiableDependencyTypes);
074 }
075 }
076
077 @Override
078 public String getDescriptor() {
079 return "NamedMethodInjection";
080 }
081
082 }