/*
 * Copyright (c) 2007-2009, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.net4j.internal.jms.util;

import org.eclipse.net4j.internal.jms.BytesMessageImpl;
import org.eclipse.net4j.internal.jms.MapMessageImpl;
import org.eclipse.net4j.internal.jms.MessageImpl;
import org.eclipse.net4j.internal.jms.ObjectMessageImpl;
import org.eclipse.net4j.internal.jms.StreamMessageImpl;
import org.eclipse.net4j.internal.jms.TextMessageImpl;
import org.eclipse.net4j.internal.jms.bundle.OM;
import org.eclipse.net4j.jms.JMSProtocolConstants;
import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
import org.eclipse.net4j.util.om.trace.ContextTracer;

import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;

import java.io.IOException;

public final class MessageUtil
{
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_PROTOCOL, MessageUtil.class);

  private MessageUtil()
  {
  }

  public static byte getType(Message message)
  {
    if (message instanceof BytesMessage)
    {
      return JMSProtocolConstants.MESSAGE_TYPE_BYTES;
    }

    if (message instanceof MapMessage)
    {
      return JMSProtocolConstants.MESSAGE_TYPE_MAP;
    }

    if (message instanceof ObjectMessage)
    {
      return JMSProtocolConstants.MESSAGE_TYPE_OBJECT;
    }

    if (message instanceof StreamMessage)
    {
      return JMSProtocolConstants.MESSAGE_TYPE_STREAM;
    }

    if (message instanceof TextMessage)
    {
      return JMSProtocolConstants.MESSAGE_TYPE_TEXT;
    }

    throw new IllegalArgumentException("message: " + message); //$NON-NLS-1$
  }

  public static String getTypeName(byte type)
  {
    switch (type)
    {
    case JMSProtocolConstants.MESSAGE_TYPE_BYTES:
      return "BYTES_MESSAGE"; //$NON-NLS-1$

    case JMSProtocolConstants.MESSAGE_TYPE_MAP:
      return "MAP_MESSAGE"; //$NON-NLS-1$

    case JMSProtocolConstants.MESSAGE_TYPE_OBJECT:
      return "OBJECT_MESSAGE"; //$NON-NLS-1$

    case JMSProtocolConstants.MESSAGE_TYPE_STREAM:
      return "STREAM_MESSAGE"; //$NON-NLS-1$

    case JMSProtocolConstants.MESSAGE_TYPE_TEXT:
      return "TEXT_MESSAGE"; //$NON-NLS-1$
    }

    throw new IllegalArgumentException("type: " + type); //$NON-NLS-1$
  }

  public static MessageImpl create(byte type)
  {
    switch (type)
    {
    case JMSProtocolConstants.MESSAGE_TYPE_BYTES:
      return new BytesMessageImpl();

    case JMSProtocolConstants.MESSAGE_TYPE_MAP:
      return new MapMessageImpl();

    case JMSProtocolConstants.MESSAGE_TYPE_OBJECT:
      return new ObjectMessageImpl();

    case JMSProtocolConstants.MESSAGE_TYPE_STREAM:
      return new StreamMessageImpl();

    case JMSProtocolConstants.MESSAGE_TYPE_TEXT:
      return new TextMessageImpl();
    }

    throw new IllegalArgumentException("type: " + type); //$NON-NLS-1$
  }

  public static MessageImpl copy(Message source) throws JMSException
  {
    byte type = getType(source);
    MessageImpl result = create(type);
    result.populate(source);
    return result;
  }

  public static MessageImpl convert(Message source) throws JMSException
  {
    if (source instanceof MessageImpl)
    {
      return (MessageImpl)source;
    }

    return copy(source);
  }

  public static void write(ExtendedDataOutputStream out, MessageImpl message) throws IOException
  {
    byte type = getType(message);
    if (TRACER.isEnabled())
    {
      TRACER.format("Writing {0}", getTypeName(type)); //$NON-NLS-1$
    }

    out.writeByte(type);
    message.write(out);
  }

  public static MessageImpl read(ExtendedDataInputStream in) throws IOException
  {
    byte type = in.readByte();
    if (TRACER.isEnabled())
    {
      TRACER.format("Reading {0}", getTypeName(type)); //$NON-NLS-1$
    }

    MessageImpl message = create(type);
    message.read(in);
    return message;
  }
}
