final class DatatypeConverterImpl extends java.lang.Object implements DatatypeConverterInterface
DatatypeConverterInterface
.
When client applications specify the use of the static print/parse
methods in DatatypeConverter
, it will delegate
to this class.
This class is responsible for whitespace normalization.
Modifier and Type | Class and Description |
---|---|
private static class |
DatatypeConverterImpl.CalendarFormatter |
Modifier and Type | Field and Description |
---|---|
private static javax.xml.datatype.DatatypeFactory |
datatypeFactory |
private static byte[] |
decodeMap |
private static char[] |
encodeMap |
private static char[] |
hexCode |
private static byte |
PADDING |
static DatatypeConverterInterface |
theInstance
To avoid re-creating instances, we cache one instance.
|
Modifier | Constructor and Description |
---|---|
protected |
DatatypeConverterImpl() |
Modifier and Type | Method and Description |
---|---|
static byte[] |
_parseBase64Binary(java.lang.String text) |
static java.lang.Boolean |
_parseBoolean(java.lang.CharSequence literal) |
static byte |
_parseByte(java.lang.CharSequence literal) |
static java.util.GregorianCalendar |
_parseDateTime(java.lang.CharSequence s) |
static java.math.BigDecimal |
_parseDecimal(java.lang.CharSequence content) |
static double |
_parseDouble(java.lang.CharSequence _val) |
static float |
_parseFloat(java.lang.CharSequence _val) |
static int |
_parseInt(java.lang.CharSequence s)
Faster but less robust String->int conversion.
|
static java.math.BigInteger |
_parseInteger(java.lang.CharSequence s) |
static long |
_parseLong(java.lang.CharSequence s) |
static javax.xml.namespace.QName |
_parseQName(java.lang.CharSequence text,
javax.xml.namespace.NamespaceContext nsc) |
static short |
_parseShort(java.lang.CharSequence s) |
static java.lang.String |
_printBase64Binary(byte[] input) |
static java.lang.String |
_printBase64Binary(byte[] input,
int offset,
int len) |
static int |
_printBase64Binary(byte[] input,
int offset,
int len,
byte[] out,
int ptr)
Encodes a byte array into another byte array by first doing base64 encoding
then encoding the result in ASCII.
|
static int |
_printBase64Binary(byte[] input,
int offset,
int len,
char[] buf,
int ptr)
Encodes a byte array into a char array by doing base64 encoding.
|
static java.lang.String |
_printBoolean(boolean val) |
static java.lang.String |
_printByte(byte val) |
static java.lang.String |
_printDate(java.util.Calendar val) |
static java.lang.String |
_printDateTime(java.util.Calendar val) |
static java.lang.String |
_printDecimal(java.math.BigDecimal val) |
static java.lang.String |
_printDouble(double v) |
static java.lang.String |
_printFloat(float v) |
static java.lang.String |
_printInt(int val) |
static java.lang.String |
_printInteger(java.math.BigInteger val) |
static java.lang.String |
_printLong(long val) |
static java.lang.String |
_printQName(javax.xml.namespace.QName val,
javax.xml.namespace.NamespaceContext nsc) |
static java.lang.String |
_printShort(short val) |
static char |
encode(int i) |
static byte |
encodeByte(int i) |
private static int |
guessLength(java.lang.String text)
computes the length of binary data speculatively.
|
private static int |
hexToBin(char ch) |
private static byte[] |
initDecodeMap() |
private static char[] |
initEncodeMap() |
static java.lang.String |
installHook(java.lang.String s)
Just return the string passed as a parameter but
installs an instance of this class as the DatatypeConverter
implementation.
|
private static boolean |
isDigitOrPeriodOrSign(char ch) |
java.lang.String |
parseAnySimpleType(java.lang.String lexicalXSDAnySimpleType)
Return a string containing the lexical representation of the
simple type.
|
byte[] |
parseBase64Binary(java.lang.String lexicalXSDBase64Binary)
Converts the string argument into an array of bytes.
|
boolean |
parseBoolean(java.lang.String lexicalXSDBoolean)
Converts the string argument into a boolean value.
|
byte |
parseByte(java.lang.String lexicalXSDByte)
Converts the string argument into a byte value.
|
java.util.Calendar |
parseDate(java.lang.String lexicalXSDDate)
Converts the string argument into a Calendar value.
|
java.util.Calendar |
parseDateTime(java.lang.String lexicalXSDDateTime)
Converts the string argument into a Calendar value.
|
java.math.BigDecimal |
parseDecimal(java.lang.String content)
Converts the string argument into a BigDecimal value.
|
double |
parseDouble(java.lang.String lexicalXSDDouble)
Converts the string argument into a double value.
|
float |
parseFloat(java.lang.String lexicalXSDFloat)
Converts the string argument into a float value.
|
byte[] |
parseHexBinary(java.lang.String s)
Converts the string argument into an array of bytes.
|
int |
parseInt(java.lang.String s)
Convert the string argument into an int value.
|
java.math.BigInteger |
parseInteger(java.lang.String lexicalXSDInteger)
Convert the string argument into a BigInteger value.
|
long |
parseLong(java.lang.String lexicalXSLong)
Converts the string argument into a long value.
|
javax.xml.namespace.QName |
parseQName(java.lang.String lexicalXSDQName,
javax.xml.namespace.NamespaceContext nsc)
Converts the string argument into a QName value.
|
short |
parseShort(java.lang.String lexicalXSDShort)
Converts the string argument into a short value.
|
java.lang.String |
parseString(java.lang.String lexicalXSDString)
Convert the string argument into a string.
|
java.util.Calendar |
parseTime(java.lang.String lexicalXSDTime)
Converts the string argument into a Calendar value.
|
long |
parseUnsignedInt(java.lang.String lexicalXSDUnsignedInt)
Converts the string argument into a long value.
|
int |
parseUnsignedShort(java.lang.String lexicalXSDUnsignedShort)
Converts the string argument into an int value.
|
java.lang.String |
printAnySimpleType(java.lang.String val)
Converts a string value into a string.
|
java.lang.String |
printBase64Binary(byte[] val)
Converts an array of bytes into a string.
|
java.lang.String |
printBoolean(boolean val)
Converts a boolean value into a string.
|
java.lang.String |
printByte(byte val)
Converts a byte value into a string.
|
java.lang.String |
printDate(java.util.Calendar val)
Converts a Calendar value into a string.
|
java.lang.String |
printDateTime(java.util.Calendar val)
Converts a Calendar value into a string.
|
java.lang.String |
printDecimal(java.math.BigDecimal val)
Converts a BigDecimal value into a string.
|
java.lang.String |
printDouble(double v)
Converts a double value into a string.
|
java.lang.String |
printFloat(float v)
Converts a float value into a string.
|
java.lang.String |
printHexBinary(byte[] data)
Converts an array of bytes into a string.
|
java.lang.String |
printInt(int val)
Converts an int value into a string.
|
java.lang.String |
printInteger(java.math.BigInteger val)
Converts a BigInteger value into a string.
|
java.lang.String |
printLong(long val)
Converts a long value into a string.
|
java.lang.String |
printQName(javax.xml.namespace.QName val,
javax.xml.namespace.NamespaceContext nsc)
Converts a QName instance into a string.
|
java.lang.String |
printShort(short val)
Converts a short value into a string.
|
java.lang.String |
printString(java.lang.String val)
Converts the string argument into a string.
|
java.lang.String |
printTime(java.util.Calendar val)
Converts a Calendar value into a string.
|
java.lang.String |
printUnsignedInt(long val)
Converts a long value into a string.
|
java.lang.String |
printUnsignedShort(int val)
Converts an int value into a string.
|
private static java.lang.CharSequence |
removeOptionalPlus(java.lang.CharSequence s) |
public static final DatatypeConverterInterface theInstance
private static final char[] hexCode
private static final byte[] decodeMap
private static final byte PADDING
private static final char[] encodeMap
private static final javax.xml.datatype.DatatypeFactory datatypeFactory
public java.lang.String parseString(java.lang.String lexicalXSDString)
DatatypeConverterInterface
Convert the string argument into a string.
parseString
in interface DatatypeConverterInterface
lexicalXSDString
- A lexical representation of the XML Schema datatype xsd:stringpublic java.math.BigInteger parseInteger(java.lang.String lexicalXSDInteger)
DatatypeConverterInterface
Convert the string argument into a BigInteger value.
parseInteger
in interface DatatypeConverterInterface
lexicalXSDInteger
- A string containing a lexical representation of
xsd:integer.public static java.math.BigInteger _parseInteger(java.lang.CharSequence s)
public java.lang.String printInteger(java.math.BigInteger val)
DatatypeConverterInterface
Converts a BigInteger value into a string.
printInteger
in interface DatatypeConverterInterface
val
- A BigInteger valuepublic static java.lang.String _printInteger(java.math.BigInteger val)
public int parseInt(java.lang.String s)
DatatypeConverterInterface
Convert the string argument into an int value.
parseInt
in interface DatatypeConverterInterface
s
- A string containing a lexical representation of
xsd:int.public static int _parseInt(java.lang.CharSequence s)
Integer.valueOf(String)
is not.
Integer.valueOf(String)
doesn't allow any.
public long parseLong(java.lang.String lexicalXSLong)
DatatypeConverterInterface
Converts the string argument into a long value.
parseLong
in interface DatatypeConverterInterface
lexicalXSLong
- A string containing lexical representation of
xsd:long.public static long _parseLong(java.lang.CharSequence s)
public short parseShort(java.lang.String lexicalXSDShort)
DatatypeConverterInterface
Converts the string argument into a short value.
parseShort
in interface DatatypeConverterInterface
lexicalXSDShort
- A string containing lexical representation of
xsd:short.public static short _parseShort(java.lang.CharSequence s)
public java.lang.String printShort(short val)
DatatypeConverterInterface
Converts a short value into a string.
printShort
in interface DatatypeConverterInterface
val
- A short valuepublic static java.lang.String _printShort(short val)
public java.math.BigDecimal parseDecimal(java.lang.String content)
DatatypeConverterInterface
Converts the string argument into a BigDecimal value.
parseDecimal
in interface DatatypeConverterInterface
content
- A string containing lexical representation of
xsd:decimal.public static java.math.BigDecimal _parseDecimal(java.lang.CharSequence content)
public float parseFloat(java.lang.String lexicalXSDFloat)
DatatypeConverterInterface
Converts the string argument into a float value.
parseFloat
in interface DatatypeConverterInterface
lexicalXSDFloat
- A string containing lexical representation of
xsd:float.public static float _parseFloat(java.lang.CharSequence _val)
public java.lang.String printFloat(float v)
DatatypeConverterInterface
Converts a float value into a string.
printFloat
in interface DatatypeConverterInterface
v
- A float valuepublic static java.lang.String _printFloat(float v)
public double parseDouble(java.lang.String lexicalXSDDouble)
DatatypeConverterInterface
Converts the string argument into a double value.
parseDouble
in interface DatatypeConverterInterface
lexicalXSDDouble
- A string containing lexical representation of
xsd:double.public static double _parseDouble(java.lang.CharSequence _val)
public boolean parseBoolean(java.lang.String lexicalXSDBoolean)
DatatypeConverterInterface
Converts the string argument into a boolean value.
parseBoolean
in interface DatatypeConverterInterface
lexicalXSDBoolean
- A string containing lexical representation of
xsd:boolean.public static java.lang.Boolean _parseBoolean(java.lang.CharSequence literal)
public java.lang.String printBoolean(boolean val)
DatatypeConverterInterface
Converts a boolean value into a string.
printBoolean
in interface DatatypeConverterInterface
val
- A boolean valuepublic static java.lang.String _printBoolean(boolean val)
public byte parseByte(java.lang.String lexicalXSDByte)
DatatypeConverterInterface
Converts the string argument into a byte value.
parseByte
in interface DatatypeConverterInterface
lexicalXSDByte
- A string containing lexical representation of
xsd:byte.public static byte _parseByte(java.lang.CharSequence literal)
public java.lang.String printByte(byte val)
DatatypeConverterInterface
Converts a byte value into a string.
printByte
in interface DatatypeConverterInterface
val
- A byte valuepublic static java.lang.String _printByte(byte val)
public javax.xml.namespace.QName parseQName(java.lang.String lexicalXSDQName, javax.xml.namespace.NamespaceContext nsc)
DatatypeConverterInterface
Converts the string argument into a QName value.
String parameter lexicalXSDQname must conform to lexical value space specifed at XML Schema Part 2:Datatypes specification:QNames
parseQName
in interface DatatypeConverterInterface
lexicalXSDQName
- A string containing lexical representation of xsd:QName.nsc
- A namespace context for interpreting a prefix within a QName.public static javax.xml.namespace.QName _parseQName(java.lang.CharSequence text, javax.xml.namespace.NamespaceContext nsc)
public java.util.Calendar parseDateTime(java.lang.String lexicalXSDDateTime)
DatatypeConverterInterface
Converts the string argument into a Calendar value.
parseDateTime
in interface DatatypeConverterInterface
lexicalXSDDateTime
- A string containing lexical representation of
xsd:datetime.public static java.util.GregorianCalendar _parseDateTime(java.lang.CharSequence s)
public java.lang.String printDateTime(java.util.Calendar val)
DatatypeConverterInterface
Converts a Calendar value into a string.
printDateTime
in interface DatatypeConverterInterface
val
- A Calendar valuepublic static java.lang.String _printDateTime(java.util.Calendar val)
public byte[] parseBase64Binary(java.lang.String lexicalXSDBase64Binary)
DatatypeConverterInterface
Converts the string argument into an array of bytes.
parseBase64Binary
in interface DatatypeConverterInterface
lexicalXSDBase64Binary
- A string containing lexical representation
of xsd:base64Binary.public byte[] parseHexBinary(java.lang.String s)
DatatypeConverterInterface
Converts the string argument into an array of bytes.
parseHexBinary
in interface DatatypeConverterInterface
s
- A string containing lexical representation of
xsd:hexBinary.private static int hexToBin(char ch)
public java.lang.String printHexBinary(byte[] data)
DatatypeConverterInterface
Converts an array of bytes into a string.
printHexBinary
in interface DatatypeConverterInterface
data
- an array of bytespublic long parseUnsignedInt(java.lang.String lexicalXSDUnsignedInt)
DatatypeConverterInterface
Converts the string argument into a long value.
parseUnsignedInt
in interface DatatypeConverterInterface
lexicalXSDUnsignedInt
- A string containing lexical representation
of xsd:unsignedInt.public java.lang.String printUnsignedInt(long val)
DatatypeConverterInterface
Converts a long value into a string.
printUnsignedInt
in interface DatatypeConverterInterface
val
- A long valuepublic int parseUnsignedShort(java.lang.String lexicalXSDUnsignedShort)
DatatypeConverterInterface
Converts the string argument into an int value.
parseUnsignedShort
in interface DatatypeConverterInterface
lexicalXSDUnsignedShort
- A string containing lexical
representation of xsd:unsignedShort.public java.util.Calendar parseTime(java.lang.String lexicalXSDTime)
DatatypeConverterInterface
Converts the string argument into a Calendar value.
parseTime
in interface DatatypeConverterInterface
lexicalXSDTime
- A string containing lexical representation of
xsd:Time.public java.lang.String printTime(java.util.Calendar val)
DatatypeConverterInterface
Converts a Calendar value into a string.
printTime
in interface DatatypeConverterInterface
val
- A Calendar valuepublic java.util.Calendar parseDate(java.lang.String lexicalXSDDate)
DatatypeConverterInterface
Converts the string argument into a Calendar value.
parseDate
in interface DatatypeConverterInterface
lexicalXSDDate
- A string containing lexical representation of
xsd:Date.public java.lang.String printDate(java.util.Calendar val)
DatatypeConverterInterface
Converts a Calendar value into a string.
printDate
in interface DatatypeConverterInterface
val
- A Calendar valuepublic static java.lang.String _printDate(java.util.Calendar val)
public java.lang.String parseAnySimpleType(java.lang.String lexicalXSDAnySimpleType)
DatatypeConverterInterface
Return a string containing the lexical representation of the simple type.
parseAnySimpleType
in interface DatatypeConverterInterface
lexicalXSDAnySimpleType
- A string containing lexical
representation of the simple type.public java.lang.String printString(java.lang.String val)
DatatypeConverterInterface
Converts the string argument into a string.
printString
in interface DatatypeConverterInterface
val
- A string value.public java.lang.String printInt(int val)
DatatypeConverterInterface
Converts an int value into a string.
printInt
in interface DatatypeConverterInterface
val
- An int valuepublic static java.lang.String _printInt(int val)
public java.lang.String printLong(long val)
DatatypeConverterInterface
Converts a long value into a string.
printLong
in interface DatatypeConverterInterface
val
- A long valuepublic static java.lang.String _printLong(long val)
public java.lang.String printDecimal(java.math.BigDecimal val)
DatatypeConverterInterface
Converts a BigDecimal value into a string.
printDecimal
in interface DatatypeConverterInterface
val
- A BigDecimal valuepublic static java.lang.String _printDecimal(java.math.BigDecimal val)
public java.lang.String printDouble(double v)
DatatypeConverterInterface
Converts a double value into a string.
printDouble
in interface DatatypeConverterInterface
v
- A double valuepublic static java.lang.String _printDouble(double v)
public java.lang.String printQName(javax.xml.namespace.QName val, javax.xml.namespace.NamespaceContext nsc)
DatatypeConverterInterface
Converts a QName instance into a string.
printQName
in interface DatatypeConverterInterface
val
- A QName valuensc
- A namespace context for interpreting a prefix within a QName.public static java.lang.String _printQName(javax.xml.namespace.QName val, javax.xml.namespace.NamespaceContext nsc)
public java.lang.String printBase64Binary(byte[] val)
DatatypeConverterInterface
Converts an array of bytes into a string.
printBase64Binary
in interface DatatypeConverterInterface
val
- an array of bytespublic java.lang.String printUnsignedShort(int val)
DatatypeConverterInterface
Converts an int value into a string.
printUnsignedShort
in interface DatatypeConverterInterface
val
- An int valuepublic java.lang.String printAnySimpleType(java.lang.String val)
DatatypeConverterInterface
Converts a string value into a string.
printAnySimpleType
in interface DatatypeConverterInterface
val
- A string valuepublic static java.lang.String installHook(java.lang.String s)
private static byte[] initDecodeMap()
private static int guessLength(java.lang.String text)
Our requirement is to create byte[] of the exact length to store the binary data. If we do this in a straight-forward way, it takes two passes over the data. Experiments show that this is a non-trivial overhead (35% or so is spent on the first pass in calculating the length.)
So the approach here is that we compute the length speculatively, without looking at the whole contents. The obtained speculative value is never less than the actual length of the binary data, but it may be bigger. So if the speculation goes wrong, we'll pay the cost of reallocation and buffer copying.
If the base64 text is tightly packed with no indentation nor illegal char (like what most web services produce), then the speculation of this method will be correct, so we get the performance benefit.
public static byte[] _parseBase64Binary(java.lang.String text)
text
- base64Binary data is likely to be long, and decoding requires
each character to be accessed twice (once for counting length, another
for decoding.)
A benchmark showed that taking String
is faster, presumably
because JIT can inline a lot of string access (with data of 1K chars, it was twice as fast)private static char[] initEncodeMap()
public static char encode(int i)
public static byte encodeByte(int i)
public static java.lang.String _printBase64Binary(byte[] input)
public static java.lang.String _printBase64Binary(byte[] input, int offset, int len)
public static int _printBase64Binary(byte[] input, int offset, int len, char[] buf, int ptr)
ptr+((len+2)/3)*4
, which is the new offset
in the output buffer where the further bytes should be placed.public static int _printBase64Binary(byte[] input, int offset, int len, byte[] out, int ptr)
ptr+((len+2)/3)*4
, which is the new offset
in the output buffer where the further bytes should be placed.private static java.lang.CharSequence removeOptionalPlus(java.lang.CharSequence s)
private static boolean isDigitOrPeriodOrSign(char ch)