[ 
https://issues.apache.org/jira/browse/SLING-5801?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Piotr Rzasa updated SLING-5801:
-------------------------------
    Description: 
Scenario:

{code}
@Model(adaptables = SlingHttpServletRequest.class)
public class A {
}

@Model(adaptables = SlingHttpServletRequest.class)
public class B {

    @Inject
    private A instanceOfA;
}

{code}

Injection of Sling model A in Sling Model B will fails, the error appears that 
there is no injection which can handle it.

I think it will be good to add such injector and extend Via annotation to 
support injection either from resource or from request.

Here is an example implementation:
{code}
@Component
@Service
@Property(name = Constants.SERVICE_RANKING, intValue = Integer.MAX_VALUE)
public class RequestInjector implements Injector {

        public static final String INJECTOR_NAME = 
"adaptable-from-request-injector";

        @Override
        public String getName() {
                return INJECTOR_NAME;
        }

        @Override
        public Object getValue(Object adaptable, String name, Type 
declaredType, AnnotatedElement element,
                                                   DisposalCallbackRegistry 
callbackRegistry) {

                if (!(adaptable instanceof SlingHttpServletRequest)) {
                        return null;
                }

                SlingHttpServletRequest request = (SlingHttpServletRequest) 
adaptable;
                Class<?> clazz = getClassDeclaration(declaredType);
                if (clazz != null) {
                        return request.adaptTo(clazz);
                }

                return null;
        }

        private Class<?> getClassDeclaration(Type declaredType) {
                Class<?> result = null;
                if (declaredType instanceof Class<?>) {
                        result = (Class<?>) declaredType;
                }
                return result;
        }
}

{code}

  was:
Scenario:

{code}
@Model(adaptables = SlingHttpServletRequest.class)
public class A {
}

@Model(adaptables = SlingHttpServletRequest.class)
public class B {

    @Inject
    private A instanceOfA;
}

{code}

Injection of Sling model A in Sling Model B will fails, the error appears that 
there is no injection which can handle it.

I think it will be good to add such injector and extend Via annotation to 
support injection either from resource or from request.

Here is an example implementation:
{code}
@Component
@Service
@Property(name = Constants.SERVICE_RANKING, intValue = Integer.MAX_VALUE)
public class RequestInjector implements Injector {

        public static final String INJECTOR_NAME = 
"adaptable-from-request-injector";

        @Override
        public String getName() {
                return INJECTOR_NAME;
        }

        @Override
        public Object getValue(Object adaptable, String name, Type 
declaredType, AnnotatedElement element,
                                                   DisposalCallbackRegistry 
callbackRegistry) {

                if (!(adaptable instanceof SlingHttpServletRequest)) {
                        return null;
                }
                Source source = element.getAnnotation(Source.class);

                SlingHttpServletRequest request = (SlingHttpServletRequest) 
adaptable;
                Class<?> clazz = getClassDeclaration(declaredType);
                if (clazz != null) {
                        return request.adaptTo(clazz);
                }

                return null;
        }

        private Class<?> getClassDeclaration(Type declaredType) {
                Class<?> result = null;
                if (declaredType instanceof Class<?>) {
                        result = (Class<?>) declaredType;
                }
                return result;
        }
}

{code}


> There is no possible to inject Sling Models adaptable from 
> SlingHttpServletRequest in Sling Model object which is adaptable from 
> SlingHttpServletRequest as well
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: SLING-5801
>                 URL: https://issues.apache.org/jira/browse/SLING-5801
>             Project: Sling
>          Issue Type: Improvement
>            Reporter: Piotr Rzasa
>            Priority: Minor
>
> Scenario:
> {code}
> @Model(adaptables = SlingHttpServletRequest.class)
> public class A {
> }
> @Model(adaptables = SlingHttpServletRequest.class)
> public class B {
>     @Inject
>     private A instanceOfA;
> }
> {code}
> Injection of Sling model A in Sling Model B will fails, the error appears 
> that there is no injection which can handle it.
> I think it will be good to add such injector and extend Via annotation to 
> support injection either from resource or from request.
> Here is an example implementation:
> {code}
> @Component
> @Service
> @Property(name = Constants.SERVICE_RANKING, intValue = Integer.MAX_VALUE)
> public class RequestInjector implements Injector {
>       public static final String INJECTOR_NAME = 
> "adaptable-from-request-injector";
>       @Override
>       public String getName() {
>               return INJECTOR_NAME;
>       }
>       @Override
>       public Object getValue(Object adaptable, String name, Type 
> declaredType, AnnotatedElement element,
>                                                  DisposalCallbackRegistry 
> callbackRegistry) {
>               if (!(adaptable instanceof SlingHttpServletRequest)) {
>                       return null;
>               }
>               SlingHttpServletRequest request = (SlingHttpServletRequest) 
> adaptable;
>               Class<?> clazz = getClassDeclaration(declaredType);
>               if (clazz != null) {
>                       return request.adaptTo(clazz);
>               }
>               return null;
>       }
>       private Class<?> getClassDeclaration(Type declaredType) {
>               Class<?> result = null;
>               if (declaredType instanceof Class<?>) {
>                       result = (Class<?>) declaredType;
>               }
>               return result;
>       }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to