Class PartialResponseWriterImpl
- All Implemented Interfaces:
FacesWrapper<ResponseWriter>,Closeable,Flushable,Appendable,AutoCloseable
Double buffering partial response writer to take care if embedded CDATA blocks in update delete etc...
According to the spec 13.4.4.1 Writing The Partial Response implementations have to take care to handle nested cdata blocks properly
This means we cannot allow nested CDATA according to the xml spec http://www.w3.org/TR/REC-xml/#sec-cdata-sect everything within a CDATA block is unparsed except for ]]>
Now we have following problem, that CDATA inserts can happen everywhere not only within the CDATA instructions.
What we have to do now is to double buffer CDATA blocks until their end and also!!! parse their content for CDATA embedding and replace it with an escaped end sequence.
Now parsing CDATA embedding is a little bit problematic in case of PPR because it can happen that someone simply adds a CDATA in a javascript string or somewhere else. Because he/she is not aware that we wrap the entire content into CDATA. Simply encoding and decoding of the CDATA is similarly problematic because the browser then chokes on embedded //<![CDATA[ //]]> sections
What we do for now is to simply remove //<![CDATA[ and //]]> and replace all other pending cdatas with their cdata escapes ]]> becomes <![CDATA[]]]]><![CDATA[>
If this causes problems in corner cases we also can add a second encoding step in case of the cdata Javascript comment removal is not enough to cover all corner cases.
For now I will only implement this in the impl, due to the spec stating that implementations are responsible of the correct CDATA handling!
- Version:
- $Revision$ $Date$
- Author:
- Werner Punz (latest modification by $Author$)
-
Field Summary
Fields inherited from class jakarta.faces.context.PartialResponseWriter
RENDER_ALL_MARKER, VIEW_STATE_MARKER -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionappend(char c) append(CharSequence csq) append(CharSequence csq, int start, int end) cloneWithWriter(Writer writer) voidclose()voidendCDATA()voidendElement(String name) voidendError()voidendEval()voidvoidvoidvoidflush()voidvoidstartElement(String name, UIComponent component) voidwrite(char[] cbuf) voidwrite(char[] cbuf, int off, int len) voidwrite(int c) voidvoidvoidwriteAttribute(String name, Object value, String property) voidwriteComment(Object comment) voidwriteText(char[] text, int off, int len) voidwriteText(Object object, UIComponent component, String string) voidvoidwriteURIAttribute(String name, Object value, String property) Methods inherited from class jakarta.faces.context.PartialResponseWriter
delete, endDocument, redirect, startDocument, startError, startEval, startExtension, startInsertAfter, startInsertBefore, startUpdate, updateAttributesMethods inherited from class jakarta.faces.context.ResponseWriterWrapper
getCharacterEncoding, getContentType, getWrapped, writeDoctype, writePreambleMethods inherited from class java.io.Writer
nullWriter
-
Constructor Details
-
PartialResponseWriterImpl
-
-
Method Details
-
startCDATA
- Overrides:
startCDATAin classResponseWriterWrapper- Throws:
IOException
-
endCDATA
- Overrides:
endCDATAin classResponseWriterWrapper- Throws:
IOException
-
endInsert
- Overrides:
endInsertin classPartialResponseWriter- Throws:
IOException
-
endUpdate
- Overrides:
endUpdatein classPartialResponseWriter- Throws:
IOException
-
endExtension
- Overrides:
endExtensionin classPartialResponseWriter- Throws:
IOException
-
endEval
- Overrides:
endEvalin classPartialResponseWriter- Throws:
IOException
-
endError
- Overrides:
endErrorin classPartialResponseWriter- Throws:
IOException
-
endElement
- Overrides:
endElementin classResponseWriterWrapper- Throws:
IOException
-
writeComment
- Overrides:
writeCommentin classResponseWriterWrapper- Throws:
IOException
-
startElement
- Overrides:
startElementin classResponseWriterWrapper- Throws:
IOException
-
writeText
- Overrides:
writeTextin classResponseWriterWrapper- Throws:
IOException
-
writeText
- Overrides:
writeTextin classResponseWriterWrapper- Throws:
IOException
-
write
- Overrides:
writein classResponseWriterWrapper- Throws:
IOException
-
cloneWithWriter
- Overrides:
cloneWithWriterin classResponseWriterWrapper
-
writeURIAttribute
- Overrides:
writeURIAttributein classResponseWriterWrapper- Throws:
IOException
-
close
- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Overrides:
closein classResponseWriterWrapper- Throws:
IOException
-
flush
- Specified by:
flushin interfaceFlushable- Overrides:
flushin classResponseWriterWrapper- Throws:
IOException
-
writeAttribute
- Overrides:
writeAttributein classResponseWriterWrapper- Throws:
IOException
-
writeText
- Overrides:
writeTextin classResponseWriterWrapper- Throws:
IOException
-
append
- Specified by:
appendin interfaceAppendable- Overrides:
appendin classWriter- Throws:
IOException
-
append
- Specified by:
appendin interfaceAppendable- Overrides:
appendin classWriter- Throws:
IOException
-
append
- Specified by:
appendin interfaceAppendable- Overrides:
appendin classWriter- Throws:
IOException
-
write
- Overrides:
writein classWriter- Throws:
IOException
-
write
- Overrides:
writein classWriter- Throws:
IOException
-
write
- Overrides:
writein classWriter- Throws:
IOException
-
write
- Overrides:
writein classWriter- Throws:
IOException
-