public class XMLEncodingDetector
extends java.lang.Object
Modifier and Type | Class and Description |
---|---|
private class |
XMLEncodingDetector.RewindableInputStream
This class wraps the byte inputstreams we're presented with.
|
Modifier and Type | Field and Description |
---|---|
private char[] |
ch |
private int |
columnNumber |
private int |
count |
static int |
DEFAULT_BUFFER_SIZE |
static int |
DEFAULT_XMLDECL_BUFFER_SIZE |
private java.lang.String |
encoding |
private ErrorDispatcher |
err |
private boolean |
fAllowJavaEncodings |
private int |
fBufferSize |
private XMLEncodingDetector |
fCurrentEntity |
private static java.lang.String |
fEncodingSymbol |
private int |
fMarkupDepth |
private static java.lang.String |
fStandaloneSymbol |
private XMLString |
fString |
private XMLStringBuffer |
fStringBuffer |
private XMLStringBuffer |
fStringBuffer2 |
private java.lang.String[] |
fStrings |
private SymbolTable |
fSymbolTable |
private static java.lang.String |
fVersionSymbol |
private java.lang.Boolean |
hasBom |
private java.lang.Boolean |
isBigEndian |
private boolean |
isEncodingSetInProlog |
private int |
lineNumber |
private boolean |
literal |
private boolean |
mayReadChunks |
private int |
position |
private java.io.Reader |
reader |
private java.io.InputStream |
stream |
Constructor and Description |
---|
XMLEncodingDetector()
Constructor
|
Modifier and Type | Method and Description |
---|---|
private void |
createInitialReader() |
private java.io.Reader |
createReader(java.io.InputStream inputStream,
java.lang.String encoding,
java.lang.Boolean isBigEndian)
Creates a reader capable of reading the given input stream in
the specified encoding.
|
(package private) void |
endEntity() |
private java.lang.Object[] |
getEncoding(java.io.InputStream in,
ErrorDispatcher err) |
static java.lang.Object[] |
getEncoding(java.lang.String fname,
java.util.jar.JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
Autodetects the encoding of the XML document supplied by the given
input stream.
|
private java.lang.Object[] |
getEncodingName(byte[] b4,
int count)
Returns the IANA encoding name that is auto-detected from
the bytes specified, with the endian-ness of that encoding where
appropriate.
|
boolean |
isExternal()
Returns true if the current entity being scanned is external.
|
(package private) boolean |
load(int offset,
boolean changeEntity)
Loads a chunk of text.
|
int |
peekChar()
Returns the next character on the input.
|
private void |
reportFatalError(java.lang.String msgId,
java.lang.String arg)
Convenience function used in all XML scanners.
|
int |
scanChar()
Returns the next character on the input.
|
boolean |
scanData(java.lang.String delimiter,
XMLStringBuffer buffer)
Scans a range of character data up to the specified delimiter,
setting the fields of the XMLString structure, appropriately.
|
int |
scanLiteral(int quote,
XMLString content)
Scans a range of attribute value data, setting the fields of the
XMLString structure, appropriately.
|
java.lang.String |
scanName()
Returns a string matching the Name production appearing immediately
on the input as a symbol, or null if no Name string is present.
|
private void |
scanPIData(java.lang.String target,
XMLString data)
Scans a processing data.
|
java.lang.String |
scanPseudoAttribute(boolean scanningTextDecl,
XMLString value)
Scans a pseudo attribute.
|
private boolean |
scanSurrogates(XMLStringBuffer buf)
Scans surrogates and append them to the specified buffer.
|
private void |
scanXMLDecl() |
private void |
scanXMLDeclOrTextDecl(boolean scanningTextDecl)
Scans an XML or text declaration.
|
private void |
scanXMLDeclOrTextDecl(boolean scanningTextDecl,
java.lang.String[] pseudoAttributeValues)
Scans an XML or text declaration.
|
boolean |
skipChar(int c)
Skips a character appearing immediately on the input.
|
boolean |
skipSpaces()
Skips space characters appearing immediately on the input.
|
boolean |
skipString(java.lang.String s)
Skips the specified string appearing immediately on the input.
|
private java.io.InputStream stream
private java.lang.String encoding
private boolean isEncodingSetInProlog
private java.lang.Boolean isBigEndian
private java.lang.Boolean hasBom
private java.io.Reader reader
public static final int DEFAULT_BUFFER_SIZE
public static final int DEFAULT_XMLDECL_BUFFER_SIZE
private boolean fAllowJavaEncodings
private SymbolTable fSymbolTable
private XMLEncodingDetector fCurrentEntity
private int fBufferSize
private int lineNumber
private int columnNumber
private boolean literal
private char[] ch
private int position
private int count
private boolean mayReadChunks
private XMLString fString
private XMLStringBuffer fStringBuffer
private XMLStringBuffer fStringBuffer2
private static final java.lang.String fVersionSymbol
private static final java.lang.String fEncodingSymbol
private static final java.lang.String fStandaloneSymbol
private int fMarkupDepth
private java.lang.String[] fStrings
private ErrorDispatcher err
public static java.lang.Object[] getEncoding(java.lang.String fname, java.util.jar.JarFile jarFile, JspCompilationContext ctxt, ErrorDispatcher err) throws java.io.IOException, JasperException
java.io.IOException
JasperException
private java.lang.Object[] getEncoding(java.io.InputStream in, ErrorDispatcher err) throws java.io.IOException, JasperException
java.io.IOException
JasperException
void endEntity()
private void createInitialReader() throws java.io.IOException, JasperException
java.io.IOException
JasperException
private java.io.Reader createReader(java.io.InputStream inputStream, java.lang.String encoding, java.lang.Boolean isBigEndian) throws java.io.IOException, JasperException
inputStream
- The input stream.encoding
- The encoding name that the input stream is
encoded using. If the user has specified that
Java encoding names are allowed, then the
encoding name may be a Java encoding name;
otherwise, it is an ianaEncoding name.isBigEndian
- For encodings (like uCS-4), whose names cannot
specify a byte order, this tells whether the order
is bigEndian. null means unknown or not relevant.java.io.IOException
JasperException
private java.lang.Object[] getEncodingName(byte[] b4, int count)
b4
- The first four bytes of the input.count
- The number of bytes actually read.public boolean isExternal()
public int peekChar() throws java.io.IOException
Note: The character is not consumed.
java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.public int scanChar() throws java.io.IOException
Note: The character is consumed.
java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.public java.lang.String scanName() throws java.io.IOException
Note: The Name characters are consumed.
Note: The string returned must be a symbol. The SymbolTable can be used for this purpose.
java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.SymbolTable
,
XMLChar.isName(int)
,
XMLChar.isNameStart(int)
public int scanLiteral(int quote, XMLString content) throws java.io.IOException
Note: The characters are consumed.
Note: This method does not guarantee to return the longest run of attribute value data. This method may return before the quote character due to reaching the end of the input buffer or any other reason.
Note: The fields contained in the XMLString structure are not guaranteed to remain valid upon subsequent calls to the entity scanner. Therefore, the caller is responsible for immediately using the returned character data or making a copy of the character data.
quote
- The quote character that signifies the end of the
attribute value data.content
- The content structure to fill.java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.public boolean scanData(java.lang.String delimiter, XMLStringBuffer buffer) throws java.io.IOException
Note: The characters are consumed.
Note: This assumes that the internal buffer is at least the same size, or bigger, than the length of the delimiter and that the delimiter contains at least one character.
Note: This method does not guarantee to return the longest run of character data. This method may return before the delimiter due to reaching the end of the input buffer or any other reason.
Note: The fields contained in the XMLString structure are not guaranteed to remain valid upon subsequent calls to the entity scanner. Therefore, the caller is responsible for immediately using the returned character data or making a copy of the character data.
delimiter
- The string that signifies the end of the character
data to be scanned.buffer
- The data structure to fill.java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.public boolean skipChar(int c) throws java.io.IOException
Note: The character is consumed only if it matches the specified character.
c
- The character to skip.java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.public boolean skipSpaces() throws java.io.IOException
Note: The characters are consumed only if they are space characters.
java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.XMLChar.isSpace(int)
public boolean skipString(java.lang.String s) throws java.io.IOException
Note: The characters are consumed only if they are space characters.
s
- The string to skip.java.io.IOException
- Thrown if i/o error occurs.java.io.EOFException
- Thrown on end of file.final boolean load(int offset, boolean changeEntity) throws java.io.IOException
offset
- The offset into the character buffer to
read the next batch of characters.changeEntity
- True if the load should change entities
at the end of the entity, otherwise leave
the current entity in place and the entity
boundary will be signaled by the return
value.java.io.IOException
private void scanXMLDecl() throws java.io.IOException, JasperException
java.io.IOException
JasperException
private void scanXMLDeclOrTextDecl(boolean scanningTextDecl) throws java.io.IOException, JasperException
[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" ) [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
scanningTextDecl
- True if a text declaration is to
be scanned instead of an XML
declaration.java.io.IOException
JasperException
private void scanXMLDeclOrTextDecl(boolean scanningTextDecl, java.lang.String[] pseudoAttributeValues) throws java.io.IOException, JasperException
[23] XMLDecl ::= '' [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" ) [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) [77] TextDecl ::= ''
scanningTextDecl
- True if a text declaration is to
be scanned instead of an XML
declaration.pseudoAttributeValues
- An array of size 3 to return the version,
encoding and standalone pseudo attribute values
(in that order).
Note: This method uses fString, anything in it
at the time of calling is lost.java.io.IOException
JasperException
public java.lang.String scanPseudoAttribute(boolean scanningTextDecl, XMLString value) throws java.io.IOException, JasperException
scanningTextDecl
- True if scanning this pseudo-attribute for a
TextDecl; false if scanning XMLDecl. This
flag is needed to report the correct type of
error.value
- The string to fill in with the attribute
value.java.io.IOException
JasperException
private void scanPIData(java.lang.String target, XMLString data) throws java.io.IOException, JasperException
target
- The PI targetdata
- The string to fill in with the datajava.io.IOException
JasperException
private boolean scanSurrogates(XMLStringBuffer buf) throws java.io.IOException, JasperException
Note: This assumes the current char has already been identified as a high surrogate.
buf
- The StringBuffer to append the read surrogates to.java.io.IOException
JasperException
private void reportFatalError(java.lang.String msgId, java.lang.String arg) throws JasperException
JasperException