Erweiterte Programmierung


Das Meldungssystem von iPlus bietet folgende Funktionalitäten:

  • Protokollierung in temporäre Logdateien.
  • Hierarchisches Alarmsystem mit Datenbankspeicherung.
  • Meldungen in Dialogen anzeigen und Benutzerabfragen.
  • Einheitliche Verwendung in Webdiensten (SOAP, JSON).
  • Mehrsprachigkeit.

Die Eigenschaft "IRoot Root" (Typ IRoot) eines ACComponent zeigt auf die Wurzelkomponente iPlus im gesamten Anwendungsbaum. Die Klasse ACRoot ist die Implementierung dieser Schnittstelle. Diese Root-Instanz verfügt über eine Child-Instanz vom Typ gip.core.autocomponent.Messages, die das Interface gip.core.datamodel.IMessages implementiert. Jede Komponente kann direkt über die lokale Eigenschaft IACComponent.Messages auf diese Instanz zugreifen.

IMessages bietet eine Vielzahl von Methoden, um Meldungen zu protokollieren und Dialogfelder in der Benutzeroberfläche zu öffnen.

Die IACComponent-Schnittstelle macht auch Messages verfügbar, sodass der Anwendungsprogrammierer keinen umständlichen Zugriff auf die Message-Instanz haben muss:


IMessages messageService = (IMessages) ACUrlCommand("\Messages");


Das Meldungsprotokoll ist eine Text-Datei, die im temporären Benutzerverzeichnis liegt:

>cd %USERPROFILE%\AppData\Local\Temp

Das Format des Dateinamens und die Filtereinstellungen welche Meldungen ausgegeben werden sollen, wird über die Anwendungs-Konfigurationsdatei (App.config bzw. *.exe.config im bin-Verzeichnis) gesteuert:

 

Im Schritt 1 (siehe oben), muss mittels <sectionGroup> und <section> die iPlus-Konfigurationsklasse LoggingConfiguration aus dem namespace "gip.core.autocomponent" bekannt gegeben werden.

Im Schritt 2, können dann die Klassen LoggingConfigurationLogFileElementLoggingTypeElement verwendet werden. 

Die Liste <LoggingTypes> enthält Einträge vom Typ "gip.core.autocomponent.LoggingTypeElement" die per <addLoggingType> hinzugefügt werden. Diese Klasse dient zur Beschreibung, welche Meldungen, die mittels IMessages auftreten, gefiltert und nicht ausgegeben werden sollen. Mit jedem Eintrag wird ein neuer "Logfile-Typ" definiert der im Attribut "FileType" mit einem eindeutigen Namen versehen werden muss.

Auf diesen "Logfile-Typ" beziehen sich dann die Einträge in der Liste <LogFiles>die per <addLogFile> hinzugefügt werden. Die Einträge sind vom Typ "gip.core.autocomponent.LogFileElement". Damit wird deklariert welche Logdateien mit welchem Dateinamen geschrieben werden.

 

LoggingTypeElement (Abschnitt <addLoggingType>):

NameBeschreibung
string FileType

Eindeutiger Name des "Logfile-Typen".

string MessageTypeFilter der angibt welche Art von Meldungen berücksichtigt werden sollen. Die möglichen Werte sind im Enum "gip.core.datamodel.eMsgLevel" definiert: Default, Debug, Info, Warning, Failure, Error, Exception, Question. Mit "Default" werden keine Meldungen gefiltert und alle ausgegeben. 
string SourceFilter (ACUrl) der angibt von welcher ACComponent-Instanz Meldungen ausgegeben werden sollen. Mit "*" werden alle Instanzen berücksichtigt.
string ACName

Zusätzlicher Filter, der nur Meldungen berücksichtigt, bei denen die Eigenschaft gip.core.datamodel.Msg.ACIdentifier übereinstimmt. Der ACIdentifier ist ein beliebiger String, der vom Programmierer vergeben werden kann. Er dient primär dazu, die richtige Codestelle im Programmcode zu finden. Empfehlenswert ist hier den Methodennamen mit einer eindeutigen Codestellennummer anzugeben z.B. "Start(50)".

bool DumpThreadIDWenn "True", dann wird die ThreadID in die Logzeilen mit eingetragen.
string Smtp

Verbindungsparameter um Meldungen per SMTP zu versenden. Parameter werden Strichpunkt-separiert deklariert: 

SmtpServerHost=localhost;
SmtpServerPort=25;
SmtpUseSSL=false;
IgnoreInvalidCertificate=true;
SmtpAuthUser=iPlus;
SmtpAuthPassword=iPlusPW;
SmtpFrom=iPlus@localdomain.com;
SmtpReceipients=rcp1@localdomain.com,rcp2@localdomain.com;

Zum Versand wird die System.Net.Mail.SmtpClient-Klasse verwendet. 

 

LogFileElement (Abschnitt <addLogFile>):

NameBeschreibung
string FileType

Bezug auf den Logfile-Typen, der im Abschnitt <addLoggingType> definiert worden ist.

string FileNameDateiname des Logfiles. Mit Platzhalter %Date% wird der aktuelle Tag im Format "YYYYMMDD" eingefügt. Mit %ProcessId% wird die Prozess-ID eingefügt.
int MaxSizeMBMaximale Dateigröße in MB.
int ArchiveAfterDaysBei einem Wert > 0 werden Logfiles, die älter sind als der angegebene Wert zu einem ZIP-Archiv hinzugefügt.

Zur Ausgabe von Meldungen gibt es zahlreiche Methoden die mit dem Präfix "Log" beginnen. z.B. LogDebug, LogInfo, LogWarning, LogException...

LogDebug ruft eine interne Methode auf und übergibt gip.core.datamodel.eMsgLevel.Debug:

public void LogDebug(string source, string acName, string message)
{ LogMessage(eMsgLevel.Debug, source, acName, message); }

So verhält es sich auch mit den anderen Methoden mit den Endungen Info, Warning, Failure, Error und Exception.

 


IMessages bietet eine weitere Methode mit folgender Signatur an:

public void LogMessageMsg(Msg msg)

Der Parameter "msg" ist vom Typ gip.core.datamodel.Msg. Der Einsatz von Msg hat folgende Vorteile:

  • Mehrsprachigkeit: Meldungen werden in die Sprache des angemeldeten Benutzers übersetzt.
  • Information über den Meldungstyp eMsgLevel. Dies erleichtert dem Empfänger zu beurteilen wie wichtig bzw. kritisch diese Meldung ist. Aus diesem Grund ist es empfehlenswert Methoden mit einem bool-Rückgabewert zu ersetzen durch Msg als Rückgabewert.
  • Serialisierbar. Die Meldung kann im Netzwerk an andere Clients verteilt oder für den SOAP- oder JSON-Service von iPlus verwendet werden.
  • Alarmhandling: Im Steuerungsdialog können Listen von anstehenden Meldungen angezeigt und quittiert werden. Im Alarmexplorer können Alarme gruppiert und nach Ihrer Häufigkeit sortiert werden.
  • Msg kann in anderen Meldungsklassen abgeleitet werden, um eigene Logiken hinzuzufügen. Beispielsweise ist gip.core.datamodel.MsgWithDetails eine solche Klasse, die selbst eine Liste von Msg-Instanzen hat, um z.B. viele Fehlermeldungen zu sammeln, die während einer längeren Operation aufgetaucht sind.  Zum einen, kann diese Liste an der Oberfläche angezeigt werden und zum anderen kann der Empfänger alle Fehlermeldungen auswerten.
  • Msg ist erweiterbar um virtuelle Felder die in XML serialisiert werden. Damit können projektspezifisch noch zusätzliche Informationen gespeichert und in den Alarmlisten angezeigt werden.

 

NameBeschreibung
Guid MsgId

Eindeutige ID

eMsgLevel MessageLevelWichtigkeit der Meldung: Die möglichen Werte sind: Default, Debug, Info, Warning, Failure, Error, Exception, Question
string SourceACUrl der ACComponent-Instanz die diese Meldung generiert hat.
string ACIdentifierDer ACIdentifier ist ein beliebiger String, der vom Programmierer vergeben werden kann. Er dient primär dazu, die richtige Codestelle im Programmcode zu finden. Empfehlenswert ist hier den Methodennamen mit einer eindeutigen Codestellennummer anzugeben z.B. "Start(50)"
string MessageMeldungstext. Entweder wird dieser manuell oder indirekt über die Übersetzungstabelle gesetzt:
string TranslIDEindeutige Text-ID, die im Feld ACIdentifier in Tabelle ACClassMessage gespeichert ist. ACClassMessage enthält alle die übersetzten Meldungstexte (im "Translation tuple"-Format). Über diese ID erfolgt der Zugriff auf den zu übersetzenden Text mit dem die Eigenschaft "Message" gesetzt wird.
DateTime TimeStampOccurredZeitpunkt des Meldungsereignisses
DateTime TimeStampAcknowledgedZeitpunkt der Benutzerbestätigung.
string AcknowledgedByName des Benutzers, der die Meldung bestätigt hat.
ACRef<IACComponent> SourceComponentReferenz zur Instanz, die die Meldung generiert hat.

 

 


Meldungstexte werden unter Menüpunkt "?->Entwicklungsumgebung" verwaltet.
Navigieren Sie dort zur Klasse für die Sie eine neue Meldung benötigen. Öffnen Sie die Registerkarte "Übersetzung" und klicken auf eines der "Neue..."-Tasten:

Es wird eine neue Meldungs-ID generiert und ein neuer Eintrag in die ACClassMessages-Tabelle gemacht. Übersetzen Sie die Texte und speichern Sie die Änderungen.

Wichtig: Meldungstexte werden vererbt! Legen Sie daher immer den Meldungstext immer bei der entsprechenden Klasse an und nicht bei einer Ableitung oder virtuellen Ableitung an.

 

Um Messageboxen bzw. modale Dialoge mit einer Meldung anzuzeigen stellt die IMessage-Schnittstelle Methoden bereit, die ohne den Präfix "Log" beginnen.  

Mittels "enum gip.core.datamodel.eMsgButton" kann gesteuert werden welche Tasten angezeigt werden (OK, Cancel, Yes, No).

Welche Taste der Anwender gedrückt hat, gibt der Rückgabewert der Methoden an der vom Typ "enum gip.core.datamodel.Global.MsgResult" ist. 

Hier einige Beispiele: