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