org.addsimplicity.anicetus.io.jms.JsonMessageConverter.java Source code

Java tutorial

Introduction

Here is the source code for org.addsimplicity.anicetus.io.jms.JsonMessageConverter.java

Source

/**
 * Copyright 2008-2009 Dan Pritchett
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * 
 */
package org.addsimplicity.anicetus.io.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.addsimplicity.anicetus.entity.ExecInfoFields;
import org.addsimplicity.anicetus.entity.GlobalInfo;
import org.addsimplicity.anicetus.entity.GlobalInfoFields;
import org.addsimplicity.anicetus.io.JsonDecoder;
import org.addsimplicity.anicetus.io.JsonEncoder;
import org.addsimplicity.anicetus.io.TelemetryDecoder;
import org.addsimplicity.anicetus.io.TelemetryEncoder;
import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;

/**
 * The JSON message converter translates a telemetry artifact to a JMS text
 * message with the payload formatted as a JSON string. The full object graph is
 * translated to JSON. In addition, JMS headers are set from the telemetry
 * artifact. The headers set are:
 * 
 * JMSCorrelationID - Telemetry entity identifier.
 * 
 * ReportingNode - The reporting host.
 * 
 * OperationName - Set if present.
 * 
 * Status - Set if present.
 * 
 * @author Dan Pritchett (driveawedge@yahoo.com)
 * 
 */
public class JsonMessageConverter implements MessageConverter {
    private TelemetryEncoder m_translator = new JsonEncoder();
    private TelemetryDecoder m_decoder = new JsonDecoder();

    /**
     * Convert a JMS text message with a JSON payload to a telemetry artifact.
     * 
     * @param msg
     *          The JMS text message.
     * @return the telemetry artifact.
     * @see org.springframework.jms.support.converter.MessageConverter#fromMessage(javax.jms.Message)
     */
    public Object fromMessage(Message msg) throws JMSException, MessageConversionException {
        if (msg instanceof TextMessage) {
            return m_decoder.decode(((TextMessage) msg).getText().toCharArray());
        } else {
            throw new JMSException(
                    "Message of type " + msg.getClass().getName() + " is not supported. Only TextMessage");
        }

    }

    /**
     * Get the current decoder.
     * 
     * @return the current decoder.
     */
    public TelemetryDecoder getDecoder() {
        return m_decoder;
    }

    /**
     * Get the current encoder.
     * 
     * @return the telemetry encoder.
     */
    public TelemetryEncoder getEncoder() {
        return m_translator;
    }

    /**
     * Set the decoder. By default the JsonDecoder is used.
     * 
     * @param decoder
     *          The decoder to use for decoding messages.
     */
    public void setDecoder(TelemetryDecoder decoder) {
        m_decoder = decoder;
    }

    /**
     * Set the telmetry encoder. By default the JsonEncoder is used.
     * 
     * @param translator
     *          The encoder.
     */
    public void setEncoder(TelemetryEncoder translator) {
        m_translator = translator;
    }

    /**
     * Translate the telemetry to a JMS message. A JMS text message is used to
     * contain the translated payload.
     * 
     * @param obj
     *          The telemetry artifact.
     * @param jsmSess
     *          The JMS session.
     * @return a text message containing the translated payload.
     * 
     * @see org.springframework.jms.support.converter.MessageConverter#toMessage(java.lang.Object,
     *      javax.jms.Session)
     */
    public Message toMessage(Object obj, Session jmsSess) throws JMSException, MessageConversionException {
        TextMessage m = jmsSess.createTextMessage();

        GlobalInfo telemetry = (GlobalInfo) obj;
        m.setJMSCorrelationID(telemetry.getEntityId().toString());
        m.setStringProperty(GlobalInfoFields.ReportingNode.name(), telemetry.getReportingNode());

        if (telemetry.containsKey(ExecInfoFields.OperationName.name())) {
            m.setStringProperty(ExecInfoFields.OperationName.name(),
                    (String) telemetry.get(ExecInfoFields.OperationName.name()));
        }

        if (telemetry.containsKey(ExecInfoFields.Status.name())) {
            m.setStringProperty(ExecInfoFields.Status.name(),
                    telemetry.get(ExecInfoFields.Status.name()).toString());
        }

        char[] body = m_translator.encode(telemetry);

        m.setText(new String(body));

        return m;
    }

}