XMLRPCSerializer.java (7645B)
1 package org.xmlrpc.android; 2 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; 14 import java.util.Map; 15 import java.util.Map.Entry; 16 17 import org.xmlpull.v1.XmlPullParser; 18 import org.xmlpull.v1.XmlPullParserException; 19 import org.xmlpull.v1.XmlSerializer; 20 21 //import android.util.Log; 22 23 class XMLRPCSerializer implements IXMLRPCSerializer { 24 static SimpleDateFormat dateFormat = new SimpleDateFormat(DATETIME_FORMAT); 25 26 @SuppressWarnings("unchecked") 27 public void serialize(XmlSerializer serializer, Object object) throws IOException { 28 // This code supplied by mattias.ellback as part of issue #19 29 if (object == null){ 30 serializer.startTag(null, TYPE_NULL).endTag(null, TYPE_NULL); 31 } else 32 // check for scalar types: 33 if (object instanceof Integer || object instanceof Short || object instanceof Byte) { 34 serializer.startTag(null, TYPE_I4).text(object.toString()).endTag(null, TYPE_I4); 35 } else 36 if (object instanceof Long) { 37 serializer.startTag(null, TYPE_I8).text(object.toString()).endTag(null, TYPE_I8); 38 } else 39 if (object instanceof Double || object instanceof Float) { 40 serializer.startTag(null, TYPE_DOUBLE).text(object.toString()).endTag(null, TYPE_DOUBLE); 41 } else 42 if (object instanceof Boolean) { 43 Boolean bool = (Boolean) object; 44 String boolStr = bool.booleanValue() ? "1" : "0"; 45 serializer.startTag(null, TYPE_BOOLEAN).text(boolStr).endTag(null, TYPE_BOOLEAN); 46 } else 47 if (object instanceof String) { 48 serializer.startTag(null, TYPE_STRING).text(object.toString()).endTag(null, TYPE_STRING); 49 } else 50 if (object instanceof Date || object instanceof Calendar) { 51 String dateStr = dateFormat.format(object); 52 serializer.startTag(null, TYPE_DATE_TIME_ISO8601).text(dateStr).endTag(null, TYPE_DATE_TIME_ISO8601); 53 } else 54 if (object instanceof byte[] ){ 55 String value = new String(Base64Coder.encode((byte[])object)); 56 serializer.startTag(null, TYPE_BASE64).text(value).endTag(null, TYPE_BASE64); 57 } else 58 if (object instanceof List) { 59 serializer.startTag(null, TYPE_ARRAY).startTag(null, TAG_DATA); 60 List<Object> list = (List<Object>) object; 61 Iterator<Object> iter = list.iterator(); 62 while (iter.hasNext()) { 63 Object o = iter.next(); 64 serializer.startTag(null, TAG_VALUE); 65 serialize(serializer, o); 66 serializer.endTag(null, TAG_VALUE); 67 } 68 serializer.endTag(null, TAG_DATA).endTag(null, TYPE_ARRAY); 69 } else 70 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 serialize(serializer, o); 77 serializer.endTag(null, TAG_VALUE); 78 } 79 serializer.endTag(null, TAG_DATA).endTag(null, TYPE_ARRAY); 80 } else 81 if (object instanceof Map) { 82 serializer.startTag(null, TYPE_STRUCT); 83 Map<String, Object> map = (Map<String, Object>) object; 84 Iterator<Entry<String, Object>> iter = map.entrySet().iterator(); 85 while (iter.hasNext()) { 86 Entry<String, Object> entry = iter.next(); 87 String key = entry.getKey(); 88 Object value = entry.getValue(); 89 90 serializer.startTag(null, TAG_MEMBER); 91 serializer.startTag(null, TAG_NAME).text(key).endTag(null, TAG_NAME); 92 serializer.startTag(null, TAG_VALUE); 93 serialize(serializer, value); 94 serializer.endTag(null, TAG_VALUE); 95 serializer.endTag(null, TAG_MEMBER); 96 } 97 serializer.endTag(null, TYPE_STRUCT); 98 } else 99 if (object instanceof XMLRPCSerializable) { 100 XMLRPCSerializable serializable = (XMLRPCSerializable) object; 101 serialize(serializer, serializable.getSerializable()); 102 } else { 103 throw new IOException("Cannot serialize " + object); 104 } 105 } 106 107 public Object deserialize(XmlPullParser parser) throws XmlPullParserException, IOException { 108 parser.require(XmlPullParser.START_TAG, null, TAG_VALUE); 109 110 if (parser.isEmptyElementTag()) { 111 // degenerated <value />, return empty string 112 return ""; 113 } 114 115 Object obj; 116 boolean hasType = true; 117 String typeNodeName = null; 118 try { 119 parser.nextTag(); 120 typeNodeName = parser.getName(); 121 if (typeNodeName.equals(TAG_VALUE) && parser.getEventType() == XmlPullParser.END_TAG) { 122 // empty <value></value>, return empty string 123 return ""; 124 } 125 126 127 } catch (XmlPullParserException e) { 128 hasType = false; 129 } 130 if (hasType) { 131 // This code submitted by mattias.ellback in issue #19 132 if (typeNodeName.equals(TYPE_NULL)){ 133 parser.nextTag(); 134 obj = null; 135 } 136 else 137 if (typeNodeName.equals(TYPE_INT) || typeNodeName.equals(TYPE_I4)) { 138 String value = parser.nextText(); 139 obj = Integer.parseInt(value); 140 } else 141 if (typeNodeName.equals(TYPE_I8)) { 142 String value = parser.nextText(); 143 obj = Long.parseLong(value); 144 } else 145 if (typeNodeName.equals(TYPE_DOUBLE)) { 146 String value = parser.nextText(); 147 obj = Double.parseDouble(value); 148 } else 149 if (typeNodeName.equals(TYPE_BOOLEAN)) { 150 String value = parser.nextText(); 151 obj = value.equals("1") ? Boolean.TRUE : Boolean.FALSE; 152 } else 153 if (typeNodeName.equals(TYPE_STRING)) { 154 obj = parser.nextText(); 155 } else 156 if (typeNodeName.equals(TYPE_DATE_TIME_ISO8601)) { 157 String value = parser.nextText(); 158 try { 159 obj = dateFormat.parseObject(value); 160 } catch (ParseException e) { 161 throw new IOException("Cannot deserialize dateTime " + value); 162 } 163 } else 164 if (typeNodeName.equals(TYPE_BASE64)) { 165 String value = parser.nextText(); 166 BufferedReader reader = new BufferedReader(new StringReader(value),50); 167 String line; 168 StringBuffer sb = new StringBuffer(); 169 while ((line = reader.readLine()) != null) { 170 sb.append(line); 171 } 172 obj = Base64Coder.decode(sb.toString()); 173 } else 174 if (typeNodeName.equals(TYPE_ARRAY)) { 175 parser.nextTag(); // TAG_DATA (<data>) 176 parser.require(XmlPullParser.START_TAG, null, TAG_DATA); 177 178 parser.nextTag(); 179 List<Object> list = new ArrayList<Object>(); 180 while (parser.getName().equals(TAG_VALUE)) { 181 list.add(deserialize(parser)); 182 parser.nextTag(); 183 } 184 parser.require(XmlPullParser.END_TAG, null, TAG_DATA); 185 parser.nextTag(); // TAG_ARRAY (</array>) 186 parser.require(XmlPullParser.END_TAG, null, TYPE_ARRAY); 187 obj = list.toArray(); 188 } else 189 if (typeNodeName.equals(TYPE_STRUCT)) { 190 parser.nextTag(); 191 Map<String, Object> map = new HashMap<String, Object>(); 192 while (parser.getName().equals(TAG_MEMBER)) { 193 String memberName = null; 194 Object memberValue = null; 195 while (true) { 196 parser.nextTag(); 197 String name = parser.getName(); 198 if (name.equals(TAG_NAME)) { 199 memberName = parser.nextText(); 200 } else 201 if (name.equals(TAG_VALUE)) { 202 memberValue = deserialize(parser); 203 } else { 204 break; 205 } 206 } 207 if (memberName != null && memberValue != null) { 208 map.put(memberName, memberValue); 209 } 210 parser.require(XmlPullParser.END_TAG, null, TAG_MEMBER); 211 parser.nextTag(); 212 } 213 parser.require(XmlPullParser.END_TAG, null, TYPE_STRUCT); 214 obj = map; 215 } else { 216 throw new IOException("Cannot deserialize " + parser.getName()); 217 } 218 } else { 219 // TYPE_STRING (<string>) is not required 220 obj = parser.getText(); 221 } 222 parser.nextTag(); // TAG_VALUE (</value>) 223 parser.require(XmlPullParser.END_TAG, null, TAG_VALUE); 224 return obj; 225 } 226 }