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 }