diff --git a/hapi-base/src/main/java/ca/uhn/hl7v2/parser/DefaultXMLParser.java b/hapi-base/src/main/java/ca/uhn/hl7v2/parser/DefaultXMLParser.java index 463787856..e3fcdb235 100644 --- a/hapi-base/src/main/java/ca/uhn/hl7v2/parser/DefaultXMLParser.java +++ b/hapi-base/src/main/java/ca/uhn/hl7v2/parser/DefaultXMLParser.java @@ -41,6 +41,7 @@ GNU General Public License (the �GPL�), in which case the provisions of the import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.HapiContext; +import ca.uhn.hl7v2.model.GenericMessage; import ca.uhn.hl7v2.model.Group; import ca.uhn.hl7v2.model.Message; import ca.uhn.hl7v2.model.Segment; @@ -106,6 +107,12 @@ public DefaultXMLParser(ModelClassFactory theFactory) { public Document encodeDocument(Message source) throws HL7Exception { String messageClassName = source.getClass().getName(); String messageName = messageClassName.substring(messageClassName.lastIndexOf('.') + 1); + + // Handle GenericMessages which will have an errant $ in their class name. + if (source instanceof GenericMessage) { + messageName = messageName.replaceAll("\\$", ""); + } + try { Document doc = XMLUtils.emptyDocument(messageName); //Element root = doc.createElement(messageName); diff --git a/hapi-test/src/test/java/ca/uhn/hl7v2/parser/XMLParserTest.java b/hapi-test/src/test/java/ca/uhn/hl7v2/parser/XMLParserTest.java index f5c56dcef..8ba188892 100644 --- a/hapi-test/src/test/java/ca/uhn/hl7v2/parser/XMLParserTest.java +++ b/hapi-test/src/test/java/ca/uhn/hl7v2/parser/XMLParserTest.java @@ -15,12 +15,15 @@ import java.io.InputStream; import java.io.InputStreamReader; +import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.w3c.dom.Document; import ca.uhn.hl7v2.HL7Exception; +import ca.uhn.hl7v2.Version; +import ca.uhn.hl7v2.model.GenericMessage; import ca.uhn.hl7v2.model.Message; import ca.uhn.hl7v2.model.Segment; import ca.uhn.hl7v2.model.Type; @@ -31,7 +34,6 @@ import ca.uhn.hl7v2.model.v25.message.OMD_O03; import ca.uhn.hl7v2.model.v25.message.ORU_R01; import ca.uhn.hl7v2.model.v25.segment.OBX; -import ca.uhn.hl7v2.model.v251.message.ERP_R09; import ca.uhn.hl7v2.util.Terser; /** @@ -431,6 +433,35 @@ public void testMessageParseMethodAndEncodeMethodWithEscapes() throws HL7Excepti } + + /** + *

+ * Attempt to parse a {@link ca.uhn.hl7v2.model.GenericMessage}. These objects have `$` in their class name, ex: `GenericMessage$V21`. + * The {@link DefaultXMLParser} will attempt to use the class name when constructing the {@link Document} when encoding. The `$` is + * not a valid character within an element name. + *

+ *

+ * Construct a {@link GenericMessage} for each available version, and call {@link DefaultXMLParser#encode(Message)} on the message. + * We expect that a valid {@link Document} is returned, as the `$` is stripped out. + *

+ */ + @Test + public void test_encode_GenericMessage() throws Exception { + + DefaultXMLParser xmlParser = new DefaultXMLParser(); + + for (Version version : Version.values()) { + + Class c = GenericMessage.getGenericMessageClass(version.getVersion()); + Message m = c.getConstructor(ModelClassFactory.class).newInstance(new GenericModelClassFactory()); + + Document d = xmlParser.encodeDocument(m); + Assert.assertNotNull(d); + Assert.assertEquals("GenericMessage" + version.name(), d.getDocumentElement().getTagName()); + } + } + + private String loadFile(String name) throws IOException { return loadFile(name, '\n'); }