Hi, Vladimir:
Maybe my question is a little picky.:)
I noticed that the data for getCharsetsInfo of our charsetprovider
implementation is hardcoded. So is it possible to provide a more flexible
approach?
ResourceBundle is an option, but it has some problem in bootstrap.
Once I am trying ICU4J as default charset provider on Harmony, there will be
a bootstrap problem, since when loading required data for charset by
resourcebundle, the ClassLoader.loadResourceBundle still needs
charset. Then an initilization error will thrown.
I have thought of two possible approach:
(1) Load the charset information by native code in initialization.
(2) Using a bootstrap charset, for example, ISO-8859-1, to load data
for other charset.
I guess, maybe it deserves to discuss a little about the approach(2) .
It will be a great convenience for our customer if they are permitted to
choose charset provider. But some of them are not designed for class
library, that is, they will have bootstrap problem.
On 4/9/07, Vladimir Strigun <[EMAIL PROTECTED]> wrote:
On 4/9/07, Tony Wu <[EMAIL PROTECTED]> wrote:
> I wonder if it is possible to make it as built-in charset provider and
> make icu as an extension?
Attached test bundle, instruction and patch for current code combined
new implementation with ICU. So, I have the same 228 charsets
available - about 90 charsets used from the new bundle, and not
implemented charsets used from ICU.
The full list of charsets supported with the current bundle + ICU:
Adobe-Standard-Encoding class=com.ibm.icu4jni.charset.CharsetICU
Big5 class=org.apache.harmony.niochar.charset.additional.Big5
Big5-HKSCS class=
org.apache.harmony.niochar.charset.additional.Big5_HKSCS
BOCU-1 class=com.ibm.icu4jni.charset.CharsetICU
CESU-8 class=com.ibm.icu4jni.charset.CharsetICU
cp850 class=org.apache.harmony.niochar.charset.additional.IBM850
cp851 class=com.ibm.icu4jni.charset.CharsetICU
cp856 class=org.apache.harmony.niochar.charset.additional.x_IBM856
cp857 class=org.apache.harmony.niochar.charset.additional.IBM857
cp858 class=org.apache.harmony.niochar.charset.additional.IBM00858
cp860 class=org.apache.harmony.niochar.charset.additional.IBM860
cp861 class=org.apache.harmony.niochar.charset.additional.IBM861
cp862 class=org.apache.harmony.niochar.charset.additional.IBM862
cp863 class=org.apache.harmony.niochar.charset.additional.IBM863
cp864 class=org.apache.harmony.niochar.charset.additional.IBM864
cp865 class=org.apache.harmony.niochar.charset.additional.IBM865
cp866 class=org.apache.harmony.niochar.charset.IBM866
cp868 class=org.apache.harmony.niochar.charset.additional.IBM868
cp869 class=org.apache.harmony.niochar.charset.additional.IBM869
cp922 class=org.apache.harmony.niochar.charset.additional.x_IBM922
EUC-JP class=com.ibm.icu4jni.charset.CharsetICU
EUC-KR class=org.apache.harmony.niochar.charset.additional.EUC_KR
GB18030 class=org.apache.harmony.niochar.charset.additional.GB18030
GB2312 class=org.apache.harmony.niochar.charset.additional.GB2312
GB_2312-80 class=com.ibm.icu4jni.charset.CharsetICU
GBK class=org.apache.harmony.niochar.charset.additional.GBK
hp-roman8 class=com.ibm.icu4jni.charset.CharsetICU
HZ-GB-2312 class=com.ibm.icu4jni.charset.CharsetICU
IBM-Thai class=
org.apache.harmony.niochar.charset.additional.IBM_Thai
IBM01140 class=
org.apache.harmony.niochar.charset.additional.IBM01140
IBM01141 class=
org.apache.harmony.niochar.charset.additional.IBM01141
IBM01142 class=
org.apache.harmony.niochar.charset.additional.IBM01142
IBM01143 class=
org.apache.harmony.niochar.charset.additional.IBM01143
IBM01144 class=
org.apache.harmony.niochar.charset.additional.IBM01144
IBM01145 class=
org.apache.harmony.niochar.charset.additional.IBM01145
IBM01146 class=
org.apache.harmony.niochar.charset.additional.IBM01146
IBM01147 class=
org.apache.harmony.niochar.charset.additional.IBM01147
IBM01148 class=
org.apache.harmony.niochar.charset.additional.IBM01148
IBM01149 class=
org.apache.harmony.niochar.charset.additional.IBM01149
IBM037 class=org.apache.harmony.niochar.charset.additional.IBM037
IBM1026 class=org.apache.harmony.niochar.charset.additional.IBM1026
IBM1047 class=org.apache.harmony.niochar.charset.additional.IBM1047
IBM273 class=org.apache.harmony.niochar.charset.additional.IBM273
IBM277 class=org.apache.harmony.niochar.charset.additional.IBM277
IBM278 class=org.apache.harmony.niochar.charset.additional.IBM278
IBM280 class=org.apache.harmony.niochar.charset.additional.IBM280
IBM284 class=org.apache.harmony.niochar.charset.additional.IBM284
IBM285 class=org.apache.harmony.niochar.charset.additional.IBM285
IBM290 class=com.ibm.icu4jni.charset.CharsetICU
IBM297 class=org.apache.harmony.niochar.charset.additional.IBM297
IBM367 class=org.apache.harmony.niochar.charset.US_ASCII
IBM420 class=org.apache.harmony.niochar.charset.additional.IBM420
IBM424 class=org.apache.harmony.niochar.charset.additional.IBM424
IBM437 class=org.apache.harmony.niochar.charset.additional.IBM437
IBM500 class=org.apache.harmony.niochar.charset.additional.IBM500
IBM775 class=org.apache.harmony.niochar.charset.additional.IBM775
IBM852 class=org.apache.harmony.niochar.charset.additional.IBM852
IBM855 class=org.apache.harmony.niochar.charset.additional.IBM855
IBM870 class=org.apache.harmony.niochar.charset.additional.IBM870
IBM871 class=org.apache.harmony.niochar.charset.additional.IBM871
IBM918 class=org.apache.harmony.niochar.charset.additional.IBM918
ISO-2022-CN class=com.ibm.icu4jni.charset.CharsetICU
ISO-2022-CN-EXT class=com.ibm.icu4jni.charset.CharsetICU
ISO-2022-JP class=com.ibm.icu4jni.charset.CharsetICU
ISO-2022-JP-2 class=com.ibm.icu4jni.charset.CharsetICU
ISO-2022-KR class=com.ibm.icu4jni.charset.CharsetICU
ISO-8859-1 class=org.apache.harmony.niochar.charset.ISO_8859_1
ISO-8859-13 class=org.apache.harmony.niochar.charset.ISO_8859_13
ISO-8859-15 class=org.apache.harmony.niochar.charset.ISO_8859_15
ISO-8859-2 class=org.apache.harmony.niochar.charset.ISO_8859_2
ISO-8859-3 class=
org.apache.harmony.niochar.charset.additional.ISO_8859_3
ISO-8859-4 class=org.apache.harmony.niochar.charset.ISO_8859_4
ISO-8859-5 class=org.apache.harmony.niochar.charset.ISO_8859_5
ISO-8859-6 class=
org.apache.harmony.niochar.charset.additional.ISO_8859_6
ISO-8859-7 class=org.apache.harmony.niochar.charset.ISO_8859_7
ISO-8859-8 class=
org.apache.harmony.niochar.charset.additional.ISO_8859_8
ISO-8859-9 class=org.apache.harmony.niochar.charset.ISO_8859_9
JIS_Encoding class=com.ibm.icu4jni.charset.CharsetICU
JIS_X0201 class=com.ibm.icu4jni.charset.CharsetICU
KOI8-R class=org.apache.harmony.niochar.charset.KOI8_R
KOI8-U class=com.ibm.icu4jni.charset.CharsetICU
KSC_5601 class=
org.apache.harmony.niochar.charset.additional.x_windows_949
macintosh class=com.ibm.icu4jni.charset.CharsetICU
SCSU class=com.ibm.icu4jni.charset.CharsetICU
Shift_JIS class=
org.apache.harmony.niochar.charset.additional.windows_31j
TIS-620 class=org.apache.harmony.niochar.charset.additional.x_IBM874
US-ASCII class=org.apache.harmony.niochar.charset.US_ASCII
UTF-16 class=org.apache.harmony.niochar.charset.UTF_16
UTF-16BE class=org.apache.harmony.niochar.charset.UTF_16BE
UTF-16LE class=org.apache.harmony.niochar.charset.UTF_16LE
UTF-32 class=com.ibm.icu4jni.charset.CharsetICU
UTF-32BE class=com.ibm.icu4jni.charset.CharsetICU
UTF-32LE class=com.ibm.icu4jni.charset.CharsetICU
UTF-7 class=com.ibm.icu4jni.charset.CharsetICU
UTF-8 class=org.apache.harmony.niochar.charset.UTF_8
windows-1250 class=org.apache.harmony.niochar.charset.CP_1250
windows-1251 class=org.apache.harmony.niochar.charset.CP_1251
windows-1252 class=org.apache.harmony.niochar.charset.CP_1252
windows-1253 class=org.apache.harmony.niochar.charset.CP_1253
windows-1254 class=org.apache.harmony.niochar.charset.CP_1254
windows-1255 class=
org.apache.harmony.niochar.charset.additional.windows_1255
windows-1256 class=
org.apache.harmony.niochar.charset.additional.windows_1256
windows-1257 class=org.apache.harmony.niochar.charset.CP_1257
windows-1258 class=com.ibm.icu4jni.charset.CharsetICU
x-ebcdic-xml-us class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1006_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM1006
x-ibm-1025_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM1025
x-ibm-1047-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1097_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM1097
x-ibm-1098_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM1098
x-ibm-1112_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM1112
x-ibm-1122_P100-1999
class=org.apache.harmony.niochar.charset.additional.x_IBM1122
x-ibm-1123_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM1123
x-ibm-1124_P100-1996
class=org.apache.harmony.niochar.charset.additional.x_IBM1124
x-ibm-1125_P100-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1129_P100-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1130_P100-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1131_P100-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1132_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1133_P100-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1137_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1140-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1142-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1143-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1144-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1145-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1146-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1147-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1148-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1149-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1153-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1153_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1154_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1155_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1156_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1157_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1158_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1160_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1162_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1164_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1250_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1251_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1252_P100-2000 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1253_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1254_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1255_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1256_P110-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1257_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1258_P100-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-12712-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-12712_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1363_P110-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1364_P110-1997 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1371_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1373_P100-2002 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1375_P100-2003
class=org.apache.harmony.niochar.charset.additional.x_MS950_HKSCS
x-ibm-1386_P100-2002 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1388_P103-2001 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1390_P110-2003 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-1399_P110-2003 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-16684_P110-2003 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-16804-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-16804_X110-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-25546 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-33722_P120-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-37-s390 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-4899_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-4909_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-4971_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-5123_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-5351_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-5352_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-5353_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-737_P100-1997
class=org.apache.harmony.niochar.charset.additional.x_IBM737
x-ibm-803_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-813_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-8482_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-867_P100-1998 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-875_P100-1995
class=org.apache.harmony.niochar.charset.additional.x_IBM875
x-ibm-901_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-902_P100-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-930_P120-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-933_P110-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-935_P110-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-937_P110-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-939_P120-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-942_P12A-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-943_P130-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-949_P110-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-949_P11A-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-950_P110-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-954_P101-2000 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-964_P110-1999 class=com.ibm.icu4jni.charset.CharsetICU
x-ibm-971_P100-1995 class=com.ibm.icu4jni.charset.CharsetICU
x-IMAP-mailbox-name class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-be class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-de class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-gu class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-ka class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-ma class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-or class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-pa class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-ta class=com.ibm.icu4jni.charset.CharsetICU
x-iscii-te class=com.ibm.icu4jni.charset.CharsetICU
x-JIS7 class=com.ibm.icu4jni.charset.CharsetICU
x-JIS8 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-1 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-11 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-16 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-17 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-18 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-19 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-2 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-3 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-4 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-5 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-6 class=com.ibm.icu4jni.charset.CharsetICU
x-LMBCS-8 class=com.ibm.icu4jni.charset.CharsetICU
x-mac-centraleurroman class=com.ibm.icu4jni.charset.CharsetICU
x-mac-cyrillic
class=org.apache.harmony.niochar.charset.additional.x_MacCyrillic
x-mac-greek class=
org.apache.harmony.niochar.charset.additional.x_MacGreek
x-mac-turkish class=
org.apache.harmony.niochar.charset.additional.x_MacTurkish
x-UTF16_OppositeEndian class=com.ibm.icu4jni.charset.CharsetICU
x-UTF16_PlatformEndian class=com.ibm.icu4jni.charset.CharsetICU
x-UTF32_OppositeEndian class=com.ibm.icu4jni.charset.CharsetICU
x-UTF32_PlatformEndian class=com.ibm.icu4jni.charset.CharsetICU
x-windows-874-2000 class=com.ibm.icu4jni.charset.CharsetICU
x-windows-949-2000 class=com.ibm.icu4jni.charset.CharsetICU
Thanks.
Vladimir.
> On 4/9/07, Tony Wu <[EMAIL PROTECTED]> wrote:
> > amazing work.
> > generating the charsets...
> >
> > On 4/9/07, Vladimir Strigun <[EMAIL PROTECTED]> wrote:
> > > On 4/9/07, Andrew Zhang <[EMAIL PROTECTED]> wrote:
> > > > On 4/9/07, Vladimir Strigun <[EMAIL PROTECTED]> wrote:
> > > > >
> > > > > On 4/9/07, Andrew Zhang <[EMAIL PROTECTED]> wrote:
> > > > > > Super cool!!!
> > > > > > Does it mean we're not dependent on ICU any more?
> > > > >
> > > > > Unfortunately not all charsets supported with attached bundle.
The
> > > > > list of supported charsets you could find in README file.
> > > >
> > > >
> > > > Hi Vladimir, not unfortunately at all. :)
> > > >
> > > > We're on the way to be independent of ICU, right? ;)
> > >
> > > Yes, you right, we're on the way :)
> > >
> > >
> > > > > On 4/9/07, Vladimir Strigun <[EMAIL PROTECTED]> wrote:
> > > > > > >
> > > > > > > Hi all!
> > > > > > >
> > > > > > > I'm happy to announce one more contribution to harmony on
behalf of
> > > > > > > Intel. Provided implementation of charset encoders/decoders
is
> > > > > > > intended to replace the ICU-based charsets encoding/decoding
> > > > > > > operations. The code was developed in clean-room environment
inside
> > > > > > > Intel and I'd like you to play with it and include to
current Harmony
> > > > > > > tree.
> > > > > > >
> > > > > > > The package could be found there:
> > > > > > > HARMONY-3593
> > > > > > >
> > > > > > > The algorithms for charsets encoding/decoding differs from
that of
> > > > > > > ICU, all charsets are generated from current Harmony or any
other
> > > > > > > implementation of Java and could be properly integrated into
current
> > > > > > > nio_char module. The archive contains source files for 6
charsets:
> > > > > > > GB18030, US-ASCII, ISO-8859-1, UTF-8, UTF-16, UTF-16BE,
UTF-16LE;
> > > > > > > implementation of CharsetProvider; generator for other
Charsets and
> > > > > > > native part. I've tested the package with more that 90
charsets, and
> > > > > > > all benchmarks and tests passed with new bundle.
Additionally I have
> > > > > > > significant boost for Dacapo.antlr and Dacapo.xalanbenchmarks with
> > > > > > > current Harmony tree on DRLVM and IBM VM. On DRLVM I have
2.5x boost
> > > > > > > for antlr and ~5-8x for xalan.
> > > > > > >
> > > > > > > The main advantages of the package are the following:
> > > > > > > - Code for every charset is generated by CharsetGenerator,
thus, if
> > > > > > > some modification would be necessary we need just correct
generator
> > > > > > > and re-generate all sources.
> > > > > > > - We use 2 different encoders and decoders for java and
direct
> > > > > > > buffers. Since most applications use java heap buffers,
unlike
> > > > > > > existing implementation it doesn't produce lots of native
calls to
> > > > > > > perform encoding/decoding operations on the java buffers
those
> > > > > > > significantly improving performance. This is the main reason
why we
> > > > > > > have such a significant boost for Dacapo.
> > > > > > > - Charset tables for encoding/decoding are stored in
appropriate
> > > > > > > classes.
> > > > > > >
> > > > > > > Since the package contains implementation for 6 charsets
only,
> > > > > > > documentations how to generate and build additional charsets
you could
> > > > > > > find in README file from contributed package.
> > > > > > >
> > > > > > > Please do not hesitate to contact me for more details.
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Vladimir.
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Best regards,
> > > > > > Andrew Zhang
> > > > > >
> > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Best regards,
> > > > Andrew Zhang
> > > >
> > >
> >
> >
> > --
> > Tony Wu
> > China Software Development Lab, IBM
> >
>
>
> --
> Tony Wu
> China Software Development Lab, IBM
>
--
Leo Li
China Software Development Lab, IBM