Author: ivaynberg
Date: Tue Oct 27 06:44:01 2009
New Revision: 830069
URL: http://svn.apache.org/viewvc?rev=830069&view=rev
Log:
WICKET-625, WICKET-2080
Modified:
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/Injector.java
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/web/InjectorHolder.java
Modified:
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/Injector.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/Injector.java?rev=830069&r1=830068&r2=830069&view=diff
==============================================================================
---
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/Injector.java
(original)
+++
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/Injector.java
Tue Oct 27 06:44:01 2009
@@ -18,7 +18,10 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.wicket.Component;
@@ -39,10 +42,7 @@
{
private static Injector instance = new Injector();
- // FIXME: WICKET-625 - Wicket doesn't clean up properly when
hot-deploying;
- // hangs onto Class references.
- // We need some way to clean out this hashmap when we're done.
- private final ConcurrentHashMap<Class< ? >, Field[]> classToFields =
new ConcurrentHashMap<Class< ? >, Field[]>();
+ private final Map<ClassLoader, ConcurrentHashMap<String, Field[]>>
cache = Collections.synchronizedMap(new WeakHashMap<ClassLoader,
ConcurrentHashMap<String, Field[]>>());
/**
* @return static instance of ProxyInjector
@@ -63,7 +63,7 @@
* class to be tested for being a boundary class
* @return true if the class is a boundary class, false otherwise
*/
- protected boolean isBoundaryClass(Class< ? > clazz)
+ protected boolean isBoundaryClass(Class<?> clazz)
{
if (clazz.equals(WebPage.class) || clazz.equals(Page.class) ||
clazz.equals(Panel.class) ||
clazz.equals(MarkupContainer.class) ||
clazz.equals(Component.class))
@@ -83,12 +83,25 @@
*/
public Object inject(Object object, IFieldValueFactory factory)
{
- Class< ? > clazz = object.getClass();
- Field[] fields = classToFields.get(clazz);
+ final Class<?> clazz = object.getClass();
+
+ Field[] fields = null;
+
+ // try cache
+ ConcurrentHashMap<String, Field[]> container =
cache.get(clazz.getClassLoader());
+ if (container != null)
+ {
+ fields = container.get(clazz.getName());
+ }
+
if (fields == null)
{
fields = findFields(clazz, factory);
- classToFields.put(clazz, fields);
+
+ // write to cache
+ container = new ConcurrentHashMap<String, Field[]>();
+ container.put(clazz.getName(), fields);
+ cache.put(clazz.getClassLoader(), container);
}
for (int i = 0; i < fields.length; i++)
@@ -135,7 +148,7 @@
* @param factory
* @return an array of fields that can be injected using the given
field value factory
*/
- private Field[] findFields(Class< ? > clazz, IFieldValueFactory factory)
+ private Field[] findFields(Class<?> clazz, IFieldValueFactory factory)
{
List<Field> matched = new ArrayList<Field>();
Modified:
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/web/InjectorHolder.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/web/InjectorHolder.java?rev=830069&r1=830068&r2=830069&view=diff
==============================================================================
---
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/web/InjectorHolder.java
(original)
+++
wicket/trunk/wicket-ioc/src/main/java/org/apache/wicket/injection/web/InjectorHolder.java
Tue Oct 27 06:44:01 2009
@@ -16,6 +16,8 @@
*/
package org.apache.wicket.injection.web;
+import org.apache.wicket.Application;
+import org.apache.wicket.MetaDataKey;
import org.apache.wicket.injection.ConfigurableInjector;
/**
@@ -39,16 +41,19 @@
* InjectorHolder.setInjector(new MockSpringInjector());
*
* //from this point on InjectableWebPage and InjectablePanel
- * //will be injected using the MockSpringInjector
+ * //will be injected using the MockSpringInjector
* </pre>
*
* @author Igor Vaynberg (ivaynberg)
*
- * TODO shouldn't we move this class to org.apache.wicket.injection ?
+ * TODO shouldn't we move this class to org.apache.wicket.injection ?
*/
public class InjectorHolder
{
- private static ConfigurableInjector injector = null;
+ private static final MetaDataKey<ConfigurableInjector> INJECTOR_KEY =
new MetaDataKey<ConfigurableInjector>()
+ {
+ private static final long serialVersionUID = 1L;
+ };
/**
* Gets an injector
@@ -59,12 +64,13 @@
*/
public static ConfigurableInjector getInjector()
{
+ ConfigurableInjector injector =
Application.get().getMetaData(INJECTOR_KEY);
if (injector == null)
{
throw new IllegalStateException("InjectorHolder has not
been assigned an injector. "
- + "Use InjectorHolder.setInjector() to
assign an injector. "
- + "In most cases this should be done
once inside "
- + "SpringWebApplication subclass's
init() method.");
+ + "Use InjectorHolder.setInjector() to assign
an injector. "
+ + "In most cases this should be done once
inside "
+ + "SpringWebApplication subclass's init()
method.");
}
return injector;
}
@@ -79,7 +85,8 @@
*/
public static void setInjector(ConfigurableInjector newInjector)
{
- injector = newInjector;
+ Application application = Application.get();
+ application.setMetaData(INJECTOR_KEY, newInjector);
}
}