public class DefaultModelClassFactory extends AbstractModelClassFactory
DEFAULT_EVENT_MAP_DIRECTORY
Constructor and Description |
---|
DefaultModelClassFactory() |
Modifier and Type | Method and Description |
---|---|
Class<? extends Group> |
getGroupClass(String theName,
String theVersion) |
static String |
getHighestKnownVersion()
Returns a string containing the highest known version of HL7 known to HAPI (i.e.
|
Class<? extends Message> |
getMessageClass(String theName,
String theVersion,
boolean isExplicit)
Attempts to return the message class corresponding to the given name, by
searching through default and user-defined (as per packageList()) packages.
|
Class<? extends Message> |
getMessageClassInASpecificPackage(String theName,
String theVersion,
boolean isExplicit,
String packageName)
Retrieves and instantiates a message class by looking in a specific java package for the
message type.
|
String |
getMessageStructureForEvent(String name,
Version version)
Returns the event structure.
|
Class<? extends Segment> |
getSegmentClass(String theName,
String theVersion) |
Class<? extends Type> |
getTypeClass(String theName,
String theVersion) |
static String |
getVersionPackageName(String ver)
Returns the package name for model elements of the given version - e.g.
|
static String |
getVersionPackagePath(String ver)
Returns the path to the base package for model elements of the given version
- e.g.
|
static String[] |
packageList(String version)
Lists all the packages (user-definable) where classes for standard and custom
messages may be found.
|
static void |
reloadPackages()
Reloads the packages.
|
getEventMapDirectory, getEventMapForVersion, loadMessageStructures, setEventMapDirectory
public DefaultModelClassFactory()
public Class<? extends Message> getMessageClass(String theName, String theVersion, boolean isExplicit) throws HL7Exception
Attempts to return the message class corresponding to the given name, by searching through default and user-defined (as per packageList()) packages. Returns GenericMessage if the class is not found.
It is important to note that there can only be one implementation of a particular message
structure (i.e. one class with the message structure name, regardless of its package) among
the packages defined as per the packageList()
method. If there are duplicates
(e.g. two ADT_A01 classes) the first one in the search order will always be used. However,
this restriction only applies to message classes, not (normally) segment classes, etc. This is because
classes representing parts of a message are referenced explicitly in the code for the message
class, rather than being looked up (using findMessageClass() ) based on the String value of MSH-9.
The exception is that Segments may have to be looked up by name when they appear
in unexpected locations (e.g. by local extension) -- see findSegmentClass().
Note: the current implementation will be slow if there are multiple user- defined packages, because the JVM will try to load a number of non-existent classes every parse. This should be changed so that specific classes, rather than packages, are registered by name.
theName
- name of the desired structure in the form XXX_YYYtheVersion
- HL7 version (e.g. "2.3")isExplicit
- true if the structure was specified explicitly in MSH-9-3, false if it
was inferred from MSH-9-1 and MSH-9-2. If false, a lookup may be performed to find
an alternate structure corresponding to that message type and event.HL7Exception
- if the version if not recognized or an appropriate class can not be
foundpublic Class<? extends Group> getGroupClass(String theName, String theVersion) throws HL7Exception
theName
- name of grouptheVersion
- HL7 versionHL7Exception
- if the version if not recognized or an appropriate class can not be
foundModelClassFactory.getGroupClass(java.lang.String, java.lang.String)
public Class<? extends Segment> getSegmentClass(String theName, String theVersion) throws HL7Exception
theName
- name of segmenttheVersion
- HL7 versionHL7Exception
- if the version if not recognized or an appropriate class can not be
foundModelClassFactory.getSegmentClass(java.lang.String, java.lang.String)
public Class<? extends Type> getTypeClass(String theName, String theVersion) throws HL7Exception
theName
- name of typetheVersion
- HL7 versionHL7Exception
- if the version if not recognized or an appropriate class can not be
foundModelClassFactory.getTypeClass(java.lang.String, java.lang.String)
public Class<? extends Message> getMessageClassInASpecificPackage(String theName, String theVersion, boolean isExplicit, String packageName) throws HL7Exception
theName
- The message structure type (e.g. "ADT_A01")theVersion
- The HL7 version (e.g. "2.3.1")isExplicit
- If false, the message structure is looked up using Parser.getMessageStructureForEvent(String, String)
and converted to the appropriate structure type. For example, "ADT_A04" would be converted to "ADT_A01" because the A04 trigger uses the A01 message structure according to HL7.packageName
- The package name to use. Note that if the message type can't be found in this package, HAPI will return the standard type returned by getMessageClass(String, String, boolean)
HL7Exception
public static String getVersionPackagePath(String ver) throws HL7Exception
ver
- HL7 versionHL7Exception
- if the HL7 version is unknownpublic static String getVersionPackageName(String ver) throws HL7Exception
getVersionPackagePath(...)
except that path
separators are replaced with dots.ver
- HL7 versionHL7Exception
- if the HL7 version is unknownpublic static String[] packageList(String version) throws HL7Exception
Lists all the packages (user-definable) where classes for standard and custom messages may be found. Each package has subpackages called "message", "group", "segment", and "datatype" in which classes for these message elements can be found.
At a minimum, this method returns the standard package for the
given version. For example, for version 2.4, the package list contains
ca.uhn.hl7v2.model.v24
. In addition, user-defined packages may be specified
for custom messages.
If you define custom message classes, and want Parsers to be able to
find them, you must register them as follows (otherwise you will get an exception when
the corresponding messages are parsed). For each HL7 version you want to support, you must
put a text file on your classpath, under the folder /custom_packages, named after the version. For example,
for version 2.4, you might put the file "custom_packages/2.4" in your application JAR. Each line in the
file should name a package to search for message classes of that version. For example, if you
work at foo.org, you might create a v2.4 message structure called "ZFO" and define it in the class
org.foo.hl7.custom.message.ZFO
. In order for parsers to find this message
class, you would need to enter the following line in custom_packages/2.4:
org.foo.hl7.custom
Packages are searched in the order specified. The standard package for a given version is searched last, allowing you to override the default implementation. Please note that if you create custom classes for messages, segments, etc., their names must correspond exactly to their names in the message text. For example, if you subclass the QBP segment in order to add your own fields, your subclass must also be called QBP. although it will obviously be in a different package. To make sure your class is used instead of the default implementation, put your package in the package list. User-defined packages are searched first, so yours will be found first and used.
It is important to note that there can only be one implementation of a particular message
structure (i.e. one class with the message structure name, regardless of its package) among
the packages defined as per the packageList()
method. If there are duplicates
(e.g. two ADT_A01 classes) the first one in the search order will always be used. However,
this restriction only applies to message classes, not segment classes, etc. This is because
classes representing parts of a message are referenced explicitly in the code for the message
class, rather than being looked up (using findMessageClass() ) based on the String value of MSH-9.
version
- HL7 versionHL7Exception
public static void reloadPackages()
public static String getHighestKnownVersion()
public String getMessageStructureForEvent(String name, Version version) throws HL7Exception
getMessageStructureForEvent
in interface ModelClassFactory
getMessageStructureForEvent
in class AbstractModelClassFactory
name
- event nameversion
- HL7 versionnull
if none
could be foundHL7Exception
- if the version is unknown or the message structure list is inaccessibleAbstractModelClassFactory.getMessageStructureForEvent(java.lang.String, ca.uhn.hl7v2.Version)
Copyright © 2001–2017 University Health Network. All rights reserved.