• 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.HashMap;
8 import java.util.Map;
9 import org.w3c.dom.Element;
10 import org.w3c.dom.Node;
11 
12 /**
13  *
14  * @author Tim Roes
15  */
16 public class StructSerializer implements Serializer {
17 
18 	private static final String STRUCT_MEMBER = "member";
19 	private static final String STRUCT_NAME = "name";
20 	private static final String STRUCT_VALUE = "value";
21 
22 	private final SerializerHandler serializerHandler;
23 
StructSerializer(SerializerHandler serializerHandler)24 	public StructSerializer(SerializerHandler serializerHandler) {
25 		this.serializerHandler = serializerHandler;
26 	}
27 
deserialize(Element content)28 	public Object deserialize(Element content) throws XMLRPCException {
29 
30 		Map<String, Object> map = new HashMap<String, Object>();
31 
32 		Node n, m;
33 		String s;
34 		Object o;
35 		for(int i = 0; i < content.getChildNodes().getLength(); i++) {
36 
37 			n = content.getChildNodes().item(i);
38 
39 			// Strip only whitespace text elements and comments
40 			if((n.getNodeType() == Node.TEXT_NODE
41 						&& n.getNodeValue().trim().length() <= 0)
42 					|| n.getNodeType() == Node.COMMENT_NODE)
43 				continue;
44 
45 			if(n.getNodeType() != Node.ELEMENT_NODE
46 					|| !STRUCT_MEMBER.equals(n.getNodeName())) {
47 				throw new XMLRPCException("Only struct members allowed within a struct.");
48 			}
49 
50 			// Grep name and value from member
51 			s = null; o = null;
52 			for(int j = 0; j < n.getChildNodes().getLength(); j++) {
53 				m = n.getChildNodes().item(j);
54 
55 				// Strip only whitespace text elements and comments
56 				if((m.getNodeType() == Node.TEXT_NODE
57 							&& m.getNodeValue().trim().length() <= 0)
58 						|| m.getNodeType() == Node.COMMENT_NODE)
59 					continue;
60 
61 				if(STRUCT_NAME.equals(m.getNodeName())) {
62 					if(s != null) {
63 						throw new XMLRPCException("Name of a struct member cannot be set twice.");
64 					} else {
65 						s = XMLUtil.getOnlyTextContent(m.getChildNodes());
66 					}
67 				} else if(m.getNodeType() == Node.ELEMENT_NODE && STRUCT_VALUE.equals(m.getNodeName())) {
68 					if(o != null) {
69 						throw new XMLRPCException("Value of a struct member cannot be set twice.");
70 					} else {
71 						o = serializerHandler.deserialize((Element)m);
72 					}
73 				} else {
74 					throw new XMLRPCException("A struct member must only contain one name and one value.");
75 				}
76 
77 			}
78 
79 			map.put(s, o);
80 
81 		}
82 
83 		return map;
84 
85 	}
86 
serialize(Object object)87 	public XmlElement serialize(Object object) {
88 
89 		XmlElement struct = new XmlElement(SerializerHandler.TYPE_STRUCT);
90 
91 		try {
92 
93 			XmlElement entry, name, value;
94 
95 			// We can safely cast here, this Serializer should only be called when
96 			// the parameter is a map.
97 			@SuppressWarnings("unchecked")
98 			Map<String,Object> map = (Map<String,Object>)object;
99 
100 			for(Map.Entry<String,Object> member : map.entrySet()) {
101 				entry = new XmlElement(STRUCT_MEMBER);
102 				name = new XmlElement(STRUCT_NAME);
103 				value = new XmlElement(STRUCT_VALUE);
104 				name.setContent(member.getKey());
105 				value.addChildren(serializerHandler.serialize(member.getValue()));
106 				entry.addChildren(name);
107 				entry.addChildren(value);
108 				struct.addChildren(entry);
109 			}
110 
111 		} catch(XMLRPCException ex) {
112 			throw new XMLRPCRuntimeException(ex);
113 		}
114 
115 		return struct;
116 	}
117 
118 }