package org.wso2.carbon.business.messaging.hl7.common.data.conf; import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.model.*; import ca.uhn.hl7v2.util.Terser; import org.apache.axis2.context.MessageContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.bam.data.publisher.util.PublisherUtil; import org.wso2.carbon.base.ServerConfiguration; import org.wso2.carbon.business.messaging.hl7.common.HL7Constants; import org.wso2.carbon.business.messaging.hl7.common.data.MessageData; import java.util.HashMap; import java.util.Map; /** * This class holds HL7 message extraction operations */ public class HL7MessagePublisherConfig { private static final Log log = LogFactory.getLog(HL7MessagePublisherConfig.class); private static final String NAME = "Name"; private String serverName = null; public HL7MessagePublisherConfig() { } /** * This extracts the incoming HL7 message * @param message * @return MessageData * @throws HL7Exception */ public MessageData createMessage(Message message,MessageContext msgCtx) throws HL7Exception { MessageData messageData = new MessageData(); Map<String, String> extractedValues = createCustomMap(message); messageData.setExtractedValues(extractedValues); messageData.setPayload(message.encode()); messageData.setOpName(msgCtx.getAxisOperation().getName().getLocalPart()); messageData.setServiceName(msgCtx.getAxisService().getName()); messageData.setMsgDirection(HL7Constants.OUT_DIRECTION); messageData.setServerName(getServerName()); Terser terser = new Terser(message); String activityId = terser.get("/MSH-10"); if(activityId !=null){ messageData.setActivityId(activityId); }else{ messageData.setActivityId(String.valueOf(System.nanoTime()) + Math.round(Math.random() * HL7Constants.ACTIVITY_ID_GEN)); } messageData.setStatus((String) msgCtx.getProperty(HL7Constants.HL7_DEFAULT_VALIDATION_PASSED)); messageData.setHost(PublisherUtil.getHostAddress()); messageData.setTimestamp(System.currentTimeMillis()); messageData.setType(HL7Constants.TRANSPORT_NAME); return messageData; } /** * This creates arbitrary data map which contains extracted values of the HL7 message * @param message * @return Map * @throws HL7Exception */ private Map<String, String> createCustomMap(Message message) throws HL7Exception { String[] segments; HashMap<String, String> elements = new HashMap<String, String>(); if (message != null) { segments = message.getNames(); } else { return null; } for (String segmentName : segments) { try { Structure[] structures = message.getAll(segmentName); String keyA = segmentName; for (int y = 0; y < structures.length; y++) { if (y > 0) { keyA = segmentName + "[" + y + "]"; } Structure structure = structures[y]; if (structure instanceof Segment) { Segment segment = (Segment) structure; String[] fieldNames = segment.getNames(); for (int i = 1; i < segment.numFields(); i++) { Type[] fields = segment.getField(i); for (int x = 0; x < fields.length; x++) { String value = null; String keyB = keyA + "." + fieldNames[i - 1].replaceAll("\\s+", ""); if (x > 0) { keyB = keyA + "." + fieldNames[i - 1].replaceAll("\\s+", "") + "[" + x + "]"; } Type field = fields[x]; if (field instanceof Composite) { evaluateComposite((Composite) field, elements, keyB); } else if (field instanceof Varies) { value = ((GenericPrimitive) ((Varies) field).getData()).getValue(); } else { value = ((Primitive) field).getValue(); } if (value != null) { elements.put(keyB, value); } } } } } } catch (HL7Exception e) { throw new HL7Exception("Error creating publisher message : " + e.getMessage(), e); } } return elements; } /** * This extracts the Composite * @param composite * @param elements * @param key */ private void evaluateComposite(Composite composite, Map<String, String> elements, String key) { Type[] types = composite.getComponents(); for (int z = 0; z < types.length; z++) { Type type= types[z]; String value = null; String keyC = key; if (z> 0) { keyC = key + "[" + z + "]"; } if (type instanceof Composite) { evaluateComposite((Composite) type, elements, keyC); } else if (type instanceof Varies) { value = ((GenericPrimitive) ((Varies) type).getData()).getValue(); } else { value = ((Primitive) type).getValue(); } if (value != null) { elements.put(keyC, value); } } } public String getServerName() { if (serverName == null) { String[] properties = ServerConfiguration.getInstance().getProperties(NAME); if (properties != null && properties.length > 0) { serverName = properties[0]; } } return serverName; } }