package org.apache.synapse.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import org.apache.axiom.attachments.ByteArrayDataSource;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMText;
public class SimpleMapImpl extends HashMap implements SimpleMap {
private static final OMNamespace attrNS = OMAbstractFactory.getOMFactory().createOMNamespace("", "");
private static final String TYPE = "type";
private static final String NAME = "name";
private static final String ENTRY = "entry";
private static final String SHORT = "short";
private static final String LONG = "long";
private static final String DOUBLE = "double";
private static final String INTEGER = "int";
private static final String FLOAT = "float";
private static final String BYTEARRAY = "byte[]";
private static final String BYTE = "byte";
private static final String STRING = "string";
private static final String BOOLEAN = "boolean";
private static final String CHAR = "char";
private static final long serialVersionUID = 1L;
public SimpleMapImpl() {
super();
}
public Object get(String name) {
return this.get((Object) name);
}
public boolean getBoolean(String name) {
Object o = this.get((Object) name);
if (o instanceof Boolean) {
return (Boolean) o;
} else {
throw new RuntimeException("getBoolean(" + name + "): "
+ o.getClass().getName() + " is not an instance of Boolean");
}
}
public byte getByte(String name) {
Object o = this.get((Object) name);
if (o instanceof Byte) {
return (Byte) o;
} else {
throw new RuntimeException("getByte(" + name + "): "
+ o.getClass().getName() + " is not an instance of Byte");
}
}
public byte[] getBytes(String name) {
Object o = this.get((Object) name);
if (o instanceof byte[]) {
return (byte[]) o;
} else {
throw new RuntimeException("getByteArray(" + name + "): "
+ o.getClass().getName() + " is not an instance of byte[]");
}
}
public char getChar(String name) {
Object o = this.get((Object) name);
if (o instanceof Character) {
return (Character) o;
} else {
throw new RuntimeException("getChar(" + name + "): "
+ o.getClass().getName()
+ " is not an instance of Character");
}
}
public double getDouble(String name) {
Object o = this.get((Object) name);
if (o instanceof Double) {
return (Double) o;
} else {
throw new RuntimeException("getDouble(" + name + "): "
+ o.getClass().getName() + " is not an instance of Double");
}
}
public float getFloat(String name) {
Object o = this.get((Object) name);
if (o instanceof Float) {
return (Float) o;
} else {
throw new RuntimeException("getFloat(" + name + "): "
+ o.getClass().getName() + " is not an instance of Float");
}
}
public int getInt(String name) {
Object o = this.get((Object) name);
if (o instanceof Integer) {
return (Integer) o;
} else {
throw new RuntimeException("getInt(" + name + "): "
+ o.getClass().getName() + " is not an instance of Integer");
}
}
public long getLong(String name) {
Object o = this.get((Object) name);
if (o instanceof Long) {
return (Long) o;
} else {
throw new RuntimeException("getLong(" + name + "): "
+ o.getClass().getName() + " is not an instance of Long");
}
}
public short getShort(String name) {
Object o = this.get((Object) name);
if (o instanceof Short) {
return (Short) o;
} else {
throw new RuntimeException("getShort(" + name + "): "
+ o.getClass().getName() + " is not an instance of Short");
}
}
public String getString(String name) {
Object o = this.get((Object) name);
if (o instanceof String) {
return ((String) o);
} else {
throw new RuntimeException("getString(" + name + "): "
+ o.getClass().getName() + " is not an instance of String");
}
}
public void put(String name, Object value) {
this.put((Object) name, value);
}
public void putBoolean(String name, boolean b) {
this.put((Object) name, b);
}
public void putByte(String name, byte b) {
this.put((Object) name, b);
}
public void putBytes(String name, byte[] bytes) {
this.put((Object) name, bytes);
}
public void putChar(String name, char c) {
this.put((Object) name, c);
}
public void putDouble(String name, double d) {
this.put((Object) name, d);
}
public void putFloat(String name, float fl) {
this.put((Object) name, fl);
}
public void putInt(String name, int i) {
this.put((Object) name, i);
}
public void putLong(String name, long l) {
this.put((Object) name, l);
}
public void putShort(String name, short s) {
this.put((Object) name, s);
}
public void putString(String name, String value) {
this.put((Object) name, value);
}
public OMElement getOMElement() {
return getOMElement(OMAbstractFactory.getOMFactory());
}
public OMElement getOMElement(OMFactory fac) {
OMElement mapElement = fac.createOMElement(PayloadHelper.MAPELT);
for (Object entryObj : this.entrySet()) {
Object key = ((Map.Entry) entryObj).getKey();
Object o = ((Map.Entry) entryObj).getValue();
if (key instanceof String) {
OMElement entry = fac.createOMElement(new QName(
PayloadHelper.AXIOMPAYLOADNS, ENTRY), mapElement);
entry.addAttribute(NAME, (String) key, attrNS);
if (o instanceof Character) {
entry.addAttribute(TYPE, CHAR, attrNS);
entry.setText(o.toString());
} else if (o instanceof Boolean) {
entry.addAttribute(TYPE, BOOLEAN, attrNS);
entry.setText(o.toString());
} else if (o instanceof String) {
entry.addAttribute(TYPE, STRING, attrNS);
entry.setText(o.toString());
} else if (o instanceof Byte) {
entry.addAttribute(TYPE, BYTE, attrNS);
entry.setText(o.toString());
} else if (o instanceof byte[]) {
entry.addAttribute(TYPE, BYTEARRAY, attrNS);
OMText text = fac.createOMText(new DataHandler(
new ByteArrayDataSource((byte[]) o)), true);
entry.addChild(text);
} else if (o instanceof Float) {
entry.addAttribute(TYPE, FLOAT, attrNS);
entry.setText(o.toString());
} else if (o instanceof Double) {
entry.addAttribute(TYPE, DOUBLE, attrNS);
entry.setText(o.toString());
} else if (o instanceof Long) {
entry.addAttribute(TYPE, LONG, attrNS);
entry.setText(o.toString());
} else if (o instanceof Short) {
entry.addAttribute(TYPE, SHORT, attrNS);
entry.setText(o.toString());
} else if (o instanceof Integer) {
entry.addAttribute(TYPE, INTEGER, attrNS);
entry.setText(o.toString());
}
} else {
// shouldn't be any non-string keys. Ignore!
}
}
return mapElement;
}
// create an instance from an OMElement (if its the right shape!!!)
public SimpleMapImpl(OMElement el) {
super();
if (el.getQName().equals(PayloadHelper.MAPELT)) {
for (Iterator it = el.getChildElements(); it.hasNext(); ) {
OMElement child = (OMElement)it.next();
if (child.getLocalName().equals(ENTRY)) {
String name = child.getAttributeValue(new QName("",NAME));
String type = child.getAttributeValue(new QName("", TYPE));
if (type == null || name == null) {
//bad!
continue;
}
OMNode data = child.getFirstOMChild();
if (data.getType() != OMNode.TEXT_NODE) {
continue; // BAD!
}
OMText text = (OMText)data;
if (type.equals(INTEGER)) {
this.put(name, new Integer(text.getText()));
} else if (type.equals(CHAR)) {
this.put(name, (text.getText().charAt(0)));
} else if (type.equals(DOUBLE)) {
this.put(name, new Double(text.getText()));
} else if (type.equals(FLOAT)) {
this.put(name, new Float(text.getText()));
} else if (type.equals(BYTE)) {
this.put(name, text.getText().getBytes()[0]);
} else if (type.equals(SHORT)) {
this.put(name, new Short(text.getText()));
} else if (type.equals(LONG)) {
this.put(name, new Long(text.getText()));
} else if (type.equals(STRING)) {
this.put(name, text.getText());
} else if (type.equals(BYTEARRAY)) {
DataHandler dh = (DataHandler) text.getDataHandler();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
dh.writeTo(baos);
this.put(name, baos.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}