Plugin-Fähigkeit von DataMigrate Pro: Beispiel „getprinter“

Dieses Dokument beschreibt eine erste Beispielimplementierung eines Plugins im DataMigratePro-System.

1. Einführung

Mit der Plugin-Architektur von DataMigratePro lassen sich externe Funktionen modular in das System einbinden. Ziel ist die Erweiterbarkeit, ohne den Kerncode anzupassen.

2. Entwicklung des Plugins

Das folgende Beispiel implementiert die Schnittstelle IRelayPlugin. Die Aktion getprinter liefert eine Liste der lokal installierten Drucker zurück:

using System;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Drawing.Printing;
using DataMigratePro.Plugins;

namespace GetPrinterPlugin
{
    public class GetPrinterPlugin : IRelayPlugin
    {
        public string ActionName => "getprinter";

        public async Task<string> ExecuteAsync(string base64Data)
        {
            await Task.Yield(); // simulate async
            string decodedInput = Encoding.UTF8.GetString(Convert.FromBase64String(base64Data));

            var printers = new List<string>();
            foreach (string printer in PrinterSettings.InstalledPrinters)
            {
                printers.Add(printer);
            }

            var result = new
            {
                action = ActionName,
                input = decodedInput,
                printers = printers
            };

            return System.Text.Json.JsonSerializer.Serialize(result, new System.Text.Json.JsonSerializerOptions { WriteIndented = true });
        }
    }
}

🔧 Hinweis: Die Plugin-DLL sowie die DataMigratePro.Plugins.dll müssen ins Unterverzeichnis plugins kopiert werden.

3. Business Central Integration

Für die Ansteuerung des Plugins wird eine AL-Page bereitgestellt, die den Aufruf übernimmt und das Ergebnis darstellt.

page 50100 "Relay Result Viewer"
{
    PageType = Card;
    Caption = 'Relay Result Viewer';
    ApplicationArea = All;
    UsageCategory = Administration;

    layout
    {
        area(content)
        {
            field("ActionText"; ActionText) { ApplicationArea = All; }
            field("JSON (Raw)"; RawJsonText) { ApplicationArea = All; MultiLine = true; }
            field("Response"; ResultText) { ApplicationArea = All; Editable = false; MultiLine = true; }
            field("Info"; InfoText) { ApplicationArea = All; Editable = false; Style = Attention; StyleExpr = true; }
        }
    }

    actions
    {
        area(Processing)
        {
            group(Action)
            {
                action(SendToRelay)
                {
                    Caption = 'Send to Azure Relay';
                    Image = ExecuteBatch;
                    ApplicationArea = All;
                    Promoted = true;
                    PromotedCategory = Process;
                    PromotedIsBig = true;

                    trigger OnAction()
                    var
                        Sender: Codeunit "Azure Relay Sender IOI";
                        FullJson: Text;
                        EncodedMessage: Text;
                    begin
                        Base64Data := ToBase64(RawJsonText);
                        FullJson := '{"action":"' + ActionText + '","data":"' + Base64Data + '"}';
                        EncodedMessage := ToBase64(FullJson);
                        ResultText := Sender.SendMessage(EncodedMessage);
                    end;
                }
            }
        }
    }

    trigger OnOpenPage()
    begin
        ActionText := 'getprinter';
        RawJsonText := '{}';
        InfoText :=
            'This tool sends actions to Azure Relay. ' +
            'The data will be base64 encoded and wrapped into a JSON structure like: ' +
            '{"action":"...","data":"..."}, then encoded again before sending.';
    end;

    var
        ActionText: Text;
        RawJsonText: Text;
        Base64Data: Text;
        ResultText: Text;
        InfoText: Text;

    local procedure ToBase64(InputText: Text): Text
    var
        TempBlob: Codeunit "Temp Blob";
        Base64Convert: Codeunit "Base64 Convert";
        OutStr: OutStream;
        InStr: InStream;
    begin
        TempBlob.CreateOutStream(OutStr, TextEncoding::UTF8);
        OutStr.WriteText(InputText);
        TempBlob.CreateInStream(InStr, TextEncoding::UTF8);
        exit(Base64Convert.ToBase64(InStr));
    end;
}

4. Beispielausgabe

Das Ergebnis wird nach erfolgreicher Ausführung im Response-Feld der Page angezeigt:

5. Fazit

Dieses Plugin zeigt, wie flexibel und modular DataMigratePro erweitert werden kann. Durch diese Architektur lassen sich neue Funktionen in isolierten Modulen entwickeln, testen und betreiben.