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

Dan Haywood updated CAMEL-1628:
-------------------------------

    Description: 
see also: 
http://www.nabble.com/How-extract-message-body-and-use-later-on-in-route-for-endpoint--td23612034.html

I've got:

private static final String HOST_URI = "http://localhost:7070";;

from("direct:getEmployee")
.to("restlet:" + HOST_URI + "/services")
.process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        String resourcePath = ... xpath to obtain the resource path from 
exchange.getIn().getBody()
        message.setBody(resourcePath);
        exchange.setOut(message);
    }
}).recipientList(new ExpressionAdapter(){
    public Object evaluate(Exchange exchange) {
        return "restlet:" + HOST_URI + exchange.getIn().getBody();
    }
});

The first restlet call succeeds, returning an XHTML entity.  The processor then 
extracts a resource from an <a href>

The ExpressionAdapter dynamically constructs a new Uri to invoke via Restlet.  
However, this second restlet call fails, with a nullpointerexception.  It seems 
that the org.restlet.Restlet is instantiated with the default constructor.  For 
the first successful call the Restlet#init() method is called, so its context 
is setup correctly.  But for the second restlet call #init() doesn't seem to 
get called.

This ultimately triggers the NPE in 
com.neolios.restlet.http.HttpConverter#addAdditionalHeaders, trying to get a 
Logger from this context object, but it is passed in from RestletComponent 
which I imagine wraps the Restlet.

My guess is that it is the dynamic creation of the recipientList is what's 
ultimately responsible for this failure to call #init()?

This is Camel 2.0-M1 against Restlet 1.1.1.

----
Some stacktraces:

1. first time through:

Component(Restlet).setContext(Context) line: 228        
ComponentHelper.<init>(Component) line: 64      
Engine.createHelper(Component) line: 380        
Engine.createHelper(Component) line: 105        
Component.<init>() line: 177    
RestletComponent.<init>() line: 46      
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not 
available [native method]   
NativeConstructorAccessorImpl.newInstance(Object[]) line: 39    
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 27        
Constructor<T>.newInstance(Object...) line: 494 
Class<T>.newInstance0() line: 350 [local variables unavailable] 
Class<T>.newInstance() line: 303 [local variables unavailable]  
ObjectHelper.newInstance(Class<T>) line: 797    
ReflectionInjector.newInstance(Class<T>) line: 32       
DefaultComponentResolver.resolveComponent(String, CamelContext) line: 72        
DefaultCamelContext.getComponent(String) line: 201      
DefaultCamelContext.getEndpoint(String) line: 354       
CamelContextHelper.getMandatoryEndpoint(CamelContext, String) line: 52  
RouteDefinition.resolveEndpoint(String) line: 133       
DefaultRouteContext.resolveEndpoint(String) line: 103   
DefaultRouteContext.resolveEndpoint(String, String) line: 109   
ToDefinition(SendDefinition<Type>).resolveEndpoint(RouteContext) line: 57       
ToDefinition(SendDefinition<Type>).createProcessor(RouteContext) line: 51       

-vs-

2. second time through, is constructed, but no setContext was called:

Client(Restlet).<init>(Context) line: 79        
Client(Connector).<init>(Context, List<Protocol>) line: 83      
Client.<init>(Context, List<Protocol>, String) line: 82 
Client.<init>(Context, Protocol) line: 101      
Client.<init>(Protocol) line: 121       
Client.<init>(String) line: 131 
RestletProducer.<init>(RestletEndpoint) line: 38        
RestletEndpoint.createProducer() line: 73       
ProducerCache.getProducer(Endpoint) line: 52    
RecipientList.sendToRecipientList(Exchange, Object) line: 74    
RecipientList.process(Exchange) line: 62        
InstrumentationProcessor.process(Exchange, AsyncCallback) line: 80      
StreamCachingInterceptor.proceed(Exchange, AsyncCallback) line: 88      
StreamCachingInterceptor.process(Exchange, AsyncCallback) line: 83      
DeadLetterChannel.process(Exchange, AsyncCallback, 
DeadLetterChannel$RedeliveryData) line: 195  
DeadLetterChannel.process(Exchange, AsyncCallback) line: 130    
Pipeline.process(Exchange, Exchange, AsyncCallback, Iterator<Processor>, 
AsyncProcessor) line: 115      
Pipeline.process(Exchange, AsyncCallback) line: 89      
InstrumentationProcessor.process(Exchange, AsyncCallback) line: 68      
StreamCachingInterceptor.proceed(Exchange, AsyncCallback) line: 88      
StreamCachingInterceptor.process(Exchange, AsyncCallback) line: 83      
UnitOfWorkProcessor.process(Exchange, AsyncCallback) line: 52   
AsyncProcessorHelper.process(AsyncProcessor, Exchange) line: 41 
UnitOfWorkProcessor(DelegateAsyncProcessor).process(Exchange) line: 65  
DirectProducer.process(Exchange) line: 47       
ProducerCache.sendExchange(Endpoint, Producer, Processor, Exchange) line: 151   
ProducerCache.send(Endpoint, ExchangePattern, Processor) line: 136      
DefaultProducerTemplate.send(Endpoint, ExchangePattern, Processor) line: 99     
DefaultProducerTemplate.sendBody(Endpoint, ExchangePattern, Object) line: 103

  was:
see also: 
http://www.nabble.com/How-extract-message-body-and-use-later-on-in-route-for-endpoint--td23612034.html

I've got:

private static final String HOST_URI = "http://localhost:7070";;

from("direct:getEmployee")
.to("restlet:" + HOST_URI + "/services")
.process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        String resourcePath = ... xpath to obtain the resource path from 
exchange.getIn().getBody()
        message.setBody(resourcePath);
        exchange.setOut(message);
    }
}).recipientList(new ExpressionAdapter(){
    public Object evaluate(Exchange exchange) {
        return "restlet:" + HOST_URI + exchange.getIn().getBody();
    }
});

The first restlet call succeeds, returning an XHTML entity.  The processor then 
extracts a resource from an <a href>

The ExpressionAdapter dynamically constructs a new Uri to invoke via Restlet.  
However, this second restlet call fails, with a nullpointerexception.  It seems 
that the org.restlet.Restlet is instantiated with the default constructor.  For 
the first successful call the Restlet#init() method is called, so its context 
is setup correctly.  But for the second restlet call #init() doesn't seem to 
get called.

This ultimately triggers the NPE in 
com.neolios.restlet.http.HttpConverter#addAdditionalHeaders, trying to get a 
Logger from this context object, but it is passed in from RestletComponent 
which I imagine wraps the Restlet.

My guess is that it is the dynamic creation of the recipientList is what's 
ultimately responsible for this failure to call #init()?

This is Camel 2.0-M1 against Restlet 1.1.1.




> Restlet component fails with NPE if used in combination with dynamic 
> recipients (recipientList())
> -------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-1628
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-1628
>             Project: Apache Camel
>          Issue Type: Bug
>    Affects Versions: 2.0-M1
>         Environment: WinXP SP3, Java 5  (suspect not relevant to this problem)
> Restlet 1.1.1 (suspect not relevant to this problem)
>            Reporter: Dan Haywood
>
> see also: 
> http://www.nabble.com/How-extract-message-body-and-use-later-on-in-route-for-endpoint--td23612034.html
> I've got:
> private static final String HOST_URI = "http://localhost:7070";;
> from("direct:getEmployee")
> .to("restlet:" + HOST_URI + "/services")
> .process(new Processor() {
>     public void process(Exchange exchange) throws Exception {
>         String resourcePath = ... xpath to obtain the resource path from 
> exchange.getIn().getBody()
>         message.setBody(resourcePath);
>         exchange.setOut(message);
>     }
> }).recipientList(new ExpressionAdapter(){
>     public Object evaluate(Exchange exchange) {
>         return "restlet:" + HOST_URI + exchange.getIn().getBody();
>     }
> });
> The first restlet call succeeds, returning an XHTML entity.  The processor 
> then extracts a resource from an <a href>
> The ExpressionAdapter dynamically constructs a new Uri to invoke via Restlet. 
>  However, this second restlet call fails, with a nullpointerexception.  It 
> seems that the org.restlet.Restlet is instantiated with the default 
> constructor.  For the first successful call the Restlet#init() method is 
> called, so its context is setup correctly.  But for the second restlet call 
> #init() doesn't seem to get called.
> This ultimately triggers the NPE in 
> com.neolios.restlet.http.HttpConverter#addAdditionalHeaders, trying to get a 
> Logger from this context object, but it is passed in from RestletComponent 
> which I imagine wraps the Restlet.
> My guess is that it is the dynamic creation of the recipientList is what's 
> ultimately responsible for this failure to call #init()?
> This is Camel 2.0-M1 against Restlet 1.1.1.
> ----
> Some stacktraces:
> 1. first time through:
> Component(Restlet).setContext(Context) line: 228      
> ComponentHelper.<init>(Component) line: 64    
> Engine.createHelper(Component) line: 380      
> Engine.createHelper(Component) line: 105      
> Component.<init>() line: 177  
> RestletComponent.<init>() line: 46    
> NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not 
> available [native method] 
> NativeConstructorAccessorImpl.newInstance(Object[]) line: 39  
> DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 27      
> Constructor<T>.newInstance(Object...) line: 494       
> Class<T>.newInstance0() line: 350 [local variables unavailable]       
> Class<T>.newInstance() line: 303 [local variables unavailable]        
> ObjectHelper.newInstance(Class<T>) line: 797  
> ReflectionInjector.newInstance(Class<T>) line: 32     
> DefaultComponentResolver.resolveComponent(String, CamelContext) line: 72      
> DefaultCamelContext.getComponent(String) line: 201    
> DefaultCamelContext.getEndpoint(String) line: 354     
> CamelContextHelper.getMandatoryEndpoint(CamelContext, String) line: 52        
> RouteDefinition.resolveEndpoint(String) line: 133     
> DefaultRouteContext.resolveEndpoint(String) line: 103 
> DefaultRouteContext.resolveEndpoint(String, String) line: 109 
> ToDefinition(SendDefinition<Type>).resolveEndpoint(RouteContext) line: 57     
> ToDefinition(SendDefinition<Type>).createProcessor(RouteContext) line: 51     
> -vs-
> 2. second time through, is constructed, but no setContext was called:
> Client(Restlet).<init>(Context) line: 79      
> Client(Connector).<init>(Context, List<Protocol>) line: 83    
> Client.<init>(Context, List<Protocol>, String) line: 82       
> Client.<init>(Context, Protocol) line: 101    
> Client.<init>(Protocol) line: 121     
> Client.<init>(String) line: 131       
> RestletProducer.<init>(RestletEndpoint) line: 38      
> RestletEndpoint.createProducer() line: 73     
> ProducerCache.getProducer(Endpoint) line: 52  
> RecipientList.sendToRecipientList(Exchange, Object) line: 74  
> RecipientList.process(Exchange) line: 62      
> InstrumentationProcessor.process(Exchange, AsyncCallback) line: 80    
> StreamCachingInterceptor.proceed(Exchange, AsyncCallback) line: 88    
> StreamCachingInterceptor.process(Exchange, AsyncCallback) line: 83    
> DeadLetterChannel.process(Exchange, AsyncCallback, 
> DeadLetterChannel$RedeliveryData) line: 195        
> DeadLetterChannel.process(Exchange, AsyncCallback) line: 130  
> Pipeline.process(Exchange, Exchange, AsyncCallback, Iterator<Processor>, 
> AsyncProcessor) line: 115    
> Pipeline.process(Exchange, AsyncCallback) line: 89    
> InstrumentationProcessor.process(Exchange, AsyncCallback) line: 68    
> StreamCachingInterceptor.proceed(Exchange, AsyncCallback) line: 88    
> StreamCachingInterceptor.process(Exchange, AsyncCallback) line: 83    
> UnitOfWorkProcessor.process(Exchange, AsyncCallback) line: 52 
> AsyncProcessorHelper.process(AsyncProcessor, Exchange) line: 41       
> UnitOfWorkProcessor(DelegateAsyncProcessor).process(Exchange) line: 65        
> DirectProducer.process(Exchange) line: 47     
> ProducerCache.sendExchange(Endpoint, Producer, Processor, Exchange) line: 151 
> ProducerCache.send(Endpoint, ExchangePattern, Processor) line: 136    
> DefaultProducerTemplate.send(Endpoint, ExchangePattern, Processor) line: 99   
> DefaultProducerTemplate.sendBody(Endpoint, ExchangePattern, Object) line: 103

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to