• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package de.timroes.axmlrpc.serializer;
2 
3 import de.timroes.axmlrpc.XMLRPCException;
4 import de.timroes.axmlrpc.XMLRPCRuntimeException;
5 import de.timroes.axmlrpc.XMLUtil;
6 import de.timroes.axmlrpc.xmlcreator.XmlElement;
7 import java.util.ArrayList;
8 import java.util.Arrays;
9 import java.util.List;
10 import org.w3c.dom.Element;
11 import org.w3c.dom.Node;
12 
13 /**
14  *
15  * @author Tim Roes
16  */
17 public class ArraySerializer implements Serializer {
18 
19 	private static final String ARRAY_DATA = "data";
20 	private static final String ARRAY_VALUE = "value";
21 	private final SerializerHandler serializerHandler;
22 
ArraySerializer(SerializerHandler serializerHandler)23 	public ArraySerializer(SerializerHandler serializerHandler){
24 		this.serializerHandler = serializerHandler;
25 	}
26 
deserialize(Element content)27 	public Object deserialize(Element content) throws XMLRPCException {
28 
29 		List<Object> list = new ArrayList<Object>();
30 
31 		Element data = XMLUtil.getOnlyChildElement(content.getChildNodes());
32 
33 		if(!ARRAY_DATA.equals(data.getNodeName())) {
34 			throw new XMLRPCException("The array must contain one data tag.");
35 		}
36 
37 		// Deserialize every array element
38 		Node value;
39 		for(int i = 0; i < data.getChildNodes().getLength(); i++) {
40 
41 			value = data.getChildNodes().item(i);
42 
43 			// Strip only whitespace text elements and comments
44 			if(value == null || (value.getNodeType() == Node.TEXT_NODE
45 						&& value.getNodeValue().trim().length() <= 0)
46 					|| value.getNodeType() == Node.COMMENT_NODE)
47 				continue;
48 
49 			if(value.getNodeType() != Node.ELEMENT_NODE) {
50 				throw new XMLRPCException("Wrong element inside of array.");
51 			}
52 
53 			list.add(serializerHandler.deserialize((Element)value));
54 
55 		}
56 
57 		return list.toArray();
58 	}
59 
serialize(Object object)60 	public XmlElement serialize(Object object) {
61 
62 		Iterable<?> iter;
63 		if ( object instanceof Iterable<?>){
64 			iter = (Iterable<?>)object;
65 		} else {
66 			iter = Arrays.asList((Object[]) object);
67 		}
68 		XmlElement array = new XmlElement(SerializerHandler.TYPE_ARRAY);
69 		XmlElement data = new XmlElement(ARRAY_DATA);
70 		array.addChildren(data);
71 
72 		try {
73 
74 			XmlElement e;
75 			for(Object obj : iter) {
76 				e = new XmlElement(ARRAY_VALUE);
77 				e.addChildren(serializerHandler.serialize(obj));
78 				data.addChildren(e);
79 			}
80 
81 		} catch(XMLRPCException ex) {
82 			throw new XMLRPCRuntimeException(ex);
83 		}
84 
85 		return array;
86 
87 	}
88 
89 }
90