Microsoft Identity Integration Server 2003 Developer Reference

Example: Duplicating a Connected Data Source Hierarchy

You can duplicate the hierarchy of one connected data source in another connected data source during the provisioning phase of synchronization. The following example shows how this can be accomplished. This example requires that the DN is flowed into the objectDN attribute in the metaverse during import attribute flow.

[Visual Basic .NET]
Dim AFGALContainer As String

Public Sub Provision(ByVal mventry As MVEntry) _
	Implements IMVSynchronization.Provision

	Try
		Dim containerInfo As String

		Dim dn, finalValue	 As ReferenceValue
		Dim myConnector, csentry As CSEntry
		Dim numADConnectors	As Integer

		Dim JDPMA As ConnectedMA = mventry.ConnectedMAs("AD-AMC")

		Dim dnValue As ReferenceValue = JDPMA.CreateDN(mventry("objectDN").Value)

		Dim depth As Integer = dnValue.Depth

		' If there is no connector present, add a new AD connector
		' and call a subroutine to set the initial values on the CS Object.
		numADConnectors = JDPMA.Connectors.Count

		If 0 = numADConnectors Then
			Dim adObjectType As String

			Select Case mventry.ObjectType.ToLower
				Case "person"
					adObjectType  = "contact"
					finalValue	= dnValue.Subcomponents(1, depth - 1)
					containerInfo = finalValue.ToString
					containerInfo = containerInfo.ToUpper
					containerInfo = containerInfo.Replace("CN=", "OU=")

					dn = JDPMA.CreateDN("CN=" + mventry("cn").Value + "," + containerInfo + "," + AFGALContainer)

				Case "container"
					adObjectType  = "organizationalUnit"
					finalValue	= dnValue.Subcomponents(0, depth - 1)
					containerInfo = finalValue.ToString
					containerInfo = containerInfo.ToUpper
					containerInfo = containerInfo.Replace("CN=", "OU=")

					dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer)

				Case "organizationalunit"
					adObjectType  = "organizationalUnit"
					finalValue	= dnValue.Subcomponents(0, depth - 1)
					containerInfo = finalValue.ToString
					containerInfo = containerInfo.ToUpper

					dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer)
			End Select

			csentry	= JDPMA.Connectors.StartNewConnector(adObjectType)
			csentry.DN = dn
			csentry.CommitNewConnector()
		ElseIf 1 = numADConnectors Then
			' Check if the connector has a different DN and rename if necessary.
			' First get the connector.
			myConnector = JDPMA.Connectors.ByIndex(0)

			' MMS will rename or move if different.
			myConnector.DN = dn

		Else
			Throw New UnexpectedDataException("multiple AD connectors:" + numADConnectors.ToString)
		End If

	Finally
		' Add cleanup code
	End Try

End Sub
[C#]
string AFGALContainer = "";

void IMVSynchronization.Provision (MVEntry mventry)
{
	try
	{
		string containerInfo;
		ReferenceValue dn = null, finalValue;
		CSEntry myConnector, csentry;
		int numADConnectors;

		ConnectedMA JDPMA = mventry.ConnectedMAs["AD-AMC"];

		ReferenceValue dnValue = JDPMA.CreateDN(mventry["objectDN"].Value);

		int depth = dnValue.Depth;

		// If there is no connector present, add a new AD connector
		// and call a subroutine to set the initial values on the CS Object.
		numADConnectors = JDPMA.Connectors.Count;

		if(numADConnectors == 0)
		{
			string adObjectType = "";

			switch(mventry.ObjectType.ToLower())
			{
				case "person":
					adObjectType  = "contact";
					finalValue	= dnValue.Subcomponents(1, depth - 1);
					containerInfo = finalValue.ToString();
					containerInfo = containerInfo.ToUpper();
					containerInfo = containerInfo.Replace("CN=", "OU=");

					dn = JDPMA.CreateDN("CN=" + mventry["cn"].Value + "," + containerInfo + "," + AFGALContainer);
					break;

				case "container":
					adObjectType  = "organizationalUnit";
					finalValue	= dnValue.Subcomponents(0, depth - 1);
					containerInfo = finalValue.ToString();
					containerInfo = containerInfo.ToUpper();
					containerInfo = containerInfo.Replace("CN=", "OU=");

					dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer);
					break;

				case "organizationalunit":
					adObjectType  = "organizationalUnit";
					finalValue	= dnValue.Subcomponents(0, depth - 1);
					containerInfo = finalValue.ToString();
					containerInfo = containerInfo.ToUpper();

					dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer);
					break;
		}

			csentry	= JDPMA.Connectors.StartNewConnector(adObjectType);
			csentry.DN = dn;
			csentry.CommitNewConnector();
	}
		else if(numADConnectors == 1)
		{
			// Check if the connector has a different DN and rename if necessary.
			// First get the connector.
			myConnector = JDPMA.Connectors.ByIndex[0];

			// MIIS will rename or move if different.
			myConnector.DN = dn;
	}
		else
		{
			throw new UnexpectedDataException("multiple AD connectors:" + numADConnectors.ToString());
	}
}
	finally
	{
		// Add cleanup code
}
}