Damit die Suche Texte in Dateien finden kann, müssen aus diesen der textuelle Teil herausgefiltert werden. Falls notwendige Dateitypen durch den Standard nicht abgedeckt werden, können eigene Parser implementiert werden.
Vorgehensweise
Um einen eigenen Dateiparser zu entwickeln muss eine neue Klasse erstellt werden, die das Interface IAttachmentParser
implementiert.
Damit ist folgende Methodensignatur vorgegeben public void Parse(AttachmentInfo attachment);
Weiterhin ist es erforderlich, dass die Klasse das Attribut AttachmentParserAttribute
verwendet. Dieses bekommt als Parameter einen eindeutigen Namen, sowie eine Liste mit Dateierweiterungen, für die es anspricht. Diese Liste ist ein String, der die Dateitypen kommasepariert enthält. Als eindeutiger Name wird Namespace + Klassenname des Parsers empfohlen, andere Namen sind zulässig.
Wichtig: Parser dürfen für Attachments aus BusinessApp nur die Property TextContent
verändern und ggf. InnerAttachments
befüllen. Die anderen Properties werden zum Erkennen von Änderungen am ORM benutzt.
TextContent
sollte die Wörter, die über die Suche einzeln gefunden werden sollen, per Leerzeichen getrennt enthalten. Groß- und Kleinschreibung spielt dagegen keine Rolle.InnerAttachments
wird benötigt, falls ein Parser für z.B. ZIP-Dateien oder andere Archivformate entwickelt wird. Für InnerAttachments werden wieder Objekte vom TypAttachmentInfo
angelegt. In diesem Fall dürfen auch andere Properties, wie z.B.FileName
befüllt werden.
Auf Basis der Assembly Typen werden die Parser vorgezogen, falls für eine Dateierweiterung mehrere Parser existieren. Darüber hinaus kann diese Vorgehensweise durch die Customer.config überschrieben werden. (Siehe Doku der Customer.config).
Beispiel für die Implementierung
Soll ein eigener Excel-Parser implementiert werden, bietet sich z.B. folgender Code an:
[AttachmentParser("BA.ProjectName.AttachmentParser.ExcelParser", ".xlsx,.xlsm")]
public class ExcelParser : IAttachmentParser
{
public void Parse(AttachmentInfo attachment)
{
using (MemoryStream stream = new MemoryStream(attachment.Data))
{
string parseResult = GetTextFromExcel(stream); // business logic for parsing the file
attachment.TextContent = parseResult;
}
}
}
Falls die Datei, die geparsed werden soll, ein Container / Archiv ist, also selbst Dateien enthält, muss für die inneren Dateien jeweils wieder ein Parser aufgerufen werden.
Dies geht mit
AttachmentParserLocator.GetParser(string fileExtension).Parse(AttachmentInfo attachment)