/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.activemq.artemis.ra;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import java.util.Arrays;
import java.util.Enumeration;

/**
 * A wrapper for a message
 */
public class ActiveMQRAMessage implements Message {

   /**
    * Whether trace is enabled
    */
   private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled();

   /**
    * The message
    */
   protected Message message;

   /**
    * The session
    */
   protected ActiveMQRASession session;

   /**
    * Create a new wrapper
    *
    * @param message the message
    * @param session the session
    */
   public ActiveMQRAMessage(final Message message, final ActiveMQRASession session) {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("constructor(" + message + ", " + session + ")");
      }

      this.message = message;
      this.session = session;
   }

   /**
    * Acknowledge
    *
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void acknowledge() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("acknowledge()");
      }

      session.getSession(); // Check for closed
      message.acknowledge();
   }

   /**
    * Clear body
    *
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void clearBody() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("clearBody()");
      }

      message.clearBody();
   }

   /**
    * Clear properties
    *
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void clearProperties() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("clearProperties()");
      }

      message.clearProperties();
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public boolean getBooleanProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getBooleanProperty(" + name + ")");
      }

      return message.getBooleanProperty(name);
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public byte getByteProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getByteProperty(" + name + ")");
      }

      return message.getByteProperty(name);
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public double getDoubleProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getDoubleProperty(" + name + ")");
      }

      return message.getDoubleProperty(name);
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public float getFloatProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getFloatProperty(" + name + ")");
      }

      return message.getFloatProperty(name);
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public int getIntProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getIntProperty(" + name + ")");
      }

      return message.getIntProperty(name);
   }

   /**
    * Get correlation id
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public String getJMSCorrelationID() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSCorrelationID()");
      }

      return message.getJMSCorrelationID();
   }

   /**
    * Get correlation id
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public byte[] getJMSCorrelationIDAsBytes() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSCorrelationIDAsBytes()");
      }

      return message.getJMSCorrelationIDAsBytes();
   }

   /**
    * Get delivery mode
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public int getJMSDeliveryMode() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSDeliveryMode()");
      }

      return message.getJMSDeliveryMode();
   }

   /**
    * Get destination
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public Destination getJMSDestination() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSDestination()");
      }

      return message.getJMSDestination();
   }

   /**
    * Get expiration
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public long getJMSExpiration() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSExpiration()");
      }

      return message.getJMSExpiration();
   }

   /**
    * Get message id
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public String getJMSMessageID() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSMessageID()");
      }

      return message.getJMSMessageID();
   }

   /**
    * Get priority
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public int getJMSPriority() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSPriority()");
      }

      return message.getJMSPriority();
   }

   /**
    * Get redelivered status
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public boolean getJMSRedelivered() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSRedelivered()");
      }

      return message.getJMSRedelivered();
   }

   /**
    * Get reply to destination
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public Destination getJMSReplyTo() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSReplyTo()");
      }

      return message.getJMSReplyTo();
   }

   /**
    * Get timestamp
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public long getJMSTimestamp() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSTimestamp()");
      }

      return message.getJMSTimestamp();
   }

   /**
    * Get type
    *
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public String getJMSType() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSType()");
      }

      return message.getJMSType();
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public long getLongProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getLongProperty(" + name + ")");
      }

      return message.getLongProperty(name);
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public Object getObjectProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getObjectProperty(" + name + ")");
      }

      return message.getObjectProperty(name);
   }

   /**
    * Get property names
    *
    * @return The values
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public Enumeration getPropertyNames() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getPropertyNames()");
      }

      return message.getPropertyNames();
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public short getShortProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getShortProperty(" + name + ")");
      }

      return message.getShortProperty(name);
   }

   /**
    * Get property
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public String getStringProperty(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getStringProperty(" + name + ")");
      }

      return message.getStringProperty(name);
   }

   /**
    * Do property exist
    *
    * @param name The name
    * @return The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public boolean propertyExists(final String name) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("propertyExists(" + name + ")");
      }

      return message.propertyExists(name);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setBooleanProperty(final String name, final boolean value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setBooleanProperty(" + name + ", " + value + ")");
      }

      message.setBooleanProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setByteProperty(final String name, final byte value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setByteProperty(" + name + ", " + value + ")");
      }

      message.setByteProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setDoubleProperty(final String name, final double value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setDoubleProperty(" + name + ", " + value + ")");
      }

      message.setDoubleProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setFloatProperty(final String name, final float value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setFloatProperty(" + name + ", " + value + ")");
      }

      message.setFloatProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setIntProperty(final String name, final int value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setIntProperty(" + name + ", " + value + ")");
      }

      message.setIntProperty(name, value);
   }

   /**
    * Set correlation id
    *
    * @param correlationID The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSCorrelationID(final String correlationID) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSCorrelationID(" + correlationID + ")");
      }

      message.setJMSCorrelationID(correlationID);
   }

   /**
    * Set correlation id
    *
    * @param correlationID The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSCorrelationIDAsBytes(final byte[] correlationID) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSCorrelationIDAsBytes(" + Arrays.toString(correlationID) + ")");
      }

      message.setJMSCorrelationIDAsBytes(correlationID);
   }

   /**
    * Set delivery mode
    *
    * @param deliveryMode The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSDeliveryMode(final int deliveryMode) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSDeliveryMode(" + deliveryMode + ")");
      }

      message.setJMSDeliveryMode(deliveryMode);
   }

   /**
    * Set destination
    *
    * @param destination The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSDestination(final Destination destination) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSDestination(" + destination + ")");
      }

      message.setJMSDestination(destination);
   }

   /**
    * Set expiration
    *
    * @param expiration The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSExpiration(final long expiration) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSExpiration(" + expiration + ")");
      }

      message.setJMSExpiration(expiration);
   }

   /**
    * Set message id
    *
    * @param id The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSMessageID(final String id) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSMessageID(" + id + ")");
      }

      message.setJMSMessageID(id);
   }

   /**
    * Set priority
    *
    * @param priority The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSPriority(final int priority) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSPriority(" + priority + ")");
      }

      message.setJMSPriority(priority);
   }

   /**
    * Set redelivered status
    *
    * @param redelivered The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSRedelivered(final boolean redelivered) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSRedelivered(" + redelivered + ")");
      }

      message.setJMSRedelivered(redelivered);
   }

   /**
    * Set reply to
    *
    * @param replyTo The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSReplyTo(final Destination replyTo) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSReplyTo(" + replyTo + ")");
      }

      message.setJMSReplyTo(replyTo);
   }

   /**
    * Set timestamp
    *
    * @param timestamp The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSTimestamp(final long timestamp) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSTimestamp(" + timestamp + ")");
      }

      message.setJMSTimestamp(timestamp);
   }

   /**
    * Set type
    *
    * @param type The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setJMSType(final String type) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSType(" + type + ")");
      }

      message.setJMSType(type);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setLongProperty(final String name, final long value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setLongProperty(" + name + ", " + value + ")");
      }

      message.setLongProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setObjectProperty(final String name, final Object value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setObjectProperty(" + name + ", " + value + ")");
      }

      message.setObjectProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setShortProperty(final String name, final short value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setShortProperty(" + name + ", " + value + ")");
      }

      message.setShortProperty(name, value);
   }

   /**
    * Set property
    *
    * @param name  The name
    * @param value The value
    * @throws JMSException Thrown if an error occurs
    */
   @Override
   public void setStringProperty(final String name, final String value) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setStringProperty(" + name + ", " + value + ")");
      }

      message.setStringProperty(name, value);
   }

   @Override
   public long getJMSDeliveryTime() throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getJMSDeliveryTime()");
      }
      return message.getJMSDeliveryTime();
   }

   @Override
   public void setJMSDeliveryTime(long deliveryTime) throws JMSException {

      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("setJMSDeliveryTime(" + deliveryTime + ")");
      }
      message.setJMSDeliveryTime(deliveryTime);
   }

   @Override
   public <T> T getBody(Class<T> c) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("getBody(" + c + ")");
      }
      return message.getBody(c);
   }

   @Override
   public boolean isBodyAssignableTo(Class c) throws JMSException {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("isBodyAssignableTo(" + c + ")");
      }
      return message.isBodyAssignableTo(c);
   }

   /**
    * Return the hash code
    *
    * @return The hash code
    */
   @Override
   public int hashCode() {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("hashCode()");
      }

      return message.hashCode();
   }

   /**
    * Check for equality
    *
    * @param object The other object
    * @return True / false
    */
   @Override
   public boolean equals(final Object object) {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("equals(" + object + ")");
      }

      if (object != null && object instanceof ActiveMQRAMessage) {
         return message.equals(((ActiveMQRAMessage) object).message);
      }
      else {
         return message.equals(object);
      }
   }

   /**
    * Return string representation
    *
    * @return The string
    */
   @Override
   public String toString() {
      if (ActiveMQRAMessage.trace) {
         ActiveMQRALogger.LOGGER.trace("toString()");
      }

      return message.toString();
   }
}
