File-Based ECMA 2.2 Management Agent
Example: File-Based ECMA 2.2 Management Agent
The following code is an example of a File-Based ECMA 2.2 Management Agent
//********************************************************
//* *
//* Copyright (C) Microsoft. All rights reserved. *
//* *
//********************************************************
using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Microsoft.MetadirectoryServices;
namespace FimSync_Ezma
{
public class EzmaExtension :
//IMAExtensible2CallExport,
//IMAExtensible2CallImport,
IMAExtensible2FileImport,
IMAExtensible2FileExport,
//IMAExtensible2GetHierarchy,
//IMAExtensible2GetSchema,
IMAExtensible2GetCapabilities,
IMAExtensible2GetParameters
//IMAExtensible2GetPartitions
{
//
// Constructor
//
public EzmaExtension()
{
//
// TODO: Add constructor logic here
//
}
public MACapabilities Capabilities
{
get
{
MACapabilities myCapabilities = new MACapabilities();
myCapabilities.ConcurrentOperation = true;
myCapabilities.ObjectRename = false;
myCapabilities.DeleteAddAsReplace = true;
myCapabilities.DeltaImport = true;
myCapabilities.DistinguishedNameStyle = MADistinguishedNameStyle.None;
myCapabilities.ExportType = MAExportType.AttributeUpdate;
myCapabilities.NoReferenceValuesInFirstExport = false;
myCapabilities.Normalizations = MANormalizations.None;
return myCapabilities;
}
}
public IList<ConfigParameterDefinition> GetConfigParameters(KeyedCollection<string, ConfigParameter> configParameters,
ConfigParameterPage page)
{
List<ConfigParameterDefinition> configParametersDefinitions = new List<ConfigParameterDefinition>();
switch (page)
{
case ConfigParameterPage.Connectivity:
break;
case ConfigParameterPage.Global:
configParametersDefinitions.Add(ConfigParameterDefinition.CreateStringParameter("Full Import File", ""));
configParametersDefinitions.Add(ConfigParameterDefinition.CreateStringParameter("Delta Import File", ""));
configParametersDefinitions.Add(ConfigParameterDefinition.CreateStringParameter("Export File", ""));
configParametersDefinitions.Add(ConfigParameterDefinition.CreateDropDownParameter("Export Encoding", "ASCII,Unicode,UTF8", false, "UTF8"));
break;
case ConfigParameterPage.Partition:
break;
case ConfigParameterPage.RunStep:
configParametersDefinitions.Add(ConfigParameterDefinition.CreateCheckBoxParameter("Omit Xml Declaration", false));
break;
}
return configParametersDefinitions;
}
public ParameterValidationResult ValidateConfigParameters(KeyedCollection<string, ConfigParameter> configParameters,
ConfigParameterPage page)
{
ParameterValidationResult myResults = new ParameterValidationResult();
return myResults;
}
public WriteImportFileResults WriteImportFile(
KeyedCollection<string, ConfigParameter> configParameters,
Schema types,
WriteImportFileRunStep importRunStep)
{
//
// Write out the delimited file.
//
StreamWriter swImport = new StreamWriter(importRunStep.FilePath, true);
swImport.WriteLine(
"{0},{1},{2},{3},{4}",
"objectclass",
"delta",
"anchor-attribute",
"name",
"email"
);
string inputxml = "";
XmlDocument doc = new XmlDocument();
if (importRunStep.ImportType == OperationType.Full)
{
inputxml = MAUtils.MAFolder + @“\” + configParameters["Full Import File"].Value;
}
if (importRunStep.ImportType == OperationType.Delta)
{
inputxml = MAUtils.MAFolder + @“\” + configParameters["Delta Import File"].Value;
}
doc.Load(inputxml);
XmlNodeList xnList = doc.SelectNodes("/sample-objects/object");
foreach (XmlNode node in xnList)
{
string objectclass = node["objectclass"].InnerText;
string delta = node["delta"].InnerText;
string anchor = node["anchor-attribute"].InnerText;
string name = node["name"].InnerText;
string email = node["email"].InnerText;
string fullline = objectclass + "," + delta + "," + anchor + "," + name + "," + email;
swImport.WriteLine(fullline);
}
swImport.WriteLine();
swImport.Close();
return new WriteImportFileResults();
}
public void ReadExportFile(KeyedCollection<string, ConfigParameter> configParameters,
Schema types,
ReadExportFileRunStep exportRunStep)
{
XmlWriter m_xmlWriterExport;
StreamReader sr = new StreamReader(exportRunStep.FilePath);
string lineContents = null;
XmlWriterSettings xmlSettings = new XmlWriterSettings();
// Determine encoding from Configuration Parmeters
string encoding = configParameters["Export Encoding"].Value;
if (encoding.Equals("ASCII"))
{
xmlSettings.Encoding = Encoding.ASCII;
}
else if (encoding.Equals("UTF8"))
{
xmlSettings.Encoding = Encoding.UTF8;
}
else
{
xmlSettings.Encoding = Encoding.Unicode;
}
// Use a run step config paramater to control Xml declaration
string omitXmlDecl = configParameters["Omit Xml Declaration"].Value;
if (omitXmlDecl.Equals("1"))
{
xmlSettings.OmitXmlDeclaration = true;
}
// Begin XML file
string exportfile = configParameters["Export File"].Value.ToString();
m_xmlWriterExport = XmlTextWriter.Create(MAUtils.MAFolder + @"\" + exportfile, xmlSettings);
m_xmlWriterExport.WriteStartElement(Nodes.Root);
m_xmlWriterExport.WriteAttributeString(Nodes.FullExport, (OperationType.Full == exportRunStep.ExportType) ? "true" : "false");
// Include partition DN
m_xmlWriterExport.WriteElementString(Nodes.PartitionDN, exportRunStep.StepPartition.DN);
// Read from export file and create XML file
while (null != (lineContents = sr.ReadLine()))
{
char[] commaEscape = new char[] { ',' };
char[] quoteEscape = new char[] { '"' };
string[] valueComponents = lineContents.Split(commaEscape);
//
// NOTE: In our sample, we assume that the order given to us is:
// objectclass,delta,anchor-attribute,name,email
//
//
// Check the objectclass node and see if this object class is
// something that we are interested in.
//
if (Nodes.ObjectClass == valueComponents[0].Trim(quoteEscape))
{
continue;
}
//
// This means that we are interested in this object class.
// Populate the the comma-delimited file.
//
m_xmlWriterExport.WriteStartElement(Nodes.Object);
m_xmlWriterExport.WriteElementString(
Nodes.ObjectClass,
valueComponents[0].Trim(quoteEscape)
);
m_xmlWriterExport.WriteElementString(
Nodes.Delta,
valueComponents[1].Trim(quoteEscape)
);
m_xmlWriterExport.WriteElementString(
Nodes.Anchor,
valueComponents[2].Trim(quoteEscape)
);
m_xmlWriterExport.WriteElementString(
Nodes.Name,
valueComponents[3].Trim(quoteEscape)
);
m_xmlWriterExport.WriteElementString(
Nodes.Email,
valueComponents[4].Trim(quoteEscape)
);
m_xmlWriterExport.WriteEndElement();
}
m_xmlWriterExport.WriteEndElement();
m_xmlWriterExport.Close();
}
struct Nodes
{
//
// Struct used to keep track of the XML node names.
// This is used when generating the XML file.
//
public const string Root = "sample-objects";
public const string PartitionDN = "partition-dn";
public const string FullExport = "full-export";
public const string Object = "object";
public const string ObjectClass = "objectclass";
public const string Delta = "delta";
public const string Anchor = "anchor-attribute";
public const string Name = "name";
public const string Email = "email";
}
};
}