android-ibc-forum

Unnamed repository; edit this file 'description' to name the repository.
git clone http://git.code.weiherhei.de/android-ibc-forum.git
Log | Files | Refs

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 }