public ActiveMQMessage convertFrame(StompProtocolConverter converter, StompFrame command) throws JMSException, ProtocolException { final Map<?, ?> headers = command.getHeaders(); final ActiveMQMessage msg; /* * To reduce the complexity of this method perhaps a Chain of Responsibility * would be a better implementation */ if (headers.containsKey(Stomp.Headers.AMQ_MESSAGE_TYPE)) { String intendedType = (String) headers.get(Stomp.Headers.AMQ_MESSAGE_TYPE); if (intendedType.equalsIgnoreCase("text")) { ActiveMQTextMessage text = new ActiveMQTextMessage(); try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(command.getContent().length + 4); DataOutputStream data = new DataOutputStream(bytes); data.writeInt(command.getContent().length); data.write(command.getContent()); text.setContent(bytes.toByteSequence()); data.close(); } catch (Throwable e) { throw new ProtocolException("Text could not bet set: " + e, false, e); } msg = text; } else if (intendedType.equalsIgnoreCase("bytes")) { ActiveMQBytesMessage byteMessage = new ActiveMQBytesMessage(); byteMessage.writeBytes(command.getContent()); msg = byteMessage; } else { throw new ProtocolException("Unsupported message type '" + intendedType + "'", false); } } else if (headers.containsKey(Stomp.Headers.CONTENT_LENGTH)) { headers.remove(Stomp.Headers.CONTENT_LENGTH); ActiveMQBytesMessage bm = new ActiveMQBytesMessage(); bm.writeBytes(command.getContent()); msg = bm; } else { ActiveMQTextMessage text = new ActiveMQTextMessage(); try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(command.getContent().length + 4); DataOutputStream data = new DataOutputStream(bytes); data.writeInt(command.getContent().length); data.write(command.getContent()); text.setContent(bytes.toByteSequence()); data.close(); } catch (Throwable e) { throw new ProtocolException("Text could not bet set: " + e, false, e); } msg = text; } Helper.copyStandardHeadersFromFrameToMessage(converter, command, msg, this); return msg; }
@Override public ActiveMQMessage convertFrame(ProtocolConverter converter, StompFrame command) throws JMSException, ProtocolException { Map<String, String> headers = command.getHeaders(); ActiveMQMessage msg; String transformation = headers.get(Headers.TRANSFORMATION); if (headers.containsKey(Headers.CONTENT_LENGTH) || transformation.equals(Transformations.JMS_BYTE.toString())) { msg = super.convertFrame(converter, command); } else { HierarchicalStreamReader in; try { String text = new String(command.getContent(), "UTF-8"); switch (Transformations.getValue(transformation)) { case JMS_OBJECT_XML: in = new XppReader(new StringReader(text), XppFactory.createDefaultParser()); msg = createObjectMessage(in); break; case JMS_OBJECT_JSON: in = new JettisonMappedXmlDriver().createReader(new StringReader(text)); msg = createObjectMessage(in); break; case JMS_MAP_XML: in = new XppReader(new StringReader(text), XppFactory.createDefaultParser()); msg = createMapMessage(in); break; case JMS_MAP_JSON: in = new JettisonMappedXmlDriver().createReader(new StringReader(text)); msg = createMapMessage(in); break; default: throw new Exception("Unkown transformation: " + transformation); } } catch (Throwable e) { command.getHeaders().put(Headers.TRANSFORMATION_ERROR, e.getMessage()); msg = super.convertFrame(converter, command); } } copyStandardHeadersFromFrameToMessage(converter, command, msg, this); return msg; }