Author: aparfonov
Date: 2011-02-05 02:05:03 -0500 (Sat, 05 Feb 2011)
New Revision: 3926
Removed:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/InjectionProvider.java
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/FieldInjectorImpl.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-04
17:08:40 UTC (rev 3925)
+++
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)
@@ -26,6 +26,9 @@
import org.exoplatform.services.rest.Parameter;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
@@ -69,7 +72,8 @@
final ValueParam injectAnnotationParameter =
params.getValueParam("inject.annotation.class");
try
{
- injectAnnotationClass = AccessController.doPrivileged(new
PrivilegedExceptionAction<Class>() {
+ injectAnnotationClass = AccessController.doPrivileged(new
PrivilegedExceptionAction<Class>()
+ {
public Class run() throws ClassNotFoundException
{
return
Thread.currentThread().getContextClassLoader().loadClass(injectAnnotationParameter.getValue());
@@ -107,21 +111,66 @@
return getComponent(parameter.getParameterClass());
}
- @SuppressWarnings({"rawtypes", "unchecked"})
+ @SuppressWarnings({"rawtypes"})
protected Object getComponent(Class<?> parameterClass)
{
ExoContainer container = ExoContainerContext.getCurrentContainer();
- List injectionProviders =
container.getComponentInstancesOfType(InjectionProvider.class);
+ List injectionProviders =
container.getComponentInstancesOfType(javax.inject.Provider.class);
if (injectionProviders != null && injectionProviders.size() > 0)
{
for (Iterator i = injectionProviders.iterator(); i.hasNext();)
{
- InjectionProvider provider = (InjectionProvider)i.next();
- if (provider.isSupported(parameterClass))
- return javax.inject.Provider.class.isAssignableFrom(parameterClass) ?
provider : provider.get();
+ javax.inject.Provider provider = (javax.inject.Provider)i.next();
+ Type injectedType = resolveInjectedType(provider.getClass());
+ if (injectedType != null)
+ {
+ if (injectedType instanceof Class<?>)
+ {
+ if (parameterClass.isAssignableFrom((Class<?>)injectedType))
+ return javax.inject.Provider.class.isAssignableFrom(parameterClass)
? provider : 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
javax.inject.Provider.class.isAssignableFrom(parameterClass) ? provider : provider.get();
+ // TODO check generic type
+ }
+ }
+ }
}
}
- // Directly look up component in container by class,
+ // Directly look up component in container by class.
return container.getComponentInstanceOfType(parameterClass);
}
+
+ private Type resolveInjectedType(final Class<?> providerClass)
+ {
+ Method get = null;
+ Type injectedType = null;
+ try
+ {
+ get = AccessController.doPrivileged(new
PrivilegedExceptionAction<Method>()
+ {
+ public Method run() throws NoSuchMethodException
+ {
+ return providerClass.getMethod("get");
+ }
+ });
+ }
+ catch (PrivilegedActionException pe)
+ {
+ NoSuchMethodException c = (NoSuchMethodException)pe.getCause();
+ // Should never happen since class implements javax.inject.Provider.
+ throw new RuntimeException(c.getMessage());
+ }
+
+ if (get != null)
+ injectedType = get.getGenericReturnType();
+
+ return injectedType;
+ }
}
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/FieldInjectorImpl.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/FieldInjectorImpl.java 2011-02-04
17:08:40 UTC (rev 3925)
+++
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/FieldInjectorImpl.java 2011-02-05
07:05:03 UTC (rev 3926)
@@ -18,8 +18,6 @@
*/
package org.exoplatform.services.rest.impl;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
import org.exoplatform.services.rest.ApplicationContext;
import org.exoplatform.services.rest.FieldInjector;
import org.exoplatform.services.rest.impl.method.ParameterHelper;
@@ -50,7 +48,7 @@
public class FieldInjectorImpl implements FieldInjector
{
/** Logger. */
- private static final Log LOG =
ExoLogger.getLogger("exo.ws.rest.core.FieldInjectorImpl");
+ //private static final Log LOG =
ExoLogger.getLogger("exo.ws.rest.core.FieldInjectorImpl");
/** All annotations including JAX-RS annotation. */
private final Annotation[] annotations;
@@ -120,11 +118,11 @@
{
defaultValue = ((DefaultValue)a).value();
}
- else
+ /*else
{
LOG.warn("Field " + jfield.toString() + " contains unknown or
not allowed JAX-RS annotation "
+ a.toString() + ". It will be ignored.");
- }
+ }*/
}
this.defaultValue = defaultValue;
Deleted:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/InjectionProvider.java
===================================================================
---
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/InjectionProvider.java 2011-02-04
17:08:40 UTC (rev 3925)
+++
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/InjectionProvider.java 2011-02-05
07:05:03 UTC (rev 3926)
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2011 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.exoplatform.services.rest.impl;
-
-import javax.inject.Provider;
-
-/**
- * @author <a href="mailto:andrey.parfonov@exoplatform.com">Andrey
Parfonov</a>
- * @version $Id$
- * @see Provider
- */
-public interface InjectionProvider<O> extends Provider<O>
-{
- /**
- * Check is InjectionProvider able to produce instance of class
- * <code>clazz</code>.
- *
- * @param clazz class to be checked
- * @return <code>true</code> if able to produce class and
<code>false</code>
- * otherwise
- * @see #get()
- */
- boolean isSupported(Class<O> clazz);
-}
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-04
17:08:40 UTC (rev 3925)
+++
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)
@@ -31,37 +31,36 @@
*/
public class InjectAnnotationTest extends BaseTest
{
- public static class InjectableComponent
+ public static interface GenericIngectable<T>
{
+ }
+
+ public static class InjectableComponent implements GenericIngectable<String>
+ {
public String message = "injected from container";
}
- public static class InjectionProvider0 implements
InjectionProvider<InjectableComponent>
+ public static class Provider0 implements
Provider<GenericIngectable<String>>
{
- public InjectableComponent get()
+ public/*InjectableComponent*/GenericIngectable<String> get()
{
InjectableComponent injectable = new InjectableComponent();
injectable.message = "injected from provider";
return injectable;
}
-
- public boolean isSupported(Class<InjectableComponent> clazz)
- {
- return InjectableComponent.class.isAssignableFrom(clazz);
- }
}
@Path("a")
public static class Resource1
{
@Inject
- private InjectableComponent injected;
+ private GenericIngectable<String> injected;
@GET
public String m()
{
assertNotNull(injected);
- return injected.message;
+ return ((InjectableComponent)injected).message;
}
}
@@ -93,23 +92,23 @@
public void testInjectFromProvider() throws Exception
{
- container.registerComponentInstance(InjectionProvider0.class.getName(), new
InjectionProvider0());
+ container.registerComponentInstance(Provider0.class.getName(), new Provider0());
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(InjectionProvider0.class.getName());
+ container.unregisterComponent(Provider0.class.getName());
}
public void testInjectProvider() throws Exception
{
- container.registerComponentInstance(InjectionProvider0.class.getName(), new
InjectionProvider0());
+ container.registerComponentInstance(Provider0.class.getName(), new Provider0());
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(InjectionProvider0.class.getName());
+ container.unregisterComponent(Provider0.class.getName());
}
}