public static HL7Message makeACK(HL7Segment msh, String ackCode, String text) { int size = msh.size(); HL7Segment ackmsh = HL7Segment.makeMSH(size, msh.getFieldSeparator(), msh.getEncodingCharacters()); ackmsh.setField(2, msh.getField(4, null)); ackmsh.setField(3, msh.getField(5, null)); ackmsh.setField(4, msh.getField(2, null)); ackmsh.setField(5, msh.getField(3, null)); ackmsh.setField(8, "ACK^" + msh.getMessageType().substring(4,7) + "^ACK"); for (int i = 10; i < size; i++) ackmsh.setField(i, msh.getField(i, null)); HL7Segment msa = new HL7Segment(4, msh.getFieldSeparator(), msh.getEncodingCharacters()); msa.setField(0, "MSA"); msa.setField(1, ackCode); msa.setField(2, msh.getMessageControlID()); msa.setField(3, text != null && text.length() > 80 ? text.substring(0, 80) : text); HL7Message ack = new HL7Message(2); ack.add(ackmsh); ack.add(msa); return ack; }
public static HL7Segment parseMSH(byte[] b, int size) { return parseMSH(b, size, new ParsePosition(0)); }
public static HL7Segment makeMSH(int size, char fieldSeparator, String encodingCharacters) { HL7Segment msh = new HL7Segment(size, fieldSeparator, encodingCharacters); msh.setField(0, "MSH"); msh.setField(1, encodingCharacters); msh.setField(6, timeStamp(new Date())); msh.setField(9, nextMessageControlID()); msh.setField(10, "P"); msh.setField(11, "2.5"); return msh; } }
static HL7Segment parse(byte[] b, int size, ParsePosition pos, char fieldSeparator, String encodingCharacters, String charsetName) { String s = parse(b, size, pos, charsetName); return s != null ? new HL7Segment(s, fieldSeparator, encodingCharacters) : null; }
public static HL7Message parse(byte[] b, int size, String defCharset) { ParsePosition pos = new ParsePosition(0); HL7Message msg = new HL7Message(); HL7Segment seg = HL7Segment.parseMSH(b, size, pos); char fieldSeparator = seg.getFieldSeparator(); String encodingCharacters = seg.getEncodingCharacters(); String charsetName = HL7Charset.toCharsetName(seg.getField(17, defCharset)); msg.add(seg); while ((seg = HL7Segment.parse( b, size, pos, fieldSeparator, encodingCharacters, charsetName)) != null) msg.add(seg); msg.trimToSize(); return msg; }
public static HL7Message makePixQuery(String pid, String... domains) { HL7Segment msh = HL7Segment.makeMSH(); msh.setField(8, "QBP^Q23^QBP_Q21"); HL7Segment qpd = new HL7Segment(5); qpd.setField(0, "QPD"); qpd.setField(1, "IHE PIX Query"); qpd.setField(2, "QRY" + msh.getField(9, "")); qpd.setField(3, pid); qpd.setField(4, HL7Segment.concat(domains, '~')); HL7Segment rcp = new HL7Segment(8); rcp.setField(0, "RCP"); rcp.setField(1, "I"); HL7Message qbp = new HL7Message(3); qbp.add(msh); qbp.add(qpd); qbp.add(rcp); return qbp; }
private byte[] xslt(UnparsedHL7Message msg) throws Exception { String charsetName = HL7Charset.toCharsetName(msg.msh().getField(17, charset)); ByteArrayOutputStream out = new ByteArrayOutputStream(); TransformerHandler th = factory.newTransformerHandler(tpls); Transformer t = th.getTransformer(); t.setParameter("MessageControlID", HL7Segment.nextMessageControlID()); t.setParameter("DateTimeOfMessage", HL7Segment.timeStamp(new Date())); if (xsltParams != null) for (int i = 1; i < xsltParams.length; i++, i++) t.setParameter(xsltParams[i-1], xsltParams[i]); th.setResult(new SAXResult(new HL7ContentHandler( new OutputStreamWriter(out, charsetName)))); new HL7Parser(th).parse(new InputStreamReader( new ByteArrayInputStream(msg.data()), charsetName)); return out.toByteArray(); }
private UnparsedHL7Message onMessage(UnparsedHL7Message msg) throws Exception { if (storageDir != null) storeToFile(msg.data(), new File( new File(storageDir, msg.msh().getMessageType()), msg.msh().getField(9, "_NULL_"))); return new UnparsedHL7Message(tpls == null ? HL7Message.makeACK(msg.msh(), HL7Exception.AA, null).getBytes(null) : xslt(msg)); }
public void parse(InputStream is) throws IOException, TransformerConfigurationException, SAXException { byte[] buf = new byte[256]; int len = is.read(buf); HL7Segment msh = HL7Segment.parseMSH(buf, buf.length); String charsetName = HL7Charset.toCharsetName(msh.getField(17, charset)); Reader reader = new InputStreamReader( new SequenceInputStream( new ByteArrayInputStream(buf, 0, len), is), charsetName); TransformerHandler th = getTransformerHandler(); th.getTransformer().setOutputProperty(OutputKeys.INDENT, indent ? "yes" : "no"); th.setResult(new StreamResult(System.out)); HL7Parser hl7Parser = new HL7Parser(th); hl7Parser.setIncludeNamespaceDeclaration(includeNamespaceDeclaration); hl7Parser.parse(reader); }
public String toString(char segdelim) { int len = size(); for (HL7Segment seg : this) { int segSize = seg.size(); len += segSize - 1; for (int i = 0; i < segSize; i++) { String s = seg.getField(i, null); if (s != null) len += s.length(); } } char[] cs = new char[len]; int off = 0; for (HL7Segment seg : this) { char delim = seg.getFieldSeparator(); int segSize = seg.size(); for (int i = 0; i < segSize; i++) { String s = seg.getField(i, null); if (s != null) { int l = s.length(); s.getChars(0, l, cs, off); off += l; } cs[off++] = delim; } cs[off-1] = segdelim; } return new String(cs); }
public void query(String pid, String[] domains) throws IOException { HL7Message qbp = HL7Message.makePixQuery(pid, domains); HL7Segment msh = qbp.get(0); msh.setSendingApplicationWithFacility(sendingApplication); msh.setReceivingApplicationWithFacility(receivingApplication); msh.setField(17, charset); mllp.writeMessage(qbp.getBytes(charset)); if (mllp.readMessage() == null) throw new IOException("Connection closed by receiver"); } }
public String getMessageType() { String s = getField(8, "").replace(getComponentSeparator(), '^'); int end = s.indexOf('^', s.indexOf('^') + 1); return end > 0 ? s.substring(0, end) : s; }
public HL7Segment(String s, char fieldSeparator, String encodingCharacters) { this.fieldSeparator = fieldSeparator; this.encodingCharacters = encodingCharacters; this.fields = split(s, fieldSeparator); }
UnparsedHL7Message onMessage(Connection conn, Socket s, UnparsedHL7Message msg) throws HL7Exception { HL7Segment msh = msg.msh(); if (!(isInstalled() && conns.contains(conn))) throw new HL7Exception( new ERRSegment(msh) .setHL7ErrorCode(ERRSegment.TableValueNotFound) .setErrorLocation(ERRSegment.UnknownReceivingApplication) .setUserMessage("Receiving Application not recognized")); if (!(acceptedSendingApplications.isEmpty() || acceptedSendingApplications.contains(msh.getSendingApplicationWithFacility()))) throw new HL7Exception( new ERRSegment(msh) .setHL7ErrorCode(ERRSegment.TableValueNotFound) .setErrorLocation(ERRSegment.UnknownSendingApplication) .setUserMessage("Sending Application not recognized")); String messageType = msh.getMessageType(); if (!(acceptedMessageTypes.contains("*") || acceptedMessageTypes.contains(messageType))) throw new HL7Exception( new ERRSegment(msh) .setHL7ErrorCode(unsupportedMessageTypeOrEventCode(messageType.substring(0,3))) .setUserMessage("Message Type not supported")); HL7MessageListener listener = getHL7MessageListener(); if (listener == null) throw new HL7Exception(new ERRSegment(msh) .setHL7ErrorCode(ERRSegment.ApplicationInternalError) .setUserMessage("No HL7 Message Listener configured")); return listener.onMessage(this, conn, s, msg); }
@Override public UnparsedHL7Message onMessage(HL7Application hl7App, Connection conn, Socket s, UnparsedHL7Message msg) throws HL7Exception { HL7MessageListener listener = listeners.get(msg.msh().getMessageType()); if (listener == null) { listener = listeners.get("*"); if (listener == null) return super.onMessage(hl7App, conn, s, msg); } return listener.onMessage(hl7App, conn, s, msg); }
public String toString() { return concat(fields, fieldSeparator); }
private byte[] xslt(UnparsedHL7Message msg) throws Exception { String charsetName = HL7Charset.toCharsetName(msg.msh().getField(17, charset)); ByteArrayOutputStream out = new ByteArrayOutputStream(); TransformerHandler th = factory.newTransformerHandler(tpls); Transformer t = th.getTransformer(); t.setParameter("MessageControlID", HL7Segment.nextMessageControlID()); t.setParameter("DateTimeOfMessage", HL7Segment.timeStamp(new Date())); if (xsltParams != null) for (int i = 1; i < xsltParams.length; i++, i++) t.setParameter(xsltParams[i-1], xsltParams[i]); th.setResult(new SAXResult(new HL7ContentHandler( new OutputStreamWriter(out, charsetName)))); new HL7Parser(th).parse(new InputStreamReader( new ByteArrayInputStream(msg.data()), charsetName)); return out.toByteArray(); }
private UnparsedHL7Message onMessage(UnparsedHL7Message msg) throws Exception { if (storageDir != null) storeToFile(msg.data(), new File( new File(storageDir, msg.msh().getMessageType()), msg.msh().getField(9, "_NULL_"))); return new UnparsedHL7Message(tpls == null ? HL7Message.makeACK(msg.msh(), HL7Exception.AA, null).getBytes(null) : xslt(msg)); }