Hamburger Rathaus
  • Thomas Pollinger
  • 15.04.2019
  • DE

RQL-Befehle in benutzerdefinierten Aufträgen: Platzhalter

Im letzten Artikel RQL-Befehle in benutzerdefinierten Aufträgen: Übersicht aus dieser Serie haben wir uns mit der allgemeinen Übersicht und Funktionweise von benutzerdefinierten Aufträgen beschäftigt. Jedoch war das noch nicht alles, was innerhalb von diese Aufträgen passiert bzw. genutzt werden kann.

Heute möchte ich mich dem Thema - Platzhalter Syntax- und Ersetzungsmechanismus - innerhalb der RQL-Befehle beschäftigen und diese näher erläutern. Denn es handelt sich hier bei um einen wichtigen Bestandteil der Funktionsweise und diese sollte man verstanden haben.
 

Funktionsweise

Für benutzerdefinierte Aufträge kann eine bestimmte Platzhalter-Syntax genutzt werden. Diese ist bereits aus der RQL-Dokumentation bekannt und wird auch dort verwendet.

  • Attribute stehen in eckigen Klammern und Ausrufezeichen, z. B: [!guid_login!].
  • Der Unterstrich ist ein Trennzeichen zwischen dem Typ und Knotennamen des Platzhalters.

Solche Attribute können während der Laufzeit erkannt werden und werden durch konkrete Werte ersetzt, welche durch die vorherige Ausführung von RQL-Statements identifiziert wurden. Wenn ein Benutzer angemeldet ist, wird zum Beispiel die LoginGUID identifiziert und kann in allen weiteren RQL-Statements ersetzt werden.

Der Mechanismus funktioniert wie folgt:

  1. Anmelden des Benutzers
  2. Ersetzen der Platzhalter
  3. Ausführen des ersten RQL-Befehls
  4. Ersetzen der Platzhalter
  5. Ausführen des nächsten RQL-Befehls
  6. Ersetzen der Platzhalter
  7. Abmelden des Benutzers

Die Ersetzung der Platzhalter funktioniert wie folgt:

  1. Prüfe zuerst ob der Platzhalter im Ergebnis enthalten ist. Zum Beispiel wird für den Platzhalter [!guid_login!] nach dem Attribut loginguid gesucht.
  2. Wenn diese Suche nicht erfolgreich ist, wird nach einem LOGIN-XML-Knoten mit dem Attribut GUID gesucht. Der Platzhalter wird mit dem Wert des ersten Treffers ersetzt. Nach jeder weiteren Ausführung eines RQL-Befehls werden alle Attribute erneut ausgewertet. So ist es möglich, komplexe Aufträge mit mehreren RQL-Befehlen durchzuführen.

Beispiele:

<RQLCOMMAND type="for" 
    name="PROJECTS">
    <!-- Deletes publication job reports from the database (IO_EXR) and publication log files from the Management Server instance this job runs on. -->
    <!-- List all projects to apply the OBJECTIVES commands to them. -->
    <LIST>
        <IODATA loginguid="[!guid_login!]" 
            sessionkey="">
            <ADMINISTRATION>
                <USER guid="[!guid_user!]">
                    <PROJECTS action="list" 
                        extendedinfo="1" />
                </USER>
            </ADMINISTRATION>
        </IODATA>
    </LIST>
    <!-- The commands in the OBJECTIVES element are executed for all result elements of the LIST element -->
    <OBJECTIVES>
        <!-- Connect to the current project -->
        <IODATA loginguid="[!guid_login!]">
            <ADMINISTRATION action="validate" 
                guid="[!guid_login!]">
                <PROJECT guid="[!guid_project!]" />
            </ADMINISTRATION>
        </IODATA>
        <!-- Remove the publishing reports and and logfiles for the current project if they are older than seven days (days="7") -->
        <IODATA loginguid="[!guid_login!]" 
            sessionkey="[!guid_login!]">
            <PROJECT guid="[!guid_project!]" 
                sessionkey="[!guid_login!]">
                <EXPORTREPORT days="7" 
                    action="deleteall" 
                    deletelogfiles="1" />
            </PROJECT>
        </IODATA>
    </OBJECTIVES>
</RQLCOMMAND>

Diese benutzerdefinierte Auftrag läuft wie folgt ab, dazu zerlege ich ihn in die Teile REQEUST: und RESPONSE:. Diese Infos bekommt man aus den bekannten Logs wie wsms.log oder dem Job-Report selbst.

REQEUST-001:

<IODATA>
    <ADMINISTRATION action="login" 
        name="Admin" 
        checkonly="1"/>
</IODATA> 

Und man erhält das korrekt Ergebnis für den nächsten Anschnitt im Auftrag.

RESPONSE-001:

<IODATA>
    <LOGIN guid="E1B3501F8E3C48FB91521EA0A4011FC5" 
        server="WIN-OTWSM-16X" 
        serverguid="80912FB47C834A289312F58C49B5CF3D" 
        userkey="" 
        usertoken="" 
        name="Admin"/>
    <USER guid="7C4F7FF5744C43A4B537DB97BF4A815D" 
        name="Admin" 
        fullname="Administrator" 
        id="1" 
        flags1="0" 
        flags2="32768" 
        dialoglanguageid="DEU" 
        preferrededitor="0" 
        taskpreviewmode="2" 
        invertdirectedit="0" 
        invertdropmode="" 
        dialogtextdirection="" 
        languageid="DEU" 
        showstarthelp="0" 
        lcid="1031">
        <MODULES>
            <MODULE guid="4656D1A8354A4812BCA17C2564A00D2B" 
                id="servermanager" 
                name="13772" />
            <MODULE guid="19234F30BB984D938520CDC5E0B1EAD4" 
                id="cms" 
                name="0">
                <MODULES>
                    <MODULE guid="37542EE2585545D188BEFB6801B1C971" 
                        id="smarttree" 
                        name="13769" />
                    <MODULE guid="552284EC17D24267A813012561180A26" 
                        id="templateeditor" 
                        name="13771" />
                    <MODULE guid="30265560D1E3462DB808699637681497" 
                        id="smartedit" 
                        name="13770" />
                    <MODULE guid="92E972B2FB87428cAC58C8DC8450B7E5" 
                        id="tasks" 
                        name="2215" />
                    <MODULE guid="EAA81F8C9D544633B3B94254F537B3BC" 
                        id="search" 
                        name="18274" />
                </MODULES>
            </MODULE>
            <MODULE guid="E3E1678FB2E14470B4D2951123B44E18" 
                id="assets" 
                name="13773" />
        </MODULES>
        <LASTMODULES>
            <MODULE project="FCD226ACB77B468C9DDAE2F4B472D4D3" 
                projectname="Xample" 
                lastid="smarttree" 
                lastguid="37542EE2585545D188BEFB6801B1C971" 
                id="smarttree" 
                guid="37542EE2585545D188BEFB6801B1C971" 
                last="0" />
            <MODULE project="92EAB46013E04748AD29910824795114" 
                projectname="New project" 
                lastid="servermanager" 
                lastguid="4656D1A8354A4812BCA17C2564A00D2B" 
                id="servermanager" 
                guid="4656D1A8354A4812BCA17C2564A00D2B" 
                last="0" />
            <MODULE project="EA11225008D94B6D82403EC0837F83BC" 
                projectname="Product Information Catalog" 
                lastid="smarttree" 
                lastguid="37542EE2585545D188BEFB6801B1C971" 
                id="smarttree" 
                guid="37542EE2585545D188BEFB6801B1C971" 
                last="0" />
            <MODULE project="3743BCA1BF564DDEB1CD09C356D01203" 
                projectname="OTCS Ticket 3102325" 
                lastid="servermanager" 
                lastguid="4656D1A8354A4812BCA17C2564A00D2B" 
                id="servermanager" 
                guid="4656D1A8354A4812BCA17C2564A00D2B" 
                last="0" />
            <MODULE project="9E1937E3D3B24F5FA01BBE10A7ADFFCE" 
                projectname="Demo-Projekt Schlagworte und Navigation" 
                lastid="servermanager" 
                lastguid="4656D1A8354A4812BCA17C2564A00D2B" 
                id="servermanager" 
                guid="4656D1A8354A4812BCA17C2564A00D2B" 
                last="0" />
            <MODULE project="78E3E8867DB6467EAABC38703C3C882C" 
                projectname="OTCS Ticket 4067703" 
                lastid="smarttree" 
                lastguid="37542EE2585545D188BEFB6801B1C971" 
                id="smarttree" 
                guid="37542EE2585545D188BEFB6801B1C971" 
                last="0" />
            <MODULE project="BA6B979C93FD4875AFE694CC5288745C" 
                projectname="OT-WSM-Blog" 
                lastid="servermanager" 
                lastguid="4656D1A8354A4812BCA17C2564A00D2B" 
                id="servermanager" 
                guid="4656D1A8354A4812BCA17C2564A00D2B" 
                last="1" />
            <MODULE project="3AF47BB37CA24C569673C8BBE14C3C38" 
                projectname="RQLCommands" 
                lastid="servermanager" 
                lastguid="4656D1A8354A4812BCA17C2564A00D2B" 
                id="servermanager" 
                guid="4656D1A8354A4812BCA17C2564A00D2B" 
                last="0" />
            <MODULE project="1686D0DD0E674602B47EF55689A7085F" 
                projectname="Collecting Navigation" 
                lastid="smarttree" 
                lastguid="37542EE2585545D188BEFB6801B1C971" 
                id="smarttree" 
                guid="37542EE2585545D188BEFB6801B1C971" 
                last="0" />
        </LASTMODULES>
    </USER>
</IODATA>  

REQEUST-002:

In dieser Abfrage werden die Attribute mit den Werten aus dem vorherigen Ergebnis:

<RQLCOMMAND type="for" 
    name="PROJECTS">
    <LIST>
        <IODATA loginguid="[!guid_login!]" 
            sessionkey="">
            <ADMINISTRATION>
                <USER guid="[!guid_user!]">
                    <PROJECTS action="list" 
                        extendedinfo="1" />
                </USER>
            </ADMINISTRATION>
        </IODATA>
    </LIST>
...

über die automatische Ersetzung während der Laufzeit mit dem jeweils korrekten Wert befüllt:

<IODATA loginguid="E1B3501F8E3C48FB91521EA0A4011FC5" 
    sessionkey="">
    <ADMINISTRATION>
        <USER guid="7C4F7FF5744C43A4B537DB97BF4A815D">
            <PROJECTS action="list" 
                extendedinfo="1" />
        </USER>
    </ADMINISTRATION>
</IODATA>

 

RESPONSE-002:

<IODATA>
    <USER guid="7C4F7FF5744C43A4B537DB97BF4A815D">
        <PROJECTS action="list" 
            extendedinfo="1" 
            parentguid="7C4F7FF5744C43A4B537DB97BF4A815D" 
            parenttype="USR" 
            newprojectcreatable="1">
            <PROJECT guid="1686D0DD0E674602B47EF55689A7085F" 
                name="Collecting Navigation" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="0" 
                lockinfo="" 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="1" />
            <PROJECT guid="9E1937E3D3B24F5FA01BBE10A7ADFFCE" 
                name="Demo-Projekt Schlagworte und Navigation" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being updated." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="92EAB46013E04748AD29910824795114" 
                name="New project" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="-1" 
                lockinfo="test" 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="1" 
                userlevel="1" 
                templateeditorright="0" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="3743BCA1BF564DDEB1CD09C356D01203" 
                name="OTCS Ticket 3102325" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being updated." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="78E3E8867DB6467EAABC38703C3C882C" 
                name="OTCS Ticket 4067703" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being updated." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="BA6B979C93FD4875AFE694CC5288745C" 
                name="OT-WSM-Blog" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="0" 
                lockinfo="" 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="EA11225008D94B6D82403EC0837F83BC" 
                name="Product Information Catalog" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being updated." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="3AF47BB37CA24C569673C8BBE14C3C38" 
                name="RQLCommands" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="0" 
                lockinfo="" 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="FCD226ACB77B468C9DDAE2F4B472D4D3" 
                name="Xample" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="0" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being updated." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="1ADD892F54F448788F55CBFF92CFF02D" 
                name="Xample 16.0.3" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being imported." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
            <PROJECT guid="CD554865D941499FAF6BF5F05B1ABE2B" 
                name="Xample 16.0.3 (ASPX)" 
                servername="WIN-OTWSM-16X" 
                server="WIN-OTWSM-16X" 
                versioning="-1" 
                archive="-1" 
                testproject="1" 
                inhibitlevel="16" 
                lockinfo="This project has been automatically locked against publication after being imported." 
                checkdatabase="016.224" 
                lockedbysystem="0" 
                inhibit="0" 
                userlevel="1" 
                templateeditorright="-1" 
                languagemanagerright="0" 
                denyprojectsettings="0" 
                denyadministerpublication="0" />
        </PROJECTS>
    </USER>
</IODATA> 

und so geht das immer automatisch weiter.


REQEUST-003:

Dieser Request wird dann, je nach Anzahl der Ergebnisse, mehrfach wiederholt. Dabei werden ebenfalls die Attribute entsprechend ersetzt:

...
    <OBJECTIVES>
        <!-- Connect to the current project -->
        <IODATA loginguid="[!guid_login!]">
            <ADMINISTRATION action="validate" 
                guid="[!guid_login!]">
                <PROJECT guid="[!guid_project!]" />
            </ADMINISTRATION>
        </IODATA>
...
...
<IODATA loginguid="E1B3501F8E3C48FB91521EA0A4011FC5">
    <ADMINISTRATION action="validate" 
        guid="E1B3501F8E3C48FB91521EA0A4011FC5" 
        checkonly="1">
        <PROJECT guid="1686D0DD0E674602B47EF55689A7085F" />
    </ADMINISTRATION>
</IODATA>
...

 

RESPONSE-003:

<IODATA>
    <PROJECT guid="1686D0DD0E674602B47EF55689A7085F" 
        name="Collecting Navigation" 
        reddotstartpageguid="FFB318284E784C7B9FFA2D6B48E04378" 
        flags="7" 
        versioning="1" 
        archive="1" 
        testproject="1" 
        filestream="0" 
        useexterneditor="1" 
        externeditor="CKEditor" 
        externeditorurl="" 
        requestexterneditortext="" 
        setnamesonlyinmainlanguage="0" 
        templaterelease="1" 
        contentclassversioning="2" 
        ignoreusertexteditorpreferences="0" 
        liveserverguid="" 
        donotloadtexteditorinform="0" 
        preventpageclosing="0" 
        executevirtualpath="" 
        executephysicalpath="" 
        assetfilenamerestriction="/^[^\\\/&lt;&gt;:*?&quot;&amp;%\+]{4,150}$/i" 
        pagefilenamerestriction="/^[a-z0-9_\-\.]*$/i" 
        assetfileendingsfortexteditor="jpg; gif; png; svg" 
        limitassetstofileendings="1" 
        mainlanguagevariantid="DEU" />
    <USER guid="7C4F7FF5744C43A4B537DB97BF4A815D" 
        userid="1" 
        flags1="2088984" 
        flags2="48716" 
        maxlevel="1" 
        isservermanager="-1" 
        dialoglanguageid="DEU" 
        lcid="1031" 
        dialoglcid="1031" 
        languagevariantlcid="1031" 
        projectguid="1686D0DD0E674602B47EF55689A7085F" 
        te="-1" 
        level="1" 
        denyprojectsettings="0" 
        denyadministerpublication="1" 
        lm="0" 
        mainlanguagevariantid="DEU" 
        languagevariantid="DEU" 
        languagevariantguid="AAE987B097E548DF934A9432892FDDBA" 
        mainlanguagevariantguid="AAE987B097E548DF934A9432892FDDBA" 
        rights1="-1" 
        rights2="-1" 
        rights3="-1" 
        rights4="-1" />
    <SERVER guid="17BED1BDBBD94CF0AC897187C6FB25AE" 
        name="" 
        key="E1B3501F8E3C48FB91521EA0A4011FC5" />
    <LICENSE userguid="7C4F7FF5744C43A4B537DB97BF4A815D" 
        projectguid="1686D0DD0E674602B47EF55689A7085F" 
        te="-1" 
        lm="0" 
        denyprojectsettings="0" 
        denyadministerpublication="1" 
        level="1" 
        id="cms" />
</IODATA> 

REQEUST-004:

...
        <IODATA loginguid="[!guid_login!]" 
            sessionkey="[!guid_login!]">
            <PROJECT guid="[!guid_project!]" 
                sessionkey="[!guid_login!]">
                <EXPORTREPORT days="7" 
                    action="deleteall" 
                    deletelogfiles="1" />
            </PROJECT>
        </IODATA>
    </OBJECTIVES>
</RQLCOMMAND>

 

<IODATA loginguid="E1B3501F8E3C48FB91521EA0A4011FC5" 
    sessionkey="E1B3501F8E3C48FB91521EA0A4011FC5">
    <PROJECT guid="1686D0DD0E674602B47EF55689A7085F" 
        sessionkey="E1B3501F8E3C48FB91521EA0A4011FC5">
        <EXPORTREPORT days="7" 
            action="deleteall" 
            deletelogfiles="1" />
    </PROJECT>
</IODATA> 

 

RESPONSE-004:

<IODATA>
    <EXPORTREPORT days="7" 
        action="deleteall" 
        deletelogfiles="1" 
        languagevariantid="DEU" 
        dialoglanguageid="DEU" 
        projectguid="1686D0DD0E674602B47EF55689A7085F" />
</IODATA>

Fazit

Der Ersetzungsmechanismus ist eine sehr hilfreiche Unterstützung, ohne diese Funktionalität währe es nicht möglich solche benutzerdefinierten Aufträge zu realisieren. Es gibt zwei Arten, wie nach den Platzhaltern gesucht wird.

Variante 1: [!guid_login!] => Attributname loginguid=""

Variante 2:  [!guid_login!] => Tag- und Attributname <LOGIN guid="" ... />

Laut der Online-Hilfe gilt die Regel: Variante 1 wird vor Variante 2 ausgeführt.

Im nächsten Artikel RQL-Befehle in benutzerdefinierten Aufträgen: for-Schleife aus dieser Themenserie, werden wir uns die erste Kontrollstruktur genauer ansehen.

Bis dahin, viel Spaß beim stöbern ;)


Über den Autor:
Thomas Pollinger

... ist Senior Site Reliability Engineer bei der Vodafone GmbH in Düsseldorf. Seit dem Jahr 2007 betreut er zusammen mit seinen Kollegen die OpenText- (vormals RedDot-) Plattform Web Site Management für die deutsche Konzernzentrale.

Er entwickelt Erweiterungen in Form von Plug-Ins und PowerShell Skripten. Seit den Anfängen in 2001 (RedDot CMS 4.0) kennt er sich speziell mit der Arbeitweise und den Funktionen des Management Server aus.