Author: ivaynberg
Date: Wed Jan 31 13:08:08 2007
New Revision: 501997
URL: http://svn.apache.org/viewvc?view=rev&rev=501997
Log:
WICKET-28
Modified:
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
Modified:
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java?view=diff&rev=501997&r1=501996&r2=501997
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
Wed Jan 31 13:08:08 2007
@@ -25,11 +25,12 @@
import wicket.spring.SpringBeanLocator;
/**
- * [EMAIL PROTECTED] IFieldValueFactory} that uses [EMAIL PROTECTED]
LazyInitProxyFactory} to create proxies for Spring
- * dependencies based on the [EMAIL PROTECTED] SpringBean} annotation applied
to a field.
- * This class is usually used by the [EMAIL PROTECTED] AnnotSpringInjector} to
inject
- * objects with lazy init proxies. However, this class can be used on its own
to
- * create proxies for any field decorated with a [EMAIL PROTECTED] SpringBean}
annotation.
+ * [EMAIL PROTECTED] IFieldValueFactory} that uses [EMAIL PROTECTED]
LazyInitProxyFactory} to create
+ * proxies for Spring dependencies based on the [EMAIL PROTECTED] SpringBean}
annotation
+ * applied to a field. This class is usually used by the
+ * [EMAIL PROTECTED] AnnotSpringInjector} to inject objects with lazy init
proxies.
+ * However, this class can be used on its own to create proxies for any field
+ * decorated with a [EMAIL PROTECTED] SpringBean} annotation.
* <p>
* Example:
*
@@ -39,9 +40,9 @@
* IDependency dependency = (IDependency) factory.getFieldValue(field, obj);
* </pre>
*
- * In the example above the <code>dependency</code> object returned is a lazy
init proxy
- * that will look up the actual IDependency bean from spring context upon first
- * access to one of the methods.
+ * In the example above the <code>dependency</code> object returned is a lazy
+ * init proxy that will look up the actual IDependency bean from spring context
+ * upon first access to one of the methods.
* <p>
* This class will also cache any produced proxies so that the same proxy is
* always returned for the same spring dependency. This helps cut down on
@@ -55,21 +56,22 @@
* @author Igor Vaynberg (ivaynberg)
*
*/
-public class AnnotProxyFieldValueFactory implements IFieldValueFactory
-{
+public class AnnotProxyFieldValueFactory implements IFieldValueFactory {
private ISpringContextLocator contextLocator;
private final ConcurrentHashMap<SpringBeanLocator, Object> cache = new
ConcurrentHashMap<SpringBeanLocator, Object>();
+ /** fail fast tag, see [EMAIL PROTECTED] #setFailFast(boolean)} */
+ private boolean failFast = true;
+
/**
* @param contextLocator
* spring context locator
*/
- public AnnotProxyFieldValueFactory(ISpringContextLocator contextLocator)
- {
- if (contextLocator == null)
- {
- throw new IllegalArgumentException("[contextLocator]
argument cannot be null");
+ public AnnotProxyFieldValueFactory(ISpringContextLocator
contextLocator) {
+ if (contextLocator == null) {
+ throw new IllegalArgumentException(
+ "[contextLocator] argument cannot be
null");
}
this.contextLocator = contextLocator;
}
@@ -78,33 +80,31 @@
* @see
wicket.injection.IFieldValueFactory#getFieldValue(java.lang.reflect.Field,
* java.lang.Object)
*/
- public Object getFieldValue(Field field, Object fieldOwner)
- {
+ public Object getFieldValue(Field field, Object fieldOwner) {
- if (field.isAnnotationPresent(SpringBean.class))
- {
+ if (field.isAnnotationPresent(SpringBean.class)) {
SpringBean annot =
field.getAnnotation(SpringBean.class);
- SpringBeanLocator locator = new
SpringBeanLocator(annot.name(), field
- .getType(), contextLocator);
+ SpringBeanLocator locator = new
SpringBeanLocator(annot.name(),
+ field.getType(), contextLocator);
- if (cache.containsKey(locator))
- {
+ if (cache.containsKey(locator)) {
return cache.get(locator);
}
// fail early - see if the locator can locate the
spring bean
- testLocator(locator, fieldOwner, field);
-
- Object proxy =
LazyInitProxyFactory.createProxy(field.getType(), locator);
+ if (failFast) {
+ testLocator(locator, fieldOwner, field);
+ }
+
+ Object proxy =
LazyInitProxyFactory.createProxy(field.getType(),
+ locator);
cache.put(locator, proxy);
return proxy;
- }
- else
- {
+ } else {
return null;
}
}
-
+
/**
* Tests if the locator can retrieve the bean it is responsible for.
*
@@ -112,34 +112,36 @@
* @param fieldOwner
* @param field
*/
- private void testLocator(SpringBeanLocator locator, Object fieldOwner,
Field field)
- {
- try
- {
+ private void testLocator(SpringBeanLocator locator, Object fieldOwner,
+ Field field) {
+ try {
locator.locateProxyTarget();
- }
- catch (Throwable e)
- {
+ } catch (Throwable e) {
String errorMessage = "Could not locate spring bean of
class [["
+ locator.getBeanType().getName() + "]]
";
- if (locator.getBeanName() != null &&
locator.getBeanName().length() > 0)
- {
+ if (locator.getBeanName() != null
+ && locator.getBeanName().length() > 0) {
errorMessage += "and id [[" +
locator.getBeanName() + "]] ";
}
errorMessage += "needed in class [["
- + fieldOwner.getClass().getName() + "]]
field [[" + field.getName()
- + "]]";
+ + fieldOwner.getClass().getName() + "]]
field [["
+ + field.getName() + "]]";
throw new RuntimeException(errorMessage, e);
}
}
-
/**
* @see
wicket.injection.IFieldValueFactory#supportsField(java.lang.reflect.Field)
*/
- public boolean supportsField(Field field)
- {
+ public boolean supportsField(Field field) {
return field.isAnnotationPresent(SpringBean.class);
}
+ /**
+ * @param failFast
+ * true if the locator fails if a bean can't be located
+ */
+ public void setFailFast(boolean failFast) {
+ this.failFast = failFast;
+ }
}
Modified:
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java?view=diff&rev=501997&r1=501996&r2=501997
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
Wed Jan 31 13:08:08 2007
@@ -116,4 +116,30 @@
// noop
}
}
+
+ public void testFailsIfBeanWithIdIsNotFound() throws Exception
+ {
+ InjectableWithReferenceToNonexistingBean obj = new
InjectableWithReferenceToNonexistingBean();
+ Field field = obj.getClass().getDeclaredField("nonExisting");
+ try
+ {
+ factory.getFieldValue(field, obj);
+ fail();
+ }
+ catch (RuntimeException e) {
+ }
+ }
+
+ public void testSucceedsIfBeanWithIdIsNotFoundWhenFailFastIsDisabled()
throws Exception
+ {
+ InjectableWithReferenceToNonexistingBean obj = new
InjectableWithReferenceToNonexistingBean();
+ Field field = obj.getClass().getDeclaredField("nonExisting");
+ factory.setFailFast(false);
+ factory.getFieldValue(field, obj);
+ }
+
+ static class InjectableWithReferenceToNonexistingBean {
+ @SpringBean(name="nonExisting")
+ private Bean nonExisting;
+ }
}