Is the CDATAProvider.writeTo getting invoked?
Paul.
Arul Dhesiaseelan wrote:
> Paul,
> 
> Thanks for your help.
> 
> I tried this approach, but I am not seeing the SOP made it to my 
> console. I suspect whether my custom stream writer is used at the first 
> place. Is there a way to tell Jersey/Java to use my custom writer 
> instead of the default writer?
> 
> I see this in the console, which tells that at least my message body 
> writer was loaded properly.
> 
> INFO: Provider classes found:
>  class impl.rest.jaxb.CDATAProvider
> 
> Here is my MBW writer which uses the custom stream writer.
> 
> @ProduceMime("application/xml")
> @Provider
> public class CDATAProvider implements MessageBodyWriter<CellType> {
> 
>    public void writeTo(CellType cellType,
>            Class<?> type, Type genericType, Annotation annotations[],
>            MediaType mediaType, MultivaluedMap<String, Object> headers,
>            OutputStream out) throws IOException {
>      try {
>        JAXBContext jc = JAXBContext.newInstance(CellType.class);
>        Marshaller marshaller = jc.createMarshaller();              
> XMLStreamWriter swImpl = 
> XMLOutputFactory.newInstance().createXMLStreamWriter(out);
>        XMLStreamWriter sw = new MyStreamWriter(swImpl);
>        marshaller.marshal(cellType, sw);
>      } catch (XMLStreamException xse) {
>        System.out.println(xse.getMessage());
>      } catch (JAXBException je) {
>        System.out.println(je.getMessage());
>      }
>    }
> 
>    public boolean isWriteable(Class<?> type, Type genericType, 
> Annotation annotations[]) {
>        return CellType.class.isAssignableFrom(type);
>    }
> 
>    public long getSize(CellType cellType) {
>        return -1;
>    }
> }
> 
> 
> Best regards,
> Arul
> 
> Paul Sandoz wrote:
>> As i understand it your use-case is you want to embed some generic 
>> HTML content in some XML.
>>
>> Can you try the following code instead:
>>
>> private Rows processRowsResponse() {
>>        List<RowType> rows = new ArrayList<RowType>();
>>        RowType row = new RowType();
>>        CellType cell = new CellType();
>>        final String cdata = new StringBuilder().append("<div 
>> class=\"progressOuterRow\"><div class=\"progressInnerRow\" 
>> style=\"width: ").append(result.toString()).append("px;\"></div><div 
>> class=\"progressText\">").append(used).append("/").append(total).append(" 
>> MB</div></div>").toString();
>>        cell.setValue(cdata);
>>        row.getCell().add(cell);
>>        rows.add(row);
>>        return rows;
>> }
>>
>> public class MyStreamWriter implements XMLStreamWriter {
>>  private XMLStreamWriter mImpl;
>>
>>  public MyStreamWriter(XMLStreamWriter xmlStreamWriter) throws 
>> XMLStreamException {
>>    this.mImpl = xmlStreamWriter;
>>  }
>>
>>  public void writeCharacters(String s) throws XMLStreamException {
>>     System.out.println("writeCharacters: " + s);
>>     mImpl.writeCData(s);
>>  }
>>
>> //removed other methods
>> }
>>
>>
>> and check the output to see if the "writeCharacters: " string is being 
>> printed and check if the content is escaped or not before the 
>> delegated call.
>>
>> Paul.
>>
>> Arul Dhesiaseelan wrote:
>>> Tatu,
>>>
>>> I have the CDATA set in my resource class.
>>>
>>>  @GET
>>>  @Path("/list")
>>>  @ProduceMime({"application/xml"})
>>>  public Response getRows() {
>>>    final Rows rows;
>>>    rows = processRowsResponse();
>>>    return Response.ok(rows).build();
>>>  }
>>>
>>> private Rows processRowsResponse() {
>>>        List<RowType> rows = new ArrayList<RowType>();
>>>        RowType row = new RowType();
>>>        CellType cell = new CellType();
>>>        final String cdata = new StringBuilder().append("<![CDATA[<div 
>>> class=\"progressOuterRow\"><div class=\"progressInnerRow\" 
>>> style=\"width: ").append(result.toString()).append("px;\"></div><div 
>>> class=\"progressText\">").append(used).append("/").append(total).append(" 
>>> MB</div></div>]]>").toString();
>>>        cell.setValue(cdata);
>>>        row.getCell().add(cell);
>>>        rows.add(row);
>>>        return rows;
>>> }
>>>
>>> I assume this CDATA will be sent as a string to the 
>>> XMLStreamWriter.writeCharacters() when the 
>>> MessageBodyWriter<CellType> is invoked.
>>>
>>> May be I missing something here?
>>>
>>> Thanks!
>>> Arul
>>>
>>> Tatu Saloranta wrote:
>>>> Code below looks correct, but where does that "CDATA"
>>>> come into String? Is it just added for testing?
>>>>
>>>> What seems to be happening is that for some reason
>>>> content you are getting is already xml-escaped (or is
>>>> fed to another xml stream writer); like OutputStream
>>>> or Writer passing its content back to xml writer.
>>>>
>>>> -+ Tatu +-
>>>>
>>>> --- Arul Dhesiaseelan <arul_at_fluxcorp.com> wrote:
>>>>
>>>>  
>>>>> Paul,
>>>>>
>>>>> Here is my custom Stream writer. I just delegate
>>>>> writeCData to XMLStreamWriter. I will try with a standalone test.
>>>>>
>>>>> public class MyStreamWriter implements
>>>>> XMLStreamWriter {
>>>>>   private XMLStreamWriter mImpl;
>>>>>
>>>>>   public MyStreamWriter(XMLStreamWriter
>>>>> xmlStreamWriter) throws XMLStreamException {
>>>>>     this.mImpl = xmlStreamWriter;
>>>>>   }
>>>>>
>>>>>   public void writeCData(String s) throws
>>>>> XMLStreamException {
>>>>>     mImpl.writeCData(s);
>>>>>   }
>>>>>
>>>>>   public void writeCharacters(String s) throws
>>>>> XMLStreamException {
>>>>>     if (shouldUseCData(s)) {
>>>>>       System.out.println("Using CDATA");
>>>>>       mImpl.writeCData(s);
>>>>>     } else {
>>>>>       mImpl.writeCharacters(s);
>>>>>     }
>>>>>   }
>>>>>
>>>>>   private boolean shouldUseCData(String s) {
>>>>>     if (s.contains("CDATA")) {
>>>>>       return true;
>>>>>     } else return false;
>>>>>   }
>>>>> //removed other methods
>>>>> }
>>>>>
>>>>> Am I missing something here?
>>>>>
>>>>> Thanks!
>>>>> Arul
>>>>>
>>>>>     
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
> 
-- 
| ? + ? = To question
----------------\
    Paul Sandoz
         x38109
+33-4-76188109