Synchronizing mappings and process flows using OMB Plus

I was recently in a situation where I had to delete a package (transformation) in OWB and then re-import it from the database, because I had deleted it and re-imported it, every mapping and process flow that referenced the package lost its reference to it. I could have gone through each mapping and process flow and synchronized inbound, manually selected the function, but this would have needed to be done hundreds of times, so I looked at automating the problem using OMB Plus. I would write a script and execute it using the OMB Plus window in the Design Center.

Mappings

<p>The mappings were relatively simple, despite losing the reference, the operators retained the function name. The function was bound to a pre-mapping operator, so using the following code I was able to iterate through each operator and synchronize each of the functions:</p>

<pre><code>foreach opName [OMBRETRIEVE MAPPING '$mapName' GET PREMAPPING_PROCESS OPERATORS ] {
set fncName [OMBRETRIEVE MAPPING '$mapName' \
OPERATOR '$opName' \
GET PROPERTIES(FUNCTION_NAME) ];
switch -regexp $fncName {
^.MAP_START.$ {
  set opRef "/$projectName/$ctlModName/$ctlPkgName/MAP_START";
  puts "Synchronizing $opName to $opRef";
  OMBSYNCHRONIZE FUNCTION '$opRef' \
  TO MAPPING '$mapName' OPERATOR '$opName' \
  USE (RECONCILE_STRATEGY 'REPLACE', MATCHING_STRATEGY 'MATCH_BY_OBJECT_ID');}
default {puts "Function not changed.";}

}

<p>Note: there are a number of variable in the code that I had already initialised.</p>

<h3>Process Flows</h3>


<p>Process flows were much more difficult &#8211; there was no way of getting back the reference and even if I was able to derive the transformation from the name of the activity I was still getting errors when trying to synchronize.  So the only way to do it was to delete the transformation activity and re-create it.  However first I would need to take a copy of each transition in the process flow and then delete them &#8211; this is because they would be deleted anyway once the transformation activity was deleted.</p>

foreach transName [ OMBRETRIEVE PROCESS_FLOW '$flowName' GET TRANSITIONS ] {
  set src [ OMBRETRIEVE PROCESS_FLOW '$flowName' TRANSITION '$transName' GET SOURCE_ACTIVITY ];
  set dest [ OMBRETRIEVE PROCESS_FLOW '$flowName' TRANSITION '$transName' GET DESTINATION_ACTIVITY ];
  set cond [ OMBRETRIEVE PROCESS_FLOW '$flowName' TRANSITION '$transName' GET PROPERTIES (TRANSITION_CONDITION) ];
  lappend transPropList [ list $transName $src $dest $cond ];
  OMBALTER PROCESS_FLOW '$flowName' DELETE TRANSITION '$transName';
}
<p>From the name of the activity I was then able to derive the required function.</p>


    switch -regexp $actName {
      START_EXECUTION -
      EXECUTE_MAPPING -
      COMPLETE_EXECUTION -
      MAP_START -
      MAP_END -
      DATA_CONSISTENCY_CHECK {set actRef "/$projectName/$ctlModName/$ctlPkgName/$actName"}
      ^EM_.* {set actRef "/$projectName/$ctlModName/$ctlPkgName/EXECUTE_MAPPING"}
      default {set actRef [OMBRETRIEVE PROCESS_FLOW '$flowName' ACTIVITY '$actName' GET REFERENCE]}
     }

<p>And then for each activity I would have to get all the parameter details.</p>

    foreach paramName [OMBRETRIEVE PROCESS_FLOW '$flowName' ACTIVITY '$actName' GET PARAMETERS ] {
      set paramValue [OMBRETRIEVE PROCESS_FLOW '$flowName' ACTIVITY '$actName' PARAMETER '$paramName' GET PROPERTIES (VALUE) ];
      set paramBinding [OMBRETRIEVE PROCESS_FLOW '$flowName' ACTIVITY '$actName' PARAMETER '$paramName' GET PROPERTIES (BINDING) ];
      lappend paramsPropList [ list $paramName $paramValue $paramBinding ];
    }
<p>I then had to re-create the activity and reinstate all the parameter properties.</p>


    OMBALTER PROCESS_FLOW '$flowName' DELETE ACTIVITY '$actName';
    OMBALTER PROCESS_FLOW '$flowName' ADD TRANSFORMATION ACTIVITY '$actName' SET REFERENCE TRANSFORMATION '$actRef';
    foreach paramProp $paramsPropList {
      set paramName [ lindex $paramProp 0 ];
      set paramValue [ lindex $paramProp 1 ];
      set paramBinding [ lindex $paramProp 2 ];

      if {$paramName != "" } {
        if {$paramValue != ""} {
          OMBALTER PROCESS_FLOW '$flowName' MODIFY TRANSFORMATION ACTIVITY '$actName' \
          MODIFY PARAMETER '$paramName' SET PROPERTIES (VALUE) VALUES ('[OMBToSettableString $paramValue]');
        }
        if {$paramBinding != ""} {
          OMBALTER PROCESS_FLOW '$flowName' MODIFY TRANSFORMATION ACTIVITY '$actName' \
          MODIFY PARAMETER '$paramName' SET PROPERTIES (BINDING) VALUES ('$paramBinding');
        }
      }
    }
    unset paramsPropList

<p>And finally add all the transitions back in.</p>


    foreach transProp $transPropList {
      set transName [ lindex $transProp 0 ];
      set transSource [ lindex $transProp 1 ];
      set transDest [ lindex $transProp 2 ];
      set transCond [ lindex $transProp 3 ];
      if {$transCond != "" } {
        OMBALTER PROCESS_FLOW '$flowName' \ADD TRANSITION '$transName' FROM ACTIVITY '$transSource' TO '$transDest' \
        SET PROPERTIES (TRANSITION_CONDITION) VALUES ('$transCond');
      } else {
        OMBALTER PROCESS_FLOW '$flowName' ADD TRANSITION '$transName' FROM ACTIVITY '$transSource' TO '$transDest';
      }
    }

    unset transPropList

As you can see from the code this took to fix it wasn’t a trivial task, but unfortunately there was not another option, so be warned if you are about to do this.