diff --git a/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayload.java b/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayload.java index d25028043d..b4564d915d 100644 --- a/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayload.java +++ b/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayload.java @@ -45,6 +45,7 @@ import com.raytheon.uf.viz.collaboration.comm.provider.SerializationMode; * ------------ ---------- ----------- -------------------------- * Dec 11, 2013 2562 bclement Initial creation * Feb 27, 2013 2756 bclement extends BaseExtension + * Jun 12, 2013 2903 bclement default to wrap jaxb xml in base64 * * * @@ -56,6 +57,8 @@ public class SessionPayload extends BaseExtension { private static final IUFStatusHandler log = UFStatus .getHandler(SessionPayload.class); + public static final String XML_ENCODING = "UTF-8"; + public static enum PayloadType { Config, Command, Invitation; }; @@ -133,7 +136,13 @@ public class SessionPayload extends BaseExtension { CollaborationXmlManager jaxb = CollaborationXmlManager .getInstance(); String xml = jaxb.marshalToFragment(data); - builder.appendText(xml); + /* + * wrap JAXB XML in base64 to avoid problems with openfire + * disconnecting due to complex XML + */ + String base64Xml = Base64.encodeBytes(xml + .getBytes(XML_ENCODING)); + builder.appendText(base64Xml); } catch (Exception je) { throw new CollaborationException( "[JAXB] Could not serialize object", je); diff --git a/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayloadProvider.java b/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayloadProvider.java index d1f204e5b3..d67af8b86a 100644 --- a/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayloadProvider.java +++ b/cave/com.raytheon.uf.viz.collaboration.comm/src/com/raytheon/uf/viz/collaboration/comm/packet/SessionPayloadProvider.java @@ -52,6 +52,7 @@ import com.raytheon.uf.viz.collaboration.comm.provider.SerializationMode; * Dec 16, 2013 2562 bclement Initial creation * Feb 12, 2014 2793 bclement improved error handling * Feb 27, 2013 2756 bclement extends BaseProvider + * Jun 12, 2013 2903 bclement added support for jaxb xml in base64 * * * @@ -168,13 +169,30 @@ public class SessionPayloadProvider extends BaseProvider */ private static Object unmarshalJaxb(XmlPullParser parser) throws XmlPullParserException, IOException, CollaborationException { - int tag = parser.next(); - if (tag != XmlPullParser.START_TAG) { - throw new CollaborationException( - "Encountered JAXB payload without XML as data"); - } CollaborationXmlManager manager = CollaborationXmlManager.getInstance(); - return manager.unmarshalFromXPP(parser); + int tag = parser.next(); + Object rval; + if (tag == XmlPullParser.TEXT) { + /* + * default behavior is to wrap XML in base64 to avoid problems with + * openfire handling complex XML leading to disconnect + */ + byte[] xmlBytes = Base64.decode(parser.getText()); + String xml = new String(xmlBytes, SessionPayload.XML_ENCODING); + try { + rval = manager.unmarshalFromXml(xml); + } catch (JAXBException e) { + throw new CollaborationException( + "Unable to parse base64 encoded XML payload: " + xml, e); + } + } else if (tag == XmlPullParser.START_TAG) { + /* JAXB payload is more XML, attempt to unmarshal it */ + rval = manager.unmarshalFromXPP(parser); + } else { + throw new CollaborationException( + "Unexpected parser state after JAXB tag: " + tag); + } + return rval; } /**