RE: What is the advantage of using async clients if Axis creates a wait thread for every request?

2008-09-29 Thread Franklin, Allen
When I enable ws-addressing and set "Use Separate Listener", as you
recommended, my client requests fail with the following:

 

2008-09-29 14:18:46,768 [ERROR] (ClientUtils.java : inferInTransport :
117) > An unknown transport called https exists.

 

Note that I am using https for my client requests.

 

Is there some additional coding I need to do?

 

From: keith chapman [mailto:[EMAIL PROTECTED] 
Sent: Monday, September 29, 2008 2:00 PM
To: axis-user@ws.apache.org
Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

The following is a sample Request that I sent. You would see a messageID
for each request. This ID will be used to correlate the request and
response.

Thanks,
Keith.

POST /axis2/services/StudentService HTTP/1.1 
Content-Type: text/xml; charset=UTF-8 
SOAPAction: urn:getStudents 
User-Agent: Axis2 
Host: 127.0.0.1 
Transfer-Encoding: chunked 
 
208 

   http://schemas.xmlsoap.org/soap/envelope/";>
  http://www.w3.org/2005/08/addressing";>
 
http://localhost:8081/axis2/services/StudentService
 
 
http://192.168.1.3:6060/axis2/services/StudentService122271
0373364_1/
 
 
urn:uuid:23E9D68E8168C3C3F71222710374739
 urn:getStudents
  
  
   0

On Mon, Sep 29, 2008 at 11:24 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

How do I match up responses with their corresponding requests  in my
client?

It seems like I need to be able to send an ID in the request and have
the ID returned in the callback so I can do the matching.

I don't see this mechanism.

 

 

From: keith chapman [mailto:[EMAIL PROTECTED] 
Sent: Monday, September 29, 2008 1:47 PM


To: axis-user@ws.apache.org
Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

When you send out the first request the server would spin up in the
client side and it will not die. Hence it will be used to listen for
responses of subsequent request.

In order to use a separate listener at the client side you just need to
do this,

stub._getServiceClient().engageModule("addressing");
 
stub._getServiceClient().getOptions().setUseSeparateListener(true);

Axis2 would handle everything else for you.

Thanks,
Keith.

On Mon, Sep 29, 2008 at 11:06 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

Would the technique that you are suggesting require the client to listen
on a different/separate TCP/IP port for every outstanding request?

 

From: keith chapman [mailto:[EMAIL PROTECTED] 

Sent: Monday, September 29, 2008 1:15 PM
To: axis-user@ws.apache.org

Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

Axis2 client support two levels of async behavior. One of them is the
one you've explained. This is something like pseudo async. The other is
where you send a request and then listen on a separate port (by spinning
up a simple http server on the client) for the response (It is
compulsory that you use WS-Addressing for this to work). This does not
block a thread.

Thanks,
Keith.

On Mon, Sep 29, 2008 at 10:38 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

It is my understanding that Axis2 v1.4 creates a thread to wait for the
reply for every async client request.

What is the advantage (on the client side) of using Axis2
async/non-blocking clients if Axis creates a wait thread for every
request?

In fact the blocking call seems more efficient because it saves Axis the
trouble of having to create another thread.

There appears to be a cost of one thread per outstanding for the
duration of the call with either way, blocking or non-blocking.




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org



RE: What is the advantage of using async clients if Axis creates a wait thread for every request?

2008-09-29 Thread Franklin, Allen
How do I match up responses with their corresponding requests  in my
client?

It seems like I need to be able to send an ID in the request and have
the ID returned in the callback so I can do the matching.

I don't see this mechanism.

 

 

From: keith chapman [mailto:[EMAIL PROTECTED] 
Sent: Monday, September 29, 2008 1:47 PM
To: axis-user@ws.apache.org
Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

When you send out the first request the server would spin up in the
client side and it will not die. Hence it will be used to listen for
responses of subsequent request.

In order to use a separate listener at the client side you just need to
do this,

stub._getServiceClient().engageModule("addressing");
 
stub._getServiceClient().getOptions().setUseSeparateListener(true);

Axis2 would handle everything else for you.

Thanks,
Keith.

On Mon, Sep 29, 2008 at 11:06 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

Would the technique that you are suggesting require the client to listen
on a different/separate TCP/IP port for every outstanding request?

 

From: keith chapman [mailto:[EMAIL PROTECTED] 

Sent: Monday, September 29, 2008 1:15 PM
To: axis-user@ws.apache.org

Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

Axis2 client support two levels of async behavior. One of them is the
one you've explained. This is something like pseudo async. The other is
where you send a request and then listen on a separate port (by spinning
up a simple http server on the client) for the response (It is
compulsory that you use WS-Addressing for this to work). This does not
block a thread.

Thanks,
Keith.

On Mon, Sep 29, 2008 at 10:38 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

It is my understanding that Axis2 v1.4 creates a thread to wait for the
reply for every async client request.

What is the advantage (on the client side) of using Axis2
async/non-blocking clients if Axis creates a wait thread for every
request?

In fact the blocking call seems more efficient because it saves Axis the
trouble of having to create another thread.

There appears to be a cost of one thread per outstanding for the
duration of the call with either way, blocking or non-blocking.




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org



RE: What is the advantage of using async clients if Axis creates a wait thread for every request?

2008-09-29 Thread Franklin, Allen
Would the technique that you are suggesting require the client to listen
on a different/separate TCP/IP port for every outstanding request?

 

From: keith chapman [mailto:[EMAIL PROTECTED] 
Sent: Monday, September 29, 2008 1:15 PM
To: axis-user@ws.apache.org
Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

Axis2 client support two levels of async behavior. One of them is the
one you've explained. This is something like pseudo async. The other is
where you send a request and then listen on a separate port (by spinning
up a simple http server on the client) for the response (It is
compulsory that you use WS-Addressing for this to work). This does not
block a thread.

Thanks,
Keith.

On Mon, Sep 29, 2008 at 10:38 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

It is my understanding that Axis2 v1.4 creates a thread to wait for the
reply for every async client request.

What is the advantage (on the client side) of using Axis2
async/non-blocking clients if Axis creates a wait thread for every
request?

In fact the blocking call seems more efficient because it saves Axis the
trouble of having to create another thread.

There appears to be a cost of one thread per outstanding for the
duration of the call with either way, blocking or non-blocking.




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org



RE: What is the advantage of using async clients if Axis creates a wait thread for every request?

2008-09-29 Thread Franklin, Allen
Can you recommend any sample code for me to look at?

I have been using 'wsdl2java -a' to generate client stubs.

What you are recommending sounds a bit more complex.

 

From: keith chapman [mailto:[EMAIL PROTECTED] 
Sent: Monday, September 29, 2008 1:15 PM
To: axis-user@ws.apache.org
Subject: Re: What is the advantage of using async clients if Axis
creates a wait thread for every request?

 

Axis2 client support two levels of async behavior. One of them is the
one you've explained. This is something like pseudo async. The other is
where you send a request and then listen on a separate port (by spinning
up a simple http server on the client) for the response (It is
compulsory that you use WS-Addressing for this to work). This does not
block a thread.

Thanks,
Keith.

On Mon, Sep 29, 2008 at 10:38 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote:

It is my understanding that Axis2 v1.4 creates a thread to wait for the
reply for every async client request.

What is the advantage (on the client side) of using Axis2
async/non-blocking clients if Axis creates a wait thread for every
request?

In fact the blocking call seems more efficient because it saves Axis the
trouble of having to create another thread.

There appears to be a cost of one thread per outstanding for the
duration of the call with either way, blocking or non-blocking.




-- 
Keith Chapman
Senior Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog: http://www.keith-chapman.org



What is the advantage of using async clients if Axis creates a wait thread for every request?

2008-09-29 Thread Franklin, Allen
It is my understanding that Axis2 v1.4 creates a thread to wait for the
reply for every async client request.

What is the advantage (on the client side) of using Axis2
async/non-blocking clients if Axis creates a wait thread for every
request?

In fact the blocking call seems more efficient because it saves Axis the
trouble of having to create another thread.

There appears to be a cost of one thread per outstanding for the
duration of the call with either way, blocking or non-blocking.



"Bad" header is generated by my Axis2-based client?

2008-08-14 Thread Franklin, Allen
Does anyone know why my axis2 version 1.4 client generates a SOAP header
that my server (axis1)

cannot understand?

 

The "bad" header is generated by my Axis2-based client.

The "good" header is generated by the open-source SOAPui tool.

Both clients are using the same wsdl.

The bad header seems to be missing the prefix "ns1:" from the
credentials element and its subelements.

 

Axis2 generated the SessionHeader class (from wsdl) that I pass on my
stub call in my client code:

 

  SessionHeader m_SessionHeader = new SessionHeader();

  stub.getMetric(m_GetMetric, m_SessionHeader);

 

Bad header looks like this:

  



   

   1 mwefcmso5x3o

   afranklin

   avocent

   



   

 

Good header looks like this:

   

  

  

   1mwefcmso5x3o

   afranklin

   avocent

  

 

   

 

Snippet of the wsdl that describes the operation I am calling
(getMetric()):

 



  

   Service operation to obtain metrics on a single unit.

  

  

  

   

   

  

  

   

   

  



 

(I am afraid to post the entire wsdl because it is proprietary and I may
get into trouble with my company.)

 



RE: How to add a SOAP header in an axis2 custom client-side handler?

2008-08-14 Thread Franklin, Allen
I don't have a services.xml, and I don't have the manageTransportSession
parameter in my axis2.xml.

But I am just running an axis2 client and my client seems to run ok
without them.

 

I am stuck trying to figure out how to manipulate the SOAP header in my
client-side handler.

The semantics for manipulating the SOAP header has changed between axis1
and axis2.

I am having trouble finding documentation and sample code that
manipulates the

SOAP header obtained from a MessageContext.

 

From: Martin Gainty [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, August 13, 2008 8:43 PM
To: axis-user@ws.apache.org
Subject: RE: How to add a SOAP header in an axis2 custom client-side
handler?

 

didn't see your config params
axis2.xml
?

services.xml
  

Martin 
__ 
Disclaimer and confidentiality note 
Everything in this e-mail and any attachments relates to the official
business of Sender. This transmission is of a confidential nature and
Sender does not endorse distribution to any party other than intended
recipient. Sender does not necessarily endorse content contained within
this transmission. 





Subject: How to add a SOAP header in an axis2 custom client-side
handler?
Date: Wed, 13 Aug 2008 18:26:36 -0400
From: [EMAIL PROTECTED]
To: axis-user@ws.apache.org

I am trying to figure out how to add a SOAP header in my client-side
handler.

I have the following axis1 code, but need an axis2 equivalent:

 

 
/***

* Processes the header of a request message.  This method will add
the 

* session header to the outgoing request.

* 

* @param context the message context associated with the request

 
**/

   private void invokeRequest( MessageContext context ) throws AxisFault

   { 

  Message msg = context.getRequestMessage();

  if (msg == null)

 throw new AxisFault( "Message not in context." );



  SOAPEnvelope env = msg.getSOAPEnvelope();

 

  SessionHeaderType sessionHeader =
WebServiceClientHelper.getThreadSessionHeader( );

 

  SOAPHeaderElement header = new SOAPHeaderElement(HEADER_NS,

   HEADER_NAME,

   sessionHeader);

  env.addHeader(header);

   }

 

The SessionHeaderType class was generated from a wsdl and contains
session credentials.

 

Any pointers to appropriate documentation on how to manipulate headers,
or sample code, would be appreciated.

 



Your PC, mobile phone, and online services work together like never
before. See how Windows(r) fits your life
 



How to add a SOAP header in an axis2 custom client-side handler?

2008-08-13 Thread Franklin, Allen
I am trying to figure out how to add a SOAP header in my client-side
handler.

I have the following axis1 code, but need an axis2 equivalent:

 

 
/***

* Processes the header of a request message.  This method will add
the 

* session header to the outgoing request.

* 

* @param context the message context associated with the request

 
**/

   private void invokeRequest( MessageContext context ) throws AxisFault

   { 

  Message msg = context.getRequestMessage();

  if (msg == null)

 throw new AxisFault( "Message not in context." );



  SOAPEnvelope env = msg.getSOAPEnvelope();

 

  SessionHeaderType sessionHeader =
WebServiceClientHelper.getThreadSessionHeader( );

 

  SOAPHeaderElement header = new SOAPHeaderElement(HEADER_NS,

   HEADER_NAME,

   sessionHeader);

  env.addHeader(header);

   }

 

The SessionHeaderType class was generated from a wsdl and contains
session credentials.

 

Any pointers to appropriate documentation on how to manipulate headers,
or sample code, would be appreciated.



RE: Client handler tutorial

2008-08-13 Thread Franklin, Allen
Below is a summary of configuring Axis2 for a client-side handler.

I haven't actually tried it yet, so please let me know if something is
wrong.

 

 

Summary of configuring an axis2 v1.4 SOAP client for a custom
client-side handler.

This handler can, for example, add username, password and session id to
the SOAP header:

 

1) Build a jar file with a .mar extension on the classpath/repository
that contains:

   module.xml -contains a) module name, b) name of class that implements
Module and c) name of class that extends AbstractHandler.

   Class that implements org.apache.axis2.modules.Module.

   class that extends AbstractHandler (the real work of your handler
goes here). 

 

2) axis2.xml -edit to include your new phase, also add a reference to
your module: http://ws.apache.org/axis2/1_2/modules.html. Note that this link address
server-side handlers.

 

3) services.xml -reference the module that contains the handler chain.
Not needed for a client-side handler?

 

4) Choose a method for passing the configuration to the axis2 engine,
either programatically via ConfigurationContext,

   or passing -D JVM parameters (-Daxis2.repo=C:\Axis2\repository,
-Daxis2.xml=C:\Axis2\conf\axis2.xml).

   See http://wso2.org/library/585 for programatic configuration.

 

From: Wally Dennis [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, August 13, 2008 11:08 AM
To: axis-user@ws.apache.org
Subject: Re: Client handler tutorial

 


One way to specify the conf and repo for stand-alone clients is to use
-D JVM parameters as shown here: 

-Daxis2.repo=C:\Axis2\repository 
-Daxis2.xml=C:\Axis2\conf\axis2.xml 

Wally 





"Detelin Yordanov" <[EMAIL PROTECTED]> 

08/13/2008 10:26 AM 

Please respond to
axis-user@ws.apache.org

To

axis-user@ws.apache.org 

cc


Subject

Re: Client handler tutorial

 






Hi,
  When using Axis2 client (e.g. ServiceClient) you do not need any
servlet container, it just uses Apache HttpClient to
send and receive the request (if using HTTP). Underneath the
ServiceClient will setup normal Axis2 runtime (as the one on server
side) to process messages.
The ServiceClient has constructors to specify an Axis2
ConfigurationContext which points to the "client-side" Axis2
configuration file, 
if no ConfigurationContext is given it will use (I think) a default
axis2.xml from the Axis2 kernel jar.

So if you need to define any handlers or whatsoever, you can create
your axis2-conf for the client side, add your handlers, then create a
ConfigurationContext and finally a ServiceClient.

Regards,
   Detelin

On Wed, Aug 13, 2008 at 4:19 PM, Franklin, Allen
<[EMAIL PROTECTED]> wrote: 
Where I work we start with a hand-built wsdl and then run WSDL2Java to
generate the client and server stubs and skeleton code. 

When I say 'client side handler' I am talking about a class that that
implements AbstractHandler that (I think) I need to write 

to add a username, password and session id to the SOAP header. 

  

I'm still having trouble understanding if I need to deploy a servlet
container (eg Tomcat) just to run an axis2 client? 

  

From: Martin Gainty [mailto:[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> ] 
Sent: Wednesday, August 13, 2008 9:00 AM 


To: axis-user@ws.apache.org <mailto:axis-user@ws.apache.org> 
Subject: RE: Client handler tutorial 

  

typical scenario is 
with the typical HTTP transport scenario you would build the server
classes and deploy using the admin tool
then use compiled WSDL2Java generated client stub to test

I guess I would need to know which 'client side handler' you are
referring to for specifics..
JMS/SMTP/Other 
?
Martin
__ 
Disclaimer and confidentiality note 
Everything in this e-mail and any attachments relates to the official
business of Sender. This transmission is of a confidential nature and
Sender does not endorse distribution to any party other than intended
recipient. Sender does not necessarily endorse content contained within
this transmission. 



Subject: RE: Client handler tutorial
Date: Wed, 13 Aug 2008 08:53:17 -0400
From: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> 
To: axis-user@ws.apache.org <mailto:axis-user@ws.apache.org>  

Do I need to deploy my axis2 client into a servlet container to be able
to use client-side handlers? 

Currently my client does not need a servlet container, it runs
stand-alone. 

  

From: Martin Gainty [mailto:[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> ] 
Sent: Tuesday, August 12, 2008 6:46 PM
To: axis-user@ws.apache.org <mailto:axis-user@ws.apache.org> 
Subject: RE: Client handler tutorial 

  

yuo can deploy the client mar from the admin utility try
http://localhost:8080/axis2/axis2-admin/
<http://localhost:8080/axis2/axis2-admin/> 

HTH
Martin
__ 
Disclaimer and confidential

RE: Client handler tutorial

2008-08-13 Thread Franklin, Allen
Where I work we start with a hand-built wsdl and then run WSDL2Java to
generate the client and server stubs and skeleton code.

When I say 'client side handler' I am talking about a class that that
implements AbstractHandler that (I think) I need to write 

to add a username, password and session id to the SOAP header.

 

I'm still having trouble understanding if I need to deploy a servlet
container (eg Tomcat) just to run an axis2 client?

 

From: Martin Gainty [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, August 13, 2008 9:00 AM
To: axis-user@ws.apache.org
Subject: RE: Client handler tutorial

 

typical scenario is 
with the typical HTTP transport scenario you would build the server
classes and deploy using the admin tool
then use compiled WSDL2Java generated client stub to test

I guess I would need to know which 'client side handler' you are
referring to for specifics..
JMS/SMTP/Other 
?
Martin
__ 
Disclaimer and confidentiality note 
Everything in this e-mail and any attachments relates to the official
business of Sender. This transmission is of a confidential nature and
Sender does not endorse distribution to any party other than intended
recipient. Sender does not necessarily endorse content contained within
this transmission. 





Subject: RE: Client handler tutorial
Date: Wed, 13 Aug 2008 08:53:17 -0400
From: [EMAIL PROTECTED]
To: axis-user@ws.apache.org

Do I need to deploy my axis2 client into a servlet container to be able
to use client-side handlers?

Currently my client does not need a servlet container, it runs
stand-alone.

 

From: Martin Gainty [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, August 12, 2008 6:46 PM
To: axis-user@ws.apache.org
Subject: RE: Client handler tutorial

 

yuo can deploy the client mar from the admin utility try
http://localhost:8080/axis2/axis2-admin/

HTH
Martin
__ 
Disclaimer and confidentiality note 
Everything in this e-mail and any attachments relates to the official
business of Sender. This transmission is of a confidential nature and
Sender does not endorse distribution to any party other than intended
recipient. Sender does not necessarily endorse content contained within
this transmission. 



Subject: Re: Client handler tutorial
Date: Tue, 12 Aug 2008 18:34:04 -0400
From: [EMAIL PROTECTED]
To: axis-user@ws.apache.org

I am having trouble figuring out how to add client-side handlers in
axis2.

I see the email reply, below, that there is no difference between client
and server side.

But the configuration must be different since on the client side there
is no web container to put the axis2.xml configuration information for
the handler and also no place to put the .mar file. 

Client-side handler configuration remains a mystery to me.

Re: Client handler tutorial

Deepal Jayasinghe
Wed, 16 Apr 2008 22:57:25 -0700

Hi Chau,

Are you referring to Axis2 ?

if so there is no difference between client side and server side.

 

Thank you!

Deepal

Anybody knows the link to client handler tutorial? Thanks 

 



 

 



Reveal your inner athlete and share it with friends on Windows Live.
Share now!
 

 



Your PC, mobile phone, and online services work together like never
before. See how Windows(r) fits your life
 



RE: Client handler tutorial

2008-08-13 Thread Franklin, Allen
Do I need to deploy my axis2 client into a servlet container to be able
to use client-side handlers?

Currently my client does not need a servlet container, it runs
stand-alone.

 

From: Martin Gainty [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, August 12, 2008 6:46 PM
To: axis-user@ws.apache.org
Subject: RE: Client handler tutorial

 

yuo can deploy the client mar from the admin utility try
http://localhost:8080/axis2/axis2-admin/

HTH
Martin
__ 
Disclaimer and confidentiality note 
Everything in this e-mail and any attachments relates to the official
business of Sender. This transmission is of a confidential nature and
Sender does not endorse distribution to any party other than intended
recipient. Sender does not necessarily endorse content contained within
this transmission. 





Subject: Re: Client handler tutorial
Date: Tue, 12 Aug 2008 18:34:04 -0400
From: [EMAIL PROTECTED]
To: axis-user@ws.apache.org

I am having trouble figuring out how to add client-side handlers in
axis2.

I see the email reply, below, that there is no difference between client
and server side.

But the configuration must be different since on the client side there
is no web container to put the axis2.xml configuration information for
the handler and also no place to put the .mar file. 

Client-side handler configuration remains a mystery to me.

Re: Client handler tutorial

Deepal Jayasinghe
Wed, 16 Apr 2008 22:57:25 -0700

Hi Chau,

Are you referring to Axis2 ?

if so there is no difference between client side and server side.

 

Thank you!

Deepal

Anybody knows the link to client handler tutorial? Thanks 

 



 

 



Reveal your inner athlete and share it with friends on Windows Live.
Share now!
 



Re: Client handler tutorial

2008-08-12 Thread Franklin, Allen
I am having trouble figuring out how to add client-side handlers in
axis2.

I see the email reply, below, that there is no difference between client
and server side.

But the configuration must be different since on the client side there
is no web container to put the axis2.xml configuration information for
the handler and also no place to put the .mar file. 

Client-side handler configuration remains a mystery to me.

Re: Client handler tutorial

Deepal Jayasinghe
Wed, 16 Apr 2008 22:57:25 -0700

Hi Chau,

Are you referring to Axis2 ?

if so there is no difference between client side and server side.

 

Thank you!

Deepal

Anybody knows the link to client handler tutorial? Thanks