001    package ca.uhn.hl7v2.llp;
002    
003    import static ca.uhn.hl7v2.llp.MinLLPReader.END_MESSAGE;
004    import static ca.uhn.hl7v2.llp.MinLLPReader.LAST_CHARACTER;
005    import static ca.uhn.hl7v2.llp.MinLLPReader.START_MESSAGE;
006    
007    import java.io.IOException;
008    import java.io.OutputStream;
009    import java.io.OutputStreamWriter;
010    import java.nio.charset.Charset;
011    
012    import org.slf4j.Logger;
013    import org.slf4j.LoggerFactory;
014    
015    import ca.uhn.hl7v2.HL7Exception;
016    import ca.uhn.hl7v2.parser.EncodingNotSupportedException;
017    import ca.uhn.hl7v2.preparser.PreParser;
018    
019    /**
020     * MLLP writer which uses the charset from the message being transmitted
021     */
022    public class ExtendedMinLLPWriter implements HL7Writer {
023    
024            private static final Logger ourLog = LoggerFactory.getLogger(ExtendedMinLLPWriter.class);
025            private OutputStream myOutputStream;
026    
027            public ExtendedMinLLPWriter(OutputStream theOut) {
028                    myOutputStream = theOut;
029            }
030    
031            /**
032             * {@inheritDoc}
033             */
034            public synchronized void writeMessage(String theMessage) throws LLPException, IOException {
035                    Charset javaCs;
036                    String[] fields;
037                    try {
038                            fields = PreParser.getFields(theMessage, "MSH-18(0)");
039                            String charset = fields[0];
040                            try {
041                                    javaCs = CharSetUtil.convertHL7CharacterEncodingToCharSetvalue(charset);
042                            } catch (EncodingNotSupportedException e) {
043                                    ourLog.warn("Nonvalid charset \"" + charset + "\"- defaulting to US-ASCII", e);
044                                    javaCs = Charset.forName("US-ASCII");
045                            }
046                    } catch (HL7Exception e1) {
047                            ourLog.warn("Could not detect charset - defaulting to US-ASCII", e1);
048                            javaCs = Charset.forName("US-ASCII");
049                    }
050    
051                    OutputStreamWriter writer = new OutputStreamWriter(myOutputStream, javaCs);
052                    
053    //              writer.write(START_MESSAGE);
054    //              writer.append(theMessage);
055    //              writer.write(END_MESSAGE);
056    //              writer.write(LAST_CHARACTER);
057    //              writer.flush();
058    
059                    myOutputStream.write(START_MESSAGE);
060                    myOutputStream.flush();
061                    
062                    writer.append(theMessage);
063                    writer.flush();
064                    
065                    myOutputStream.write(END_MESSAGE);
066                    myOutputStream.write(LAST_CHARACTER);
067                    myOutputStream.flush();
068                    
069            }
070    
071            /**
072             * {@inheritDoc}
073             */
074            public synchronized void setOutputStream(OutputStream theOut) throws IOException {
075                    myOutputStream = theOut;
076            }
077    
078            /**
079             * {@inheritDoc}
080             */
081            public synchronized void close() throws IOException {
082                    myOutputStream.close();
083            }
084    
085    }