Dynamic Custom Model Class Factories with Groovy

Custom HL7 message structures are added by defining an org.openehealth.ipf.modules.hl7.config.CustomModelClasses bean in a custom Spring application context file. This bean definition represents a mapping with a message structure version as a mapping-key and the package name of custom model classes as a mapping-value.

These custom message structures have priority over the existing message structures.

    <bean id="customClasses"
          class="org.openehealth.ipf.modules.hl7.config.CustomModelClasses">
        <property name="modelClasses">
            <map>
                <entry key="2.5">
                    <list>
                        <value>org.openehealth.ipf.modules.hl7.parser.test.hl7v2.def.v25</value>
                    </list>
                </entry>
            </map>
        </property>
    </bean>

The custom model classes from the given package will be picked up by the CustomModelClassFactoryConfigurer and automatically added to the shared CustomModelClassFactory.

It is also possible to use theGroovyCustomModelClassFactory and mix script-based with class-based model class definitions:

      <bean id="groovyCustomModelClassFactory"
            class="org.openehealth.ipf.modules.hl7.parser.GroovyCustomModelClassFactory">
          <constructor-arg ref="javaCustomModelClassFactory"/> <!-- fallback -->
      </bean>

      <bean id="javaCustomModelClassFactory"
            class="org.openehealth.ipf.modules.hl7.parser.CustomModelClassFactory" >
      </bean>

      <bean id="configurer"
            class="org.openehealth.ipf.modules.hl7.config.CustomModelClassFactoryConfigurer">
        <property name="customModelClassFactory" ref="groovyCustomModelClassFactory" />
      </bean>

Now the custom Spring context file can have custom model classes as both scripts and compiled classes:

      <bean id="customClasses"
        class="org.openehealth.ipf.modules.hl7.config.CustomModelClasses">
        <property name="modelClasses">
          <map>
            <entry key="2.5"> <!-- compiled classes -->
              <list>
                <value>org.openehealth.ipf.modules.hl7.parser.compiled.hl7v2.def.v25</value>
              </list>
            </entry>
            <entry key="2.4"> <!-- groovy scripts -->
              <list>
                <value>org.openehealth.ipf.modules.hl7.parser.notcompiled.hl7v2.def.v24</value>
              </list>
            </entry>
          </map>
        </property>
      </bean>