/*
* 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.jms.tests.message;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageFormatException;
import javax.jms.MessageNotWriteableException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class SimpleJMSMapMessage extends SimpleJMSMessage implements MapMessage {
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
protected Map<String, Object> content;
protected boolean bodyReadOnly = false;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
public SimpleJMSMapMessage() {
content = new HashMap<>();
}
// MapMessage implementation -------------------------------------
@Override
public void setBoolean(final String name, final boolean value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, Boolean.valueOf(value));
}
@Override
public void setByte(final String name, final byte value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Byte(value));
}
@Override
public void setShort(final String name, final short value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Short(value));
}
@Override
public void setChar(final String name, final char value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Character(value));
}
@Override
public void setInt(final String name, final int value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Integer(value));
}
@Override
public void setLong(final String name, final long value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Long(value));
}
@Override
public void setFloat(final String name, final float value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Float(value));
}
@Override
public void setDouble(final String name, final double value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, new Double(value));
}
@Override
public void setString(final String name, final String value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, value);
}
@Override
public void setBytes(final String name, final byte[] value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
content.put(name, value.clone());
}
@Override
public void setBytes(final String name, final byte[] value, final int offset, final int length) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
if (offset + length > value.length) {
throw new JMSException("Array is too small");
}
byte[] temp = new byte[length];
System.arraycopy(value, offset, temp, 0, length);
content.put(name, temp);
}
@Override
public void setObject(final String name, final Object value) throws JMSException {
checkName(name);
if (bodyReadOnly) {
throw new MessageNotWriteableException("Message is ReadOnly !");
}
if (value instanceof Boolean) {
content.put(name, value);
} else if (value instanceof Byte) {
content.put(name, value);
} else if (value instanceof Short) {
content.put(name, value);
} else if (value instanceof Character) {
content.put(name, value);
} else if (value instanceof Integer) {
content.put(name, value);
} else if (value instanceof Long) {
content.put(name, value);
} else if (value instanceof Float) {
content.put(name, value);
} else if (value instanceof Double) {
content.put(name, value);
} else if (value instanceof String) {
content.put(name, value);
} else if (value instanceof byte[]) {
content.put(name, ((byte[]) value).clone());
} else {
throw new MessageFormatException("Invalid object type.");
}
}
@Override
public boolean getBoolean(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Boolean.valueOf(null).booleanValue();
}
if (value instanceof Boolean) {
return ((Boolean) value).booleanValue();
} else if (value instanceof String) {
return Boolean.valueOf((String) value).booleanValue();
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public byte getByte(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Byte.parseByte(null);
}
if (value instanceof Byte) {
return ((Byte) value).byteValue();
} else if (value instanceof String) {
return Byte.parseByte((String) value);
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public short getShort(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Short.parseShort(null);
}
if (value instanceof Byte) {
return ((Byte) value).shortValue();
} else if (value instanceof Short) {
return ((Short) value).shortValue();
} else if (value instanceof String) {
return Short.parseShort((String) value);
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public char getChar(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
throw new NullPointerException("Invalid conversion");
}
if (value instanceof Character) {
return ((Character) value).charValue();
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public int getInt(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Integer.parseInt(null);
}
if (value instanceof Byte) {
return ((Byte) value).intValue();
} else if (value instanceof Short) {
return ((Short) value).intValue();
} else if (value instanceof Integer) {
return ((Integer) value).intValue();
} else if (value instanceof String) {
return Integer.parseInt((String) value);
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public long getLong(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Long.parseLong(null);
}
if (value instanceof Byte) {
return ((Byte) value).longValue();
} else if (value instanceof Short) {
return ((Short) value).longValue();
} else if (value instanceof Integer) {
return ((Integer) value).longValue();
} else if (value instanceof Long) {
return ((Long) value).longValue();
} else if (value instanceof String) {
return Long.parseLong((String) value);
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public float getFloat(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Float.parseFloat(null);
}
if (value instanceof Float) {
return ((Float) value).floatValue();
} else if (value instanceof String) {
return Float.parseFloat((String) value);
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public double getDouble(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return Double.parseDouble(null);
}
if (value instanceof Float) {
return ((Float) value).doubleValue();
} else if (value instanceof Double) {
return ((Double) value).doubleValue();
} else if (value instanceof String) {
return Double.parseDouble((String) value);
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public String getString(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return null;
}
if (value instanceof Boolean) {
return ((Boolean) value).toString();
} else if (value instanceof Byte) {
return ((Byte) value).toString();
} else if (value instanceof Short) {
return ((Short) value).toString();
} else if (value instanceof Character) {
return ((Character) value).toString();
} else if (value instanceof Integer) {
return ((Integer) value).toString();
} else if (value instanceof Long) {
return ((Long) value).toString();
} else if (value instanceof Float) {
return ((Float) value).toString();
} else if (value instanceof Double) {
return ((Double) value).toString();
} else if (value instanceof String) {
return (String) value;
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public byte[] getBytes(final String name) throws JMSException {
Object value;
value = content.get(name);
if (value == null) {
return null;
}
if (value instanceof byte[]) {
return (byte[]) value;
} else {
throw new MessageFormatException("Invalid conversion");
}
}
@Override
public Object getObject(final String name) throws JMSException {
return content.get(name);
}
@Override
public Enumeration getMapNames() throws JMSException {
return Collections.enumeration(new HashMap<>(content).keySet());
}
@Override
public boolean itemExists(final String name) throws JMSException {
return content.containsKey(name);
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
/**
* Check the name
*
* @param name the name
*/
private void checkName(final String name) {
if (name == null) {
throw new IllegalArgumentException("Name must not be null.");
}
if (name.equals("")) {
throw new IllegalArgumentException("Name must not be an empty String.");
}
}
// Inner classes -------------------------------------------------
}