Share via


How to: Create Data Source Extensions for File-Based Export Only

Note

With the release of ECMA 2.0, this feature has been deprecated and will be removed in future versions. You should use the Extensible Connectivity 2.0 Management Agent Reference for Connector development going forward.

This topic shows how a file-based connected data source uses connected data source extensions to import and export objects.

The following C# example shows how a file-based connected data source uses a connected data source extension to export objects. For more information about how this extension works, see Connected Data Source Extensions for File-Based Data Sources.

using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Collections.Specialized;
using Microsoft.MetadirectoryServices;

namespace SampleMAFileExport
{ 
    public class SampleMAFileExport : 
        IMAExtensibleFileImport, 
        IMAExtensibleFileExport
    {
        //
        // Constructor
        //
        public SampleMAFileExport()
        
        {            
            m_xmlWriterExport   = null;
            m_encoding          = UnicodeEncoding.Unicode;   
        }
         
        public void GenerateImportFile( 
        
            string                      filename, 
            string                      connectTo, 
            string                      user, 
            string                      password, 
            ConfigParameterCollection   configParameters,
            bool                        fullImport, 
            TypeDescriptionCollection   types,
            ref string                  customData 
            )
       
        {
            throw new EntryPointNotImplementedException();
        }

        //
        //  IMAExtensibleFileExport interface methods
        //      
        public void DeliverExportFile(
            string                      fileName,
            string                      connectTo,
            string                      user,
            string                      password,
            ConfigParameterCollection   configParameters,
            TypeDescriptionCollection   types
            )
       
        {
           
            StreamReader    sr = new StreamReader(
                fileName,  
                m_encoding
                );
                                                 
            string          lineContents = null;          
            string          exportFile = null;
            
            exportFile = MAUtils.MAFolder.ToString() + @"\sample_export.xml";
            m_xmlWriterExport= new XmlTextWriter(
                                    
                                                    exportFile,                   
                                                    m_encoding
                                                                                
                                                 );

            m_xmlWriterExport.WriteStartElement(Nodes.Root);

            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 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();
        }

        //
        // Members
        //
        XmlTextWriter       m_xmlWriterExport;   
        Encoding            m_encoding;
        
    }
 
    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 Object      = "object";
        public const string Anchor      = "anchor-attribute";
        public const string Delta       = "delta";
        public const string ObjectClass = "objectclass";
        public const string Name        = "name";            
        public const string Email       = "email";            
    }    
}

The following Visual Basic example shows how a file-based connected data source uses a connected data source extension to export objects. For more information about how this extension works, see Connected Data Source Extensions for File-Based Data Sources.

Imports System

Imports System.IO

Imports System.Xml

Imports System.Text

Imports System.Collections.Specialized

Imports Microsoft.MetadirectoryServices

Public Class SampleMAFileExport

    Implements IMAExtensibleFileImport

    Implements IMAExtensibleFileExport

    Public Sub GenerateImportFile(ByVal fileName As String, _
                                  ByVal connectTo As String, _
                                  ByVal user As String, _
                                  ByVal password As String, _
                                  ByVal configParameters As ConfigParameterCollection, _
                                  ByVal fFullImport As Boolean, _
                                  ByVal types As TypeDescriptionCollection, _
                                  ByRef customData As String) _
                                  Implements IMAExtensibleFileImport.GenerateImportFile

        Throw New EntryPointNotImplementedException

    End Sub

    Public Sub DeliverExportFile(ByVal fileName As String, _
                                 ByVal connectTo As String, _
                                 ByVal user As String, _
                                 ByVal password As String, _
                                 ByVal configParameters As ConfigParameterCollection, _
                                 ByVal types As TypeDescriptionCollection) _
                                 Implements IMAExtensibleFileExport.DeliverExportFile

        Dim sr As New StreamReader(fileName, m_encoding)

        Dim lineContents As String = Nothing

        Dim exportFile As String = Nothing

        exportFile = MAUtils.MAFolder.ToString() + "\sample_export.xml"

        m_xmlWriterExport = New XmlTextWriter(exportFile, m_encoding)

        m_xmlWriterExport.WriteStartElement(Nodes.Root)

        While (Not (lineContents = sr.ReadLine()))

            Dim commaEscape() As Char = {","c}

            Dim quoteEscape() As Char = {ControlChars.Quote}

            Dim valueComponents As String() = lineContents.Split(commaEscape)

            '
            ' NOTE: In our sample, we assume that the order given to us is:
            '  objectclass, delta,anchor-attribute, name, e-mail
            '
            '
            ' Check the objectclass node and see if this object class is
            ' something that we are interested in.
            '
            If Nodes.ObjectClass = valueComponents(0).Trim(quoteEscape) Then

                GoTo ContinueWhile1

            End If

            '
            ' This means that we are interested in this object class.
            ' Populate 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()

ContinueWhile1:

        End While

        m_xmlWriterExport.WriteEndElement()

        m_xmlWriterExport.Close()

    End Sub

    Private m_xmlWriterExport As XmlTextWriter

    Private m_encoding As Encoding

End Class



Module Nodes
    '
    ' Struct used to keep track of the XML node names.
    ' This is used when generating the XML file.
    '
    Public Const Root As String = "sample-objects"

    Public Const [Object] As String = "object"

    Public Const Anchor As String = "anchor-attribute"

    Public Const Delta As String = "delta"

    Public Const ObjectClass As String = "objectclass"

    Public Const Name As String = "name"

    Public Const Email As String = "email"

End Module 'Nodes 

See Also

Concepts

Connected Data Source Extensions for File-Based Data Sources
Best Practices for Data Source Extension Exports
Creating Connected Data Source Extensions
Connected Data Source Extensions for Call-Based Data Sources