package com.activequant.transport.activemq; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javax.jms.BytesMessage; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.log4j.Logger; import org.json.simple.JSONArray; import org.json.simple.JSONValue; import org.json.simple.parser.JSONParser; import com.activequant.domainmodel.PersistentEntity; import com.activequant.interfaces.transport.IPublisher; import com.activequant.utils.MapToString; class JMSPublisher implements IPublisher { private JSONParser parser = new JSONParser(); private MessageProducer producer; private Session session; private MapToString mapToString = new MapToString(); private Logger log = Logger.getLogger(JMSPublisher.class); private final String channelId; JMSPublisher(Session session, MessageProducer producer, String channelId) { this.producer = producer; this.session = session; this.channelId = channelId; } public void send(Map<String, Object> message) throws Exception { Map<String, Object> mmap = new HashMap<String, Object>(); Iterator<Entry<String, Object>> eit = message.entrySet().iterator(); while (eit.hasNext()) { Entry<String, Object> e = eit.next(); String key = e.getKey(); Object val = e.getValue(); if (val == null) continue; if (!val.getClass().isArray()) { mmap.put(key, val); } else { String simpleName = val.getClass().getSimpleName(); if (simpleName.startsWith("double")) { JSONArray l = new JSONArray(); for (double d : (double[]) val) { l.add(d); } mmap.put(key, l); } else if (simpleName.startsWith("long")) { JSONArray l = new JSONArray(); for (long d : (long[]) val) { l.add(d); } mmap.put(key, l); } else if (simpleName.startsWith("String")) { JSONArray l = new JSONArray(); for (String d : (String[]) val) { l.add(d); } mmap.put(key, l); } } } String text = JSONValue.toJSONString(mmap); if (log.isDebugEnabled()) log.debug("[channelId=" + channelId + "] message: " + text); TextMessage tm = session.createTextMessage(text); tm.setStringProperty("channelId", channelId); producer.send(tm); } @Override public void send(PersistentEntity entity) throws Exception { send(entity.propertyMap()); } public void send(byte[] bytes) throws Exception { BytesMessage bm = session.createBytesMessage(); bm.writeBytes(bytes); bm.setStringProperty("channelId", channelId); producer.send(bm); } }