Excellent...You could've written instead directly into HttpServletResponse, however the current filter impl will probably miss custom headers set directly on it, something that will need to be fixed....
By the way, in background, I've been working on some Atom-related enhancements, 
will be merged early next week or on weekends

cheers, Sergey

----- Original Message ----- From: "Paul Wilton" <[email protected]>
To: "Sergey Beryozkin" <[email protected]>; <[email protected]>
Sent: Wednesday, December 02, 2009 5:17 PM
Subject: RE: setting response headers in AtomFeedProvider


yep 2.2.5
I have now found out why...
In my example code below (original email) it wasn't exactly as I had it
in my test case. I was writing an xml directive out to the output stream
first (I didn't think was relevant so didn't put it in the email)

   public void writeTo(Feed feed, Class<?> clazz, Type type,
Annotation[] a, MediaType mt, MultivaluedMap<String, Object> headers,
OutputStream os) throws IOException {
       os.write(XML_DIRECTIVE.getBytes());
       headers.add("Last-Modified",
org.apache.cxf.jaxrs.utils.HttpUtils.getHttpDateFormat().format(feed.get
Updated()));
       headers.add("Custom1", "hello");
       super.writeTo(feed, clazz, type, a, mt, headers, os);
   }

And the addes the custom headers after that but before delegating to the
ancestor's writeTo method.
If I add the headers before the os.write() they appear on the Wire okay.

Cheers
Paul


-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: 02 December 2009 17:08
To: [email protected]; Paul Wilton
Subject: Re: setting response headers in AtomFeedProvider

It definitely works for me,
I just added

headers.add("Foo", "Bar");

to

http://svn.apache.org/repos/asf/cxf/trunk/systests/jaxrs/src/test/java/o
rg/apache/cxf/systest/jaxrs/GenericHandlerWriter.java

just before the delegation to the JAXBProvider occurs and I can see

HTTP/1.1 200 OK
Content-Type: application/xml
BookId: 123
Date: Wed, 02 Dec 2009 17:00:56 GMT
Foo: Bar
Content-Length: 106
Server: Jetty(6.1.21)

<?xml version="1.0" encoding="UTF-8"
standalone="yes"?><Book><id>123</id><name>CXF in Action</name></Book>

Paul, what CXF version you use, I think it was CXF 2.2.5 which you
mentioned...Any chnace you can step into the code ?

thanks, Sergey








----- Original Message ----- From: "Sergey Beryozkin" <[email protected]>
To: "Paul Wilton" <[email protected]>; <[email protected]>
Sent: Wednesday, December 02, 2009 4:49 PM
Subject: Re: setting response headers in AtomFeedProvider


Hi Paul

let me write a little test, using a derived provider, exactly the way
you did it.
The filter will have a Response as one of the input parameters, this
is a Response which will be eventually serialized by your
provider, response.getEntity() will return a Feed instance. You'd need
to create a new Response and copy this entity into it and
also set the headers as needed on the new Response...However, let me
write a quick test first

cheers, Sergey


Hi Sergey
I have tried
headers.add("CustomHeader", "bar");
headers.add("Last-Modified",

org.apache.cxf.jaxrs.utils.HttpUtils.getHttpDateFormat().format(feed.get
Updated());

and nothing is on the Wire..

If I add a custom ResponseHandler filter - how would this filter now
about my feed object in order that I can extract the date from it ?
(would prefer to do it in the Provider really)

Cheers
Paul



-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: 02 December 2009 15:36
To: Paul Wilton; [email protected]
Subject: Re: setting response headers in AtomFeedProvider

Hi Paul

This really has to work...
Can you please try, just for the sake of the test, doing

headers.add("CustomHeader", "bar");

and see if it's there on the wire.

I'm just thinking that may be it is the fact that a Date as opposed to
String which is being set in your case that affects it ?
If you were setting this header on the JAXRS ResponseBuilder then the
CXF would convert a Date into a properly formatted value but
in this case the headers go directly to the AbstractHttpDestination
and
eventually to the container...

If  headers.add("CustomHeader", "bar");

works then you can do

headers.add("Last-Modified",

org.apache.cxf.jaxrs.utils.HttpUtils.getHttpDateFormat().format(feed.get
Updated());


By the way, is feed.getUpdated() returning something ?

Another option, provided you would not like to return a Response
directly from your service class, is to register a custom
ResponseHandler filter and set this Date from there.

let me know please how it goes
Sergey


----- Original Message ----- From: "Paul Wilton" <[email protected]>
To: <[email protected]>
Cc: "Sergey Beryozkin" <[email protected]>
Sent: Wednesday, December 02, 2009 12:29 PM
Subject: setting response headers in AtomFeedProvider


Hi Sergey,
I was planning on setting a response header (Last-Modified, expires,
cache-control etc) in an extended AtomFeedProvider based on the Feed
updated data,

for example:

public class AtomFeedProvider extends
org.apache.cxf.jaxrs.provider.AtomFeedProvider {

   @Override
   public void writeTo(Feed feed, Class<?> clazz, Type type,
Annotation[] a, MediaType mt, MultivaluedMap<String, Object> headers,
OutputStream os) throws IOException {
       headers.add("Last-Modified", feed.getUpdated());
       super.writeTo(feed, clazz, type, a, mt, headers, os);
   }
}


However, in the source
org.apache.cxf.jaxrs.provider.AtomFeedProvider.writeTo() method the
headers are ignored (lost).
Is this the correct approach I am taking to add headers, or is this a
bug, or is there a better way ?

Thanks
Paul
This e-mail (and any attachments) is confidential and may contain
personal views which are not the views of the BBC unless
specifically stated. If you have received it in error, please delete
it
from your system. Do not use, copy or disclose the
information in any way nor act in reliance on it and notify the sender
immediately.

Please note that the BBC monitors e-mails sent or received. Further
communication will signify your consent to this

This e-mail has been sent by one of the following wholly-owned
subsidiaries of the BBC:

BBC Worldwide Limited, Registration Number: 1420028 England,
Registered
Address: BBC Media Centre, 201 Wood Lane, London, W12 7TQ
BBC World News Limited, Registration Number: 04514407 England,
Registered Address: BBC Media Centre, 201 Wood Lane, London, W12 7TQ
BBC World Distribution Limited, Registration Number: 04514408,
Registered Address: BBC Media Centre, 201 Wood Lane, London, W12 7TQ


Reply via email to