Ablaufverfolgung und Index analysieren

Anforderung

Mit zunehmender Komplexität der Abläufe in print2forms, insbesondere wenn dynamische Formulare, die vom Inhalt des Druckdatenstroms abhängig sind, im Spiel sind, wird es immer wichtiger, die Ablaufverfolgung genau zu analysieren, um zu erkennen, warum das Druckergebnis nicht genau das ist, was man erwartet hat.

In diesen Fällen sind meist viele reguläre Ausdrücke beteiligt, von denen kontrolliert werden muss, ob sie aktiviert sind, und, für den Fall, dass das Muster erkannt wurde, was die Puffer an gefundenen Druckdaten enthalten.

Das ist in der Anzeige der Ablaufverfolgung innerhalb des Drucker-/Gateway-Services naturgemäß etwas schwierig, weil nur ein begrenzter Ausschnitt des Protokolls sichtbar ist (Längenbeschränkung auf 2048 Zeilen), und weil Möglichkeiten wie Falten oder das Setzen von Lesezeichen nicht zur Verfügung stehen.

Von daher wird die Ablaufverfolgung für eine umfangreiche Analyse meist erst einmal in einen Editor geladen. Hier soll gezeigt werden, wie die Analyse der Ablaufverfolgung und der Indexdatei im Editor unterstützt und effektiver gemacht werden kann.

Mit dem print2forms-Installer Build 289 wurde zudem ein Kontrollfeld eingeführt, das einzelne Gruppen von Meldungen innerhalb der Ablaufverfolgung farblich hervorhebt und so optisch die Orientierung erleichtert. Auch werden so die Strukturen (z. B. einzelne Druckaufträge innerhalb eines Dokumentenprozesses) schnell erfassbar.

Das sollte im Editor idealerweise auch realisiert sein.

Realisierung

Es gibt am Markt sicherlich einige hundert verschiedene Editoren für die unterschiedlichsten Einsatzzwecke, die im Einzelfall auch ihre Existenzberechtigung haben.

Für die Analyse der Ablaufverfolgung haben wir uns den Editor Notepad++ ausgesucht, weil er viele Forderungen an einen Editor für Entwickler erfüllt, weil er Open Source ist, weil er der GPL unterliegt und weil er insbesondere mit grossen, viele zigtausend Zeilen langen Dateien noch flüssig arbeitet. 1)

Die Entwickler von Notepad++ haben für das Syntax-Colouring eine Schnittstelle eingebaut, die die Definition eigener Regeln erlaubt. Jetzt ist eine Log-Datei nicht gerade einer Programmiersprache ähnlich, sodass sich die Einfärbung als nicht ganz so einfach erweist.

Nach einigem Hin und Her und teilweise sehr freier Interpretation von Syntax-Regeln lässt sich Notepad++ aber überreden, die geforderte Aufgabe vorzüglich zu lösen.

Dazu muss die folgende Definition einer benutzerdefinierten Sprache im Notepad++ importiert werden. Anschließend steht im Sprachmenü die neue Sprache p2f-logs zur Verfügung. Der Einfachheit halber ist auch gleich die Dateiendung log mit dieser Sprache verknüpft. 2)

p2f-logs.xml
<NotepadPlus>
    <UserLang name="p2f-Logs" ext="log" udlVersion="2.1">
        <Settings>
            <Global caseIgnored="no" allowFoldOfComments="no" foldCompact="no" forcePureLC="0" decimalSeparator="0" />
            <Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
        </Settings>
        <KeywordLists>
            <Keywords name="Comments">00nect 01 02) 03 04</Keywords>
            <Keywords name="Numbers, prefix1"></Keywords>
            <Keywords name="Numbers, prefix2"></Keywords>
            <Keywords name="Numbers, extras1"></Keywords>
            <Keywords name="Numbers, extras2"></Keywords>
            <Keywords name="Numbers, suffix1"></Keywords>
            <Keywords name="Numbers, suffix2"></Keywords>
            <Keywords name="Numbers, range"></Keywords>
            <Keywords name="Operators1"></Keywords>
            <Keywords name="Operators2"></Keywords>
            <Keywords name="Folders in code1, open">Begin</Keywords>
            <Keywords name="Folders in code1, middle"></Keywords>
            <Keywords name="Folders in code1, close">End</Keywords>
            <Keywords name="Folders in code2, open">&quot;Sender con&quot; &quot;Printer con&quot;</Keywords>
            <Keywords name="Folders in code2, middle"></Keywords>
            <Keywords name="Folders in code2, close">&quot;Sender discon&quot; &quot;Printer discon&quot;</Keywords>
            <Keywords name="Folders in comment, open"></Keywords>
            <Keywords name="Folders in comment, middle"></Keywords>
            <Keywords name="Folders in comment, close"></Keywords>
            <Keywords name="Keywords1">Begin End document process step</Keywords>
            <Keywords name="Keywords2"></Keywords>
            <Keywords name="Keywords3"></Keywords>
            <Keywords name="Keywords4"></Keywords>
            <Keywords name="Keywords5"></Keywords>
            <Keywords name="Keywords6"></Keywords>
            <Keywords name="Keywords7"></Keywords>
            <Keywords name="Keywords8"></Keywords>
            <Keywords name="Delimiters">00Macro 00Font 00Transfer 01 02((EOL)) 02((EOL)) 02((EOL)) 03Pattern 04 05((EOL)) 06Char 07 08((EOL)) 09Match 10 11((EOL)) 12Error 13 14((EOL)) 15Page 16 17((EOL)) 18PJL 18System 18Mapping 19 20((EOL)) 20((EOL)) 20((EOL)) 21Request 21Form 21Access 22 23((EOL)) 23((EOL)) 23((EOL))</Keywords>
        </KeywordLists>
        <Styles>
            <WordsStyle name="DEFAULT" fgColor="4D4D4D" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="COMMENTS" fgColor="8080FF" bgColor="FFFFFF" fontName="" fontStyle="2" nesting="0" />
            <WordsStyle name="LINE COMMENTS" fgColor="E6E600" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="NUMBERS" fgColor="7A7A7A" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS1" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS2" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
            <WordsStyle name="KEYWORDS3" fgColor="E6E600" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS5" fgColor="FF80C0" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="OPERATORS" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
            <WordsStyle name="FOLDER IN CODE1" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="FOLDER IN CODE2" fgColor="E6E600" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="FOLDER IN COMMENT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS1" fgColor="804000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS2" fgColor="008040" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS3" fgColor="D76B00" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS4" fgColor="80FF00" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS5" fgColor="FF0000" bgColor="F9C6DB" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS6" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS7" fgColor="595959" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS8" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
        </Styles>
    </UserLang>
</NotepadPlus>


Mit dieser Sprachdefinition werden nicht nur Farben für die Meldungen innerhalb der Ablaufverfolgung festgelegt, sondern es werden auch drei Regeln für das Falten von ganzen Meldungsblöcken vorgegeben.

Zum einen können die Netzwerkverbindungen zum druckenden Rechner als auch die Verbindungen zum Drucker selbst gefaltet werden. Zum anderen können die einzelnen Bearbeitungsschritte eines Dokumentenprozesses auf- und zugefaltet werden. Das ist im nachstehenden Bild zu sehen. Die ersten zwei Druckaufträge sind gefaltet, und im dritten Druckauftrag sind die beiden Bearbeitungschritte des Dokumentenprozesses gefaltet. Beachten Sie bitte auch einmal die Zeilennummern, um den Effekt der Faltung zu erkennen.



Die Darstellung der Ablaufverfolgung ist fast identisch mit der Darstellung innerhalb des Drucker-/Gateway-Services.

Auch für die Anzeige von print2forms-Indexdateien wurde eine eigene Sprachdefinition für Notepad++ erstellt. Auch diese ist als benutzerdefinierte Sprache im Notepad++ zu importieren. Anschlies­send steht im Sprachmenü die neue Sprache p2f-index zur Verfügung. Der Einfachheit halber ist auch gleich die Dateiendung ctl mit dieser Sprache verknüpft. 3)

p2f-index.xml
<NotepadPlus>
    <UserLang name="p2f-index" ext="ctl" udlVersion="2.1">
        <Settings>
            <Global caseIgnored="no" allowFoldOfComments="no" foldCompact="no" forcePureLC="1" decimalSeparator="0" />
            <Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
        </Settings>
        <KeywordLists>
            <Keywords name="Comments">00 01 02 03[0 03[1 03[2 03[3 03[4 03[5 03[6 03[7 03[8 03[9 03[A 03[B 03[D 04] 04] 04] 04] 04] 04] 04] 04] 04] 04] 04] 04] 04]</Keywords>
            <Keywords name="Numbers, prefix1"></Keywords>
            <Keywords name="Numbers, prefix2"></Keywords>
            <Keywords name="Numbers, extras1"></Keywords>
            <Keywords name="Numbers, extras2"></Keywords>
            <Keywords name="Numbers, suffix1"></Keywords>
            <Keywords name="Numbers, suffix2"></Keywords>
            <Keywords name="Numbers, range"></Keywords>
            <Keywords name="Operators1"></Keywords>
            <Keywords name="Operators2"></Keywords>
            <Keywords name="Folders in code1, open">[Ti</Keywords>
            <Keywords name="Folders in code1, middle"></Keywords>
            <Keywords name="Folders in code1, close">[End]</Keywords>
            <Keywords name="Folders in code2, open"></Keywords>
            <Keywords name="Folders in code2, middle"></Keywords>
            <Keywords name="Folders in code2, close"></Keywords>
            <Keywords name="Folders in comment, open"></Keywords>
            <Keywords name="Folders in comment, middle"></Keywords>
            <Keywords name="Folders in comment, close"></Keywords>
            <Keywords name="Keywords1"></Keywords>
            <Keywords name="Keywords2"></Keywords>
            <Keywords name="Keywords3"></Keywords>
            <Keywords name="Keywords4"></Keywords>
            <Keywords name="Keywords5"></Keywords>
            <Keywords name="Keywords6"></Keywords>
            <Keywords name="Keywords7"></Keywords>
            <Keywords name="Keywords8"></Keywords>
            <Keywords name="Delimiters">00[p2f 00[Client 00[Gateway 00me] 00[Param 01 02((EOL)) 02((EOL)) 02((EOL)) 02((EOL)) 02((EOL)) 03[User 03[Computer 03[Model 03[Job 04 05((EOL)) 05((EOL)) 05((EOL)) 05((EOL)) 06[File 06[Process 06[Page 07 08((EOL)) 08((EOL)) 08((EOL)) 09[C 09[F 10 11] 11] 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
        </KeywordLists>
        <Styles>
            <WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="COMMENTS" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="LINE COMMENTS" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="512" />
            <WordsStyle name="NUMBERS" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS1" fgColor="00FF00" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS3" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="OPERATORS" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="FOLDER IN CODE1" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="FOLDER IN CODE2" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="FOLDER IN COMMENT" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS1" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS2" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS3" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS4" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
            <WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
        </Styles>
    </UserLang>
</NotepadPlus>


Mit dieser Sprachdefinition werden nicht nur Farben für die Zeilen der Indexdatei festgelegt, sondern es wird auch eine Regel für das Falten von ganzen Druckaufträgen vorgegeben. Im nachstehenden Bild ist zu sehen, dass der erste Druckauftrag komplett zusammengefaltet ist, was auch an den springenden Zeilennummern zu erkennen ist.



Bemerkungen





1)
Aus dem letztgenannten Grund scheidet Visual Studio Code für diesen Zweck aus. Aufgrund der Tatsache, dass der Editor letztlich auf Electron basiert, wird er irgendwann sehr behäbig - selbst auf Boliden von Rechnern.

2)
Die Verknüpfung mit der Dateiendung log kann im Definitionsdialog für benutzerdefinierte Sprachen natürlich aufgehoben werden.

3)
Die Verknüpfung mit der Dateiendung ctl kann im Definitionsdialog für benutzerdefinierte Sprachen natürlich aufgehoben werden.