1 package org
.xmlrpc
.android
;
3 import java
.io
.BufferedReader
;
4 import java
.io
.IOException
;
5 import java
.io
.StringReader
;
6 import java
.text
.ParseException
;
7 import java
.text
.SimpleDateFormat
;
8 import java
.util
.ArrayList
;
9 import java
.util
.Calendar
;
10 import java
.util
.Date
;
11 import java
.util
.HashMap
;
12 import java
.util
.Iterator
;
13 import java
.util
.List
;
15 import java
.util
.Map
.Entry
;
17 import org
.xmlpull
.v1
.XmlPullParser
;
18 import org
.xmlpull
.v1
.XmlPullParserException
;
19 import org
.xmlpull
.v1
.XmlSerializer
;
21 import de
.ub0r
.android
.websms
.connector
.common
.Utils
;
24 * original source code from http://code.google.com/p/android-xmlrpc/ released
25 * under apache licence 2.0 http://www.apache.org/licenses/LICENSE-2.0
27 class XMLRPCSerializer
implements IXMLRPCSerializer
{
28 static SimpleDateFormat dateFormat
= new SimpleDateFormat(DATETIME_FORMAT
);
30 public void serialize(final XmlSerializer serializer
, final Object object
)
32 // check for scalar types:
33 if (object
instanceof Integer
|| object
instanceof Short
34 || object
instanceof Byte
) {
35 serializer
.startTag(null, TYPE_I4
).text(object
.toString()).endTag(
37 } else if (object
instanceof Long
) {
38 serializer
.startTag(null, TYPE_I8
).text(object
.toString()).endTag(
40 } else if (object
instanceof Double
|| object
instanceof Float
) {
41 serializer
.startTag(null, TYPE_DOUBLE
).text(object
.toString())
42 .endTag(null, TYPE_DOUBLE
);
43 } else if (object
instanceof Boolean
) {
44 Boolean bool
= (Boolean
) object
;
45 String boolStr
= bool
.booleanValue() ?
"1" : "0";
46 serializer
.startTag(null, TYPE_BOOLEAN
).text(boolStr
).endTag(null,
48 } else if (object
instanceof String
) {
49 serializer
.startTag(null, TYPE_STRING
).text(object
.toString())
50 .endTag(null, TYPE_STRING
);
51 } else if (object
instanceof Date
|| object
instanceof Calendar
) {
52 String dateStr
= dateFormat
.format(object
);
53 serializer
.startTag(null, TYPE_DATE_TIME_ISO8601
).text(dateStr
)
54 .endTag(null, TYPE_DATE_TIME_ISO8601
);
55 } else if (object
instanceof byte[]) {
56 String value
= new String(Base64Coder
.encode((byte[]) object
));
57 serializer
.startTag(null, TYPE_BASE64
).text(value
).endTag(null,
59 } else if (object
instanceof List
) {
60 serializer
.startTag(null, TYPE_ARRAY
).startTag(null, TAG_DATA
);
61 List
<Object
> list
= (List
<Object
>) object
;
62 Iterator
<Object
> iter
= list
.iterator();
63 while (iter
.hasNext()) {
64 Object o
= iter
.next();
65 serializer
.startTag(null, TAG_VALUE
);
66 this.serialize(serializer
, o
);
67 serializer
.endTag(null, TAG_VALUE
);
69 serializer
.endTag(null, TAG_DATA
).endTag(null, TYPE_ARRAY
);
70 } else if (object
instanceof Object
[]) {
71 serializer
.startTag(null, TYPE_ARRAY
).startTag(null, TAG_DATA
);
72 Object
[] objects
= (Object
[]) object
;
73 for (int i
= 0; i
< objects
.length
; i
++) {
74 Object o
= objects
[i
];
75 serializer
.startTag(null, TAG_VALUE
);
76 this.serialize(serializer
, o
);
77 serializer
.endTag(null, TAG_VALUE
);
79 serializer
.endTag(null, TAG_DATA
).endTag(null, TYPE_ARRAY
);
80 } else if (object
instanceof Map
) {
81 serializer
.startTag(null, TYPE_STRUCT
);
82 Map
<String
, Object
> map
= (Map
<String
, Object
>) object
;
83 Iterator
<Entry
<String
, Object
>> iter
= map
.entrySet().iterator();
84 while (iter
.hasNext()) {
85 Entry
<String
, Object
> entry
= iter
.next();
86 String key
= entry
.getKey();
87 Object value
= entry
.getValue();
89 serializer
.startTag(null, TAG_MEMBER
);
90 serializer
.startTag(null, TAG_NAME
).text(key
).endTag(null,
92 serializer
.startTag(null, TAG_VALUE
);
93 this.serialize(serializer
, value
);
94 serializer
.endTag(null, TAG_VALUE
);
95 serializer
.endTag(null, TAG_MEMBER
);
97 serializer
.endTag(null, TYPE_STRUCT
);
98 } else if (object
instanceof XMLRPCSerializable
) {
99 XMLRPCSerializable serializable
= (XMLRPCSerializable
) object
;
100 this.serialize(serializer
, serializable
.getSerializable());
102 throw new IOException("Cannot serialize " + object
);
106 public Object
deserialize(final XmlPullParser parser
)
107 throws XmlPullParserException
, IOException
{
108 parser
.require(XmlPullParser
.START_TAG
, null, TAG_VALUE
);
110 if (parser
.isEmptyElementTag()) {
111 // degenerated <value />, return empty string
116 boolean hasType
= true;
117 String typeNodeName
= null;
120 typeNodeName
= parser
.getName();
121 if (typeNodeName
.equals(TAG_VALUE
)
122 && parser
.getEventType() == XmlPullParser
.END_TAG
) {
123 // empty <value></value>, return empty string
126 } catch (XmlPullParserException e
) {
130 if (typeNodeName
.equals(TYPE_INT
) || typeNodeName
.equals(TYPE_I4
)) {
131 String value
= parser
.nextText();
132 obj
= Integer
.parseInt(value
);
133 } else if (typeNodeName
.equals(TYPE_I8
)) {
134 String value
= parser
.nextText();
135 obj
= Long
.parseLong(value
);
136 } else if (typeNodeName
.equals(TYPE_DOUBLE
)) {
137 String value
= parser
.nextText();
138 obj
= Double
.parseDouble(value
);
139 } else if (typeNodeName
.equals(TYPE_BOOLEAN
)) {
140 String value
= parser
.nextText();
141 obj
= value
.equals("1") ? Boolean
.TRUE
: Boolean
.FALSE
;
142 } else if (typeNodeName
.equals(TYPE_STRING
)) {
143 obj
= parser
.nextText();
144 } else if (typeNodeName
.equals(TYPE_DATE_TIME_ISO8601
)) {
145 String value
= parser
.nextText();
147 obj
= dateFormat
.parseObject(value
);
148 } catch (ParseException e
) {
149 throw new IOException("Cannot deserialize dateTime "
152 } else if (typeNodeName
.equals(TYPE_BASE64
)) {
153 String value
= parser
.nextText();
154 BufferedReader reader
= new BufferedReader(new StringReader(
155 value
), Utils
.BUFSIZE
);
157 StringBuffer sb
= new StringBuffer();
158 while ((line
= reader
.readLine()) != null) {
161 obj
= Base64Coder
.decode(sb
.toString());
162 } else if (typeNodeName
.equals(TYPE_ARRAY
)) {
163 parser
.nextTag(); // TAG_DATA (<data>)
164 parser
.require(XmlPullParser
.START_TAG
, null, TAG_DATA
);
167 List
<Object
> list
= new ArrayList
<Object
>();
168 while (parser
.getName().equals(TAG_VALUE
)) {
169 list
.add(this.deserialize(parser
));
172 parser
.require(XmlPullParser
.END_TAG
, null, TAG_DATA
);
173 parser
.nextTag(); // TAG_ARRAY (</array>)
174 parser
.require(XmlPullParser
.END_TAG
, null, TYPE_ARRAY
);
175 obj
= list
.toArray();
176 } else if (typeNodeName
.equals(TYPE_STRUCT
)) {
178 Map
<String
, Object
> map
= new HashMap
<String
, Object
>();
179 while (parser
.getName().equals(TAG_MEMBER
)) {
180 String memberName
= null;
181 Object memberValue
= null;
184 String name
= parser
.getName();
185 if (name
.equals(TAG_NAME
)) {
186 memberName
= parser
.nextText();
187 } else if (name
.equals(TAG_VALUE
)) {
188 memberValue
= this.deserialize(parser
);
193 if (memberName
!= null && memberValue
!= null) {
194 map
.put(memberName
, memberValue
);
196 parser
.require(XmlPullParser
.END_TAG
, null, TAG_MEMBER
);
199 parser
.require(XmlPullParser
.END_TAG
, null, TYPE_STRUCT
);
202 throw new IOException("Cannot deserialize " + parser
.getName());
205 // TYPE_STRING (<string>) is not required
206 obj
= parser
.getText();
208 parser
.nextTag(); // TAG_VALUE (</value>)
209 parser
.require(XmlPullParser
.END_TAG
, null, TAG_VALUE
);