Example: Spring Configuration

Here is the complete Spring XML for migration of the Footwear Orders sample MAPPER data report:

FootWearOrders_12D3954.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/util
                           http://www.springframework.org/schema/util/spring-util-3.0.xsd">


<!-- ===== Define ETL configuration items not derived from Hibernate configuration ===== -->

<bean id="__propertyPlaceholder__"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <value>classpath:etl_config.properties</value>
    </list>
  </property>
</bean>

<bean id="etlConfig"
      class="com.arsi.mj.maprpt.entity.etlgen.config.HibernateEtlConfig"
      p:etlUserId="${etl.userId}"
      p:jdbcClasspath="${etl.jdbcClasspath}"
      p:nullString="${etl.nullString}">
</bean>

<!-- ***** FOOTWEAR_ORDER_ADDRESSEE ***** -->
<!-- ===== First, define columns that make up FOOTWEAR_ORDER_ADDRESSEE table ===== -->

<bean id="addrInlineHandler.coldefAddressee"
      class="com.arsi.mj.config.atoms.ColumnDef">
  <!-- entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="addressee"/>
  <constructor-arg index="1" value="addressee"/>
  <constructor-arg index="2" value="50"/>
  <constructor-arg index="3" value="false"/>
  <constructor-arg index="4">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="addrInlineHandler.coldefStreet"
      class="com.arsi.mj.config.atoms.ColumnDef">
  <!-- entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="street"/>
  <constructor-arg index="1" value="street"/>
  <constructor-arg index="2" value="80"/>
  <constructor-arg index="3" value="false"/>
  <constructor-arg index="4">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="addrInlineHandler.coldefCityState"
      class="com.arsi.mj.config.atoms.ColumnDef">
  <!-- entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="cityState"/>
  <constructor-arg index="1" value="city_state_province"/>
  <constructor-arg index="2" value="60"/>
  <constructor-arg index="3" value="false"/>
  <constructor-arg index="4">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="addrInlineHandler.coldefPostalCode"
      class="com.arsi.mj.config.atoms.ColumnDef">
  <!-- entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="postalCode"/>
  <constructor-arg index="1" value="postal_code"/>
  <constructor-arg index="2" value="25"/>
  <constructor-arg index="3" value="false"/>
  <constructor-arg index="4">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="addrInlineHandler.coldefEmail"
      class="com.arsi.mj.config.atoms.ColumnDef">
  <!-- entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="email"/>
  <constructor-arg index="1" value="email"/>
  <constructor-arg index="2" value="60"/>
  <constructor-arg index="3" value="true"/>
  <constructor-arg index="4">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="addrInlineHandler.coldefPhone"
      class="com.arsi.mj.config.atoms.ColumnDef">
  <!-- entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="phone"/>
  <constructor-arg index="1" value="phone"/>
  <constructor-arg index="2" value="25"/>
  <constructor-arg index="3" value="true"/>
  <constructor-arg index="4">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<!--
=========================================================================
Setup the inline handler for FOOTWEAR_ORDER_ADDRESSEE that parses and
extract fields from text of trailing lines, referencing columns above.

Asterisk lines that encompass the addressee appears as follows:
*       Dave Bennet                     123 Main St
*       Burr, MN                        55038-1234
*       dave@home.com                   4567-9876-1234-6543
=========================================================================
-->
<bean id="addrInlineHandler"
      class="com.arsi.mj.maprpt.parser.tuple.inline.RegexInlineDataHandler"
      p:className="com.arsi.mj.testapp.hibgen.model.FootwearOrderAddressee"
      p:baseClassSuffix="Base"
      p:tableName="FOOTWEAR_ORDER_ADDRESSEE"

      p:column1-ref="addrInlineHandler.coldefAddressee"
      p:column2-ref="addrInlineHandler.coldefStreet"
      p:column3-ref="addrInlineHandler.coldefCityState"
      p:column4-ref="addrInlineHandler.coldefPostalCode"
      p:column5-ref="addrInlineHandler.coldefEmail"
      p:column6-ref="addrInlineHandler.coldefPhone"

      p:matchFullInput="false"
      p:multiline="true"
      p:unixLines="true"
      p:textStripRegex="^\*">

      <property name="fieldParseRegex1">
        <!-- column name, field selector regex -->
        <list>
          <value>addressee</value>
          <value>^[^\t]*\t([^\t]*)</value>
        </list>
      </property>

      <property name="fieldParseRegex2">
        <!-- column name, field selector regex -->
        <list>
          <value>street</value>
          <value>\t([^\t]*)$</value>
        </list>
      </property>

      <property name="fieldParseRegex3">
        <!-- column name, field selector regex -->
        <list>
          <value>city_state_province</value>
          <value>^[^\t]*\t([^\t]*)</value>
        </list>
      </property>

     <property name="fieldParseRegex4">
        <!-- column name, field selector regex -->
        <list>
          <value>postal_code</value>
          <value>\t([^\t]*)$</value>
        </list>
      </property>

     <property name="fieldParseRegex5">
        <!-- column name, field selector regex -->
        <list>
          <value>email</value>
          <value>^[^\t]*\t([^\t]*)</value>
        </list>
      </property>

     <property name="fieldParseRegex6">
        <!-- column name, field selector regex -->
        <list>
          <value>phone</value>
          <value>\t([^\t]*)$</value>
        </list>
      </property>

</bean>

<!-- this last step validates regex inline data handler after setup -->
<bean id="addrInlineHandler.validateSetup"
      class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
      p:targetObject-ref="addrInlineHandler"
      p:targetMethod="validate">
</bean>

<!-- ***** FOOTWEAR_ORDER_LINEITEM ***** -->
<!-- ===== First, define columns that make up FOOTWEAR_ORDER_LINEITEM table ===== -->

<bean id="orderEntityHandler.coldefOrderNumber"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="OrdNo" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.INTEGER"/>
  </constructor-arg>
  <constructor-arg index="2" value="orderNumber"/>
  <constructor-arg index="3" value="order_no"/>
  <constructor-arg index="4" value="5"/>
  <constructor-arg index="5" value="false"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.INTEGER"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefQuantity"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="Qty" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.INTEGER"/>
  </constructor-arg>
  <constructor-arg index="2" value="quantity"/>
  <constructor-arg index="3" value="QTY"/>
  <constructor-arg index="4" value="3"/>
  <constructor-arg index="5" value="false"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.INTEGER"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefShoeType"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="Type" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.STRING"/>
  </constructor-arg>
  <constructor-arg index="2" value="shoeType"/>
  <constructor-arg index="3" value="SHOE_TYPE"/>
  <constructor-arg index="4" value="5"/>
  <constructor-arg index="5" value="false"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefShoeGender"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="Gender" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.STRING"/>
  </constructor-arg>
  <constructor-arg index="2" value="shoeGender"/>
  <constructor-arg index="3" value="SHOE_GENDER"/>
  <constructor-arg index="4" value="1"/>
  <constructor-arg index="5" value="false"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.CHARACTER"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefShoeSize"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="Siz" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.STRING"/>
  </constructor-arg>
  <constructor-arg index="2" value="shoeSize"/>
  <constructor-arg index="3" value="SHOE_SIZE"/>
  <constructor-arg index="4" value="3"/>
  <constructor-arg index="5" value="false"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefShoeColor"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="Color" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.STRING"/>
  </constructor-arg>
  <constructor-arg index="2" value="shoeColor"/>
  <constructor-arg index="3" value="SHOE_COLOR"/>
  <constructor-arg index="4" value="40"/>
  <constructor-arg index="5" value="true"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.STRING"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefPrice"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, scale, NULLABLE, data type -->
  <constructor-arg index="0" value="Price" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.FLOAT"/>
  </constructor-arg>
  <constructor-arg index="2" value="price"/>
  <constructor-arg index="3" value="PRICE"/>
  <constructor-arg index="4" value="8"/>
  <constructor-arg index="5" value="2"/>
  <constructor-arg index="6" value="false"/>
  <constructor-arg index="7">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.BIG_DECIMAL"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefOrderDateTime"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, NULLABLE, data type -->
  <constructor-arg index="0" value="Date, Time" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.STRING"/>
  </constructor-arg>
  <constructor-arg index="2" value="dateAndTimeOrdered"/>
  <constructor-arg index="3" value="ORDER_DATE_TIME"/>
  <constructor-arg index="4" value="8"/>
  <constructor-arg index="5" value="false"/>
  <constructor-arg index="6">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.TIMESTAMP"/>
  </constructor-arg>
</bean>

<bean id="orderEntityHandler.coldefCost"
      class="com.arsi.mj.maprpt.entity.handler.AnnotatedColumnDef">
  <!-- Mapper name, Mapper type, entity attrname, column name, length, scale, NULLABLE, data type -->
  <constructor-arg index="0" value="Cost" />
  <constructor-arg index="1">
    <util:constant static-field="com.arsi.mj.datatype.MaprptDataType.FLOAT"/>
  </constructor-arg>
  <constructor-arg index="2" value="cost"/>
  <constructor-arg index="3" value="COST"/>
  <constructor-arg index="4" value="8"/>
  <constructor-arg index="5" value="2"/>
  <constructor-arg index="6" value="true"/>
  <constructor-arg index="7">
    <util:constant static-field="org.hibernate.type.StandardBasicTypes.BIG_DECIMAL"/>
  </constructor-arg>
</bean>

<!-- ===== Setup enumeration mappings for ShoeType and ShoeGender ===== -->
<bean id="orderEntityHandler.enumShoeType"
      class="com.arsi.mj.maprpt.enums.StringKeyEnumMapping"
      p:enumClassName="com.arsi.mj.testapp.hibgen.enums.ShoeType">

  <property name="enumsFromProperties">
    <value>
    Basketball=BASKETBALL -> BSKBL
    Running=RUNNING -> RUN
    Golf=GOLF -> GOLF
    Tennis=TENNIS -> TENIS
    </value>
  </property>
</bean>

<bean id="orderEntityHandler.enumShoeGender"
      class="com.arsi.mj.maprpt.enums.StringKeyEnumMapping"
      p:enumClassName="com.arsi.mj.testapp.hibgen.enums.ShoeGender">

  <property name="enumsFromProperties">
    <value>
    Womens=WOMENS -> F
    Mens=MENS -> M
    </value>
  </property>
</bean>

<bean id="orderEntityHandler.enumLineType"
      class="com.arsi.mj.maprpt.enums.LineTypeEnumMapping"
      p:enumClassName="com.arsi.mj.testapp.hibgen.enums.LineType">

  <property name="enumsFromProperties">
    <value>
    \\t=TABLINE -> T
    </value>
  </property>
</bean>

<!--
=========================================================================
Setup the data entity handler for FOOTWEAR_ORDER_LINEITEM, referencing
columns and enumerations defined above.
=========================================================================
-->
<bean id="orderEntityHandler"
      class="com.arsi.mj.maprpt.entity.handler.DataEntityHandler"
      p:tableName="FOOTWEAR_ORDER_LINEITEM"
      p:entityPackageName="com.arsi.mj.testapp.hibgen.model"
      p:entityClassName="FootwearOrderLineitem"
      p:entityBaseClassSuffix="Base"
      p:entityManagerClassSuffix="Mgr"
      p:surrogateKeyColumnName="fw_order_li_id"

      p:updateTimestampColumnName="DATE_OF_LAST_UPDATE"
      p:createUserColumnName="CREATED_BY_USER"

      p:column1-ref="orderEntityHandler.coldefOrderNumber"
      p:column2-ref="orderEntityHandler.coldefQuantity"
      p:column3-ref="orderEntityHandler.coldefShoeType"
      p:enumForColumn3-ref="orderEntityHandler.enumShoeType"
      p:column4-ref="orderEntityHandler.coldefShoeGender"
      p:enumForColumn4-ref="orderEntityHandler.enumShoeGender"
      p:column5-ref="orderEntityHandler.coldefShoeSize"
      p:column6-ref="orderEntityHandler.coldefShoeColor"
      p:column7-ref="orderEntityHandler.coldefPrice"
      p:column8-ref="orderEntityHandler.coldefOrderDateTime"
      p:column9-ref="orderEntityHandler.coldefCost">

</bean>

<!-- this last step validates the data entity handler after setup -->
<bean id="orderEntityHandler.validateSetup"
      class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
      p:targetObject-ref="orderEntityHandler"
      p:targetMethod="validate">
</bean>

</beans>