Author: aparfonov
Date: 2011-02-05 10:50:17 -0500 (Sat, 05 Feb 2011)
New Revision: 3927
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DependencySupplier.java
ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/InjectAnnotationTest.java
Log:
EXOJCR-1181
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DependencySupplier.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DependencySupplier.java 2011-02-05
07:05:03 UTC (rev 3926)
+++
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DependencySupplier.java 2011-02-05
15:50:17 UTC (rev 3927)
@@ -104,15 +104,15 @@
{
for (Annotation a : parameter.getAnnotations())
if (injectAnnotationClass.isInstance(a))
- return getComponent(parameter.getParameterClass());
+ return getComponent(parameter.getParameterClass(),
parameter.getGenericType());
return null;
}
// Annotation required for fields only.
- return getComponent(parameter.getParameterClass());
+ return getComponent(parameter.getParameterClass(), parameter.getGenericType());
}
@SuppressWarnings({"rawtypes"})
- protected Object getComponent(Class<?> parameterClass)
+ protected Object getComponent(Class<?> parameterClass, Type genericType)
{
ExoContainer container = ExoContainerContext.getCurrentContainer();
List injectionProviders =
container.getComponentInstancesOfType(javax.inject.Provider.class);
@@ -124,27 +124,53 @@
Type injectedType = resolveInjectedType(provider.getClass());
if (injectedType != null)
{
- if (injectedType instanceof Class<?>)
+ if (javax.inject.Provider.class == parameterClass)
{
- if (parameterClass.isAssignableFrom((Class<?>)injectedType))
- return javax.inject.Provider.class.isAssignableFrom(parameterClass)
? provider : provider.get();
+ if (genericType instanceof ParameterizedType)
+ {
+ Type[] parameterActualTypes =
((ParameterizedType)genericType).getActualTypeArguments();
+ if (parameterActualTypes.length > 0)
+ {
+ if (parameterActualTypes[0] instanceof Class<?>)
+ {
+ Class<?> actualType =
(Class<?>)parameterActualTypes[0];
+ if (actualType == injectedType)
+ return provider;
+ }
+ else if (parameterActualTypes[0] instanceof ParameterizedType)
+ {
+ ParameterizedType actualType =
(ParameterizedType)parameterActualTypes[0];
+ if (actualType.equals(injectedType))
+ return provider;
+ }
+ }
+ }
}
- else if (injectedType instanceof ParameterizedType)
+ else
{
- ParameterizedType pType = (ParameterizedType)injectedType;
- Type rawType = pType.getRawType();
- if (rawType instanceof Class<?>)
+ if (injectedType instanceof Class<?>)
{
- if (parameterClass.isAssignableFrom((Class<?>)rawType))
- return
javax.inject.Provider.class.isAssignableFrom(parameterClass) ? provider : provider.get();
- // TODO check generic type
+ if (parameterClass.isAssignableFrom((Class<?>)injectedType))
+ return provider.get();
}
+ else if (injectedType instanceof ParameterizedType)
+ {
+ ParameterizedType pType = (ParameterizedType)injectedType;
+ Type rawType = pType.getRawType();
+ if (rawType instanceof Class<?>)
+ {
+ if (parameterClass.isAssignableFrom((Class<?>)rawType))
+ return provider.get();
+ }
+ }
}
}
}
}
- // Directly look up component in container by class.
- return container.getComponentInstanceOfType(parameterClass);
+ // Directly look up component in container by class if it is not
javax.inject.Provider.
+ if (!javax.inject.Provider.class.isAssignableFrom(parameterClass))
+ return container.getComponentInstanceOfType(parameterClass);
+ return null;
}
private Type resolveInjectedType(final Class<?> providerClass)
Modified:
ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/InjectAnnotationTest.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/InjectAnnotationTest.java 2011-02-05
07:05:03 UTC (rev 3926)
+++
ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/InjectAnnotationTest.java 2011-02-05
15:50:17 UTC (rev 3927)
@@ -40,9 +40,9 @@
public String message = "injected from container";
}
- public static class Provider0 implements
Provider<GenericIngectable<String>>
+ public static class Provider90 implements
Provider<GenericIngectable<String>>
{
- public/*InjectableComponent*/GenericIngectable<String> get()
+ public GenericIngectable<String> get()
{
InjectableComponent injectable = new InjectableComponent();
injectable.message = "injected from provider";
@@ -68,13 +68,14 @@
public static class Resource2
{
@Inject
- private Provider<InjectableComponent> injected;
+ //private Provider<InjectableComponent> injected;
+ private Provider<GenericIngectable<String>> injected;
@GET
public String m()
{
assertNotNull(injected);
- InjectableComponent inst = injected.get();
+ InjectableComponent inst = (InjectableComponent)injected.get();
return inst.message;
}
}
@@ -92,23 +93,23 @@
public void testInjectFromProvider() throws Exception
{
- container.registerComponentInstance(Provider0.class.getName(), new Provider0());
+ container.registerComponentInstance(Provider90.class.getName(), new Provider90());
registry(Resource1.class);
ContainerResponse response = launcher.service("GET", "/a",
"", null, null, null);
assertEquals(200, response.getStatus());
assertEquals("injected from provider", response.getEntity());
unregistry(Resource1.class);
- container.unregisterComponent(Provider0.class.getName());
+ container.unregisterComponent(Provider90.class.getName());
}
public void testInjectProvider() throws Exception
{
- container.registerComponentInstance(Provider0.class.getName(), new Provider0());
+ container.registerComponentInstance(Provider90.class.getName(), new Provider90());
registry(Resource2.class);
ContainerResponse response = launcher.service("GET", "/b",
"", null, null, null);
assertEquals(200, response.getStatus());
assertEquals("injected from provider", response.getEntity());
unregistry(Resource2.class);
- container.unregisterComponent(Provider0.class.getName());
+ container.unregisterComponent(Provider90.class.getName());
}
}
Show replies by date