Installing TDI v. 7.1 on Windows Server 2012

Trying to install IBM Tivoli Directory Integrator (TDI) v. 7.1 for IBM Connections on Windows Server 2012 I got the following error:

ZeroGu2: Windows DLL failed to load
	at ZeroGa2.b(DashoA10*..)
	at ZeroGa2.b(DashoA10*..)
	at com.zerog.ia.installer.LifeCycleManager.b(DashoA10*..)
	at com.zerog.ia.installer.LifeCycleManager.a(DashoA10*..)
	at com.zerog.ia.installer.Main.main(DashoA10*..)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.zerog.lax.LAX.launch(DashoA10*..)
	at com.zerog.lax.LAX.main(DashoA10*..)

Solution was to right click the installer and set compatibility mode to Windows 7.

Lotus Connections Profiles – using JavaScript to translate data for TDI

I have been working with Lotus Connections lately and wanted to share a tidbit of code for the profiles database population step.

During the population of the profiles database from Domino LDAP using TDI (Tivoli Directory Integrator) I needed to translate country names to the matching ISO country code as this is what is used in Lotus Connections. To do this you can write a Javascript function in profiles_functions.js and map it in map_dbrepos_from_source.properties. The documentation on this is very lacking but through some trial-and-error and with a little help from Mac i cracked it.

Below is the function I wrote (with only a few countries) to show how to write the function which isn’t apparent at all. The error output from TDI simply indicates a “parse error” if your Javascript is wrong for whatever reason.

I hope this can save someone some time…

The tricks:

  • Define “fieldname” as a parameter to the function. I don’t use it but at least one parameter is required.
  • Use the available “work” variable to get data from the backend LDAP directory using the getAttribute method.
  • Use the available “system” variable to create a new attribute to replace the one we find.
  • Return the constructed attribute to have it show up in the profiles database.
  • The Javascript is actually accessing Java objects in the backend. Keep this in mind when comparing Strings – remember to use String.equals!

map_dbrepos_from_source.properties

PROF_ISO_COUNTRY_CODE={func_xlate_country}

profiles_functions.js

function func_xlate_country(fieldname) {
  // init arrays for translation
  var iso_codes = new Array("DK", "IE", "DE");
  var iso_ctry = new Array("Denmark", "Ireland", "Germany");

  // get attribute
  var ctry = work.getAttribute("c");
  if (null != c) {
    // get value from attribute
    var val = ctry.getValue(0);

    // loop array
    for (var i=0; i<iso_ctry.length; i++) {
      // match country name from attribute against current
      // array position
      if (val.equalsIgnoreCase(iso_ctry[i])) {
        // found one - create new attribute to hold
        // our translated value and set it
        ctry = system.newAttribute("c");
        ctry.addValue(iso_codes[i].toLowerCase());
      }
    }
  }

  // return attribute to TDI
  return ctry;
}