diff options
Diffstat (limited to 'src/com/isode/stroke/serializer/StanzaSerializer.java')
-rw-r--r-- | src/com/isode/stroke/serializer/StanzaSerializer.java | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/com/isode/stroke/serializer/StanzaSerializer.java b/src/com/isode/stroke/serializer/StanzaSerializer.java new file mode 100644 index 0000000..950ccf7 --- /dev/null +++ b/src/com/isode/stroke/serializer/StanzaSerializer.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.Stanza; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import java.util.logging.Logger; + +public abstract class StanzaSerializer implements ElementSerializer { + + private final String tag_; + private final PayloadSerializerCollection payloadSerializers_; + private final Logger logger_ = Logger.getLogger(this.getClass().getName()); + + public StanzaSerializer(String tag, PayloadSerializerCollection payloadSerializers) { + payloadSerializers_ = payloadSerializers; + tag_ = tag; + } + + public String serialize(Element element) { + assert element != null; + assert payloadSerializers_ != null; + Stanza stanza = (Stanza) element; + XMLElement stanzaElement = new XMLElement(tag_); + if (stanza.getFrom() != null && stanza.getFrom().isValid()) { + stanzaElement.setAttribute("from", stanza.getFrom().toString()); + } + if (stanza.getTo() != null && stanza.getTo().isValid()) { + stanzaElement.setAttribute("to", stanza.getTo().toString()); + } + if (stanza.getID() != null && (stanza.getID().length()!=0)) { + stanzaElement.setAttribute("id", stanza.getID()); + } + setStanzaSpecificAttributes(stanza, stanzaElement); + + StringBuilder serializedPayloads = new StringBuilder(); + for (Payload payload : stanza.getPayloads()) { + PayloadSerializer serializer = payloadSerializers_.getPayloadSerializer(payload); + if (serializer != null) { + serializedPayloads.append(serializer.serialize(payload)); + } else { + /*TODO: port*/ + assert false; + //std::cerr << "Could not find serializer for " << typeid(*(payload.get())).name() << std::endl; + } + } + if (serializedPayloads.toString().length()!=0) { + stanzaElement.addNode(new XMLRawTextNode(serializedPayloads.toString())); + } + return stanzaElement.serialize(); + } + + public abstract void setStanzaSpecificAttributes(Element element, XMLElement xmlElement); +} |