TimoMeister
Returning Responder

Script: Vor Freigabe validieren

Jump to solution

Hallo zusammen,

ich würde gerne Objekte mit Hilfe eines Workflow und eines Scripts freigeben. Das geht ja mit der Server-Freigabe "AccessUtil.release()".

Wie prüfe ich den davor ob eine Seite valide ist? Wir haben viele Regeln, die auf ON_RELEASE basieren.

Problem ist, sobald eine Seite nicht valide ist, wirft das Script mir ein Fehler zurück und die Seite bleibt im Arbeitsablauf stecken.

Danke für eure Antworten.

0 Kudos
1 Solution

Accepted Solutions

Hallo,

da ich es gerade sowieso selbst benutzt hatte hier ein Minimalbeispiel:

final MultiFormValidationReport validationReport = context.requireSpecialist(ValidationAgent.TYPE).validate(idProvider, ValidationAgent.ValidationScope.RELEASE);

result= validationReport.isValid(); //true if everything is OK

Der idProvider ist dann z.B. die Seite.

Achtung: Enthaltene Absätze werden hier nicht mitgeprüft, hierfür müssten entsprechend separate Aufrufe benutzt werden.

Alternative:

Ein Release per AccessUtil im "Testmodus" versuchen und sich dann die problematischen Elemente bzgl. ReleaseProgress.ProblemType.VALIDATION_FAILED geben lassen. Das wäre aber etwas mehr Code.

Hier muss man außerdem aufpassen, auf was genau geprüft werden soll - man könnte z.B. auf die Idee kommen, generell bei einem "Misserfolg" des allgemeinen Release-Tests abzubrechen. Gerade wenn mehrere Elemente im Spiel sind, passt das aber nicht unbedingt.

Beispiel: Testet man die (gemeinsame!) Freigabemöglichkeit einer Seitenreferenz und einer noch nie freigegebenen Inhaltsseite (ohne Validierungsprobleme!), auf die diese Seitenreferenz verweist, kommt es - im Testmodus - natürlich zu einem anderen Fehler weil beim Freigabetest der Seitenreferenz die Inhaltsseite eben noch nicht freigegeben ist.

Viele Grüße

Michael

View solution in original post

0 Kudos
6 Replies
feddersen
Community Manager

Das ist über die Klasse ValidationAgent möglich.

TimoMeister
Returning Responder

Danke für Ihre schnelle Antwort.

Können Sie mir ein kurzes Beispiel geben?

0 Kudos

Hallo,

da ich es gerade sowieso selbst benutzt hatte hier ein Minimalbeispiel:

final MultiFormValidationReport validationReport = context.requireSpecialist(ValidationAgent.TYPE).validate(idProvider, ValidationAgent.ValidationScope.RELEASE);

result= validationReport.isValid(); //true if everything is OK

Der idProvider ist dann z.B. die Seite.

Achtung: Enthaltene Absätze werden hier nicht mitgeprüft, hierfür müssten entsprechend separate Aufrufe benutzt werden.

Alternative:

Ein Release per AccessUtil im "Testmodus" versuchen und sich dann die problematischen Elemente bzgl. ReleaseProgress.ProblemType.VALIDATION_FAILED geben lassen. Das wäre aber etwas mehr Code.

Hier muss man außerdem aufpassen, auf was genau geprüft werden soll - man könnte z.B. auf die Idee kommen, generell bei einem "Misserfolg" des allgemeinen Release-Tests abzubrechen. Gerade wenn mehrere Elemente im Spiel sind, passt das aber nicht unbedingt.

Beispiel: Testet man die (gemeinsame!) Freigabemöglichkeit einer Seitenreferenz und einer noch nie freigegebenen Inhaltsseite (ohne Validierungsprobleme!), auf die diese Seitenreferenz verweist, kommt es - im Testmodus - natürlich zu einem anderen Fehler weil beim Freigabetest der Seitenreferenz die Inhaltsseite eben noch nicht freigegeben ist.

Viele Grüße

Michael

0 Kudos

Hallo Michael,

Danke für deine Antwort. Dein Alternativweg klingt spannend.

Wie rufe ich dann die Methode ReleaseProgress auf?

0 Kudos

Hallo Timo,

hier mal ein Stückchen Code wie es (in etwa) funktionieren sollte (nicht ausführlich getestet, nur als Einstiegspunkt!).

Achtung: Das funktioniert nicht auf Datasets, die lassen sich nicht per AccessUtil freigeben - d.h. dafür müsstest Du wieder den ValidationAgent benutzen. Die continues kommen daher dass ich im Ursprungscode eine Liste von IDProvidern in einer Schleife abfrage - also ggf. durch eine andere Logik ersetzen 😉

Ggf. kannst Du hier schon (mit "alles OK") abbrechen wenn das serverActionHandle.getResult(); ein Boolean.TRUE zurück liefert.

Store store=...

IDProvider idProvider=...

Boolean result=true;

String elementInfo=store.getName()+"/"+idProvider.getElementType()+"/"+(idProvider.hasUid()?("UID:"+idProvider.getUid()):("ID:"+idProvider.getId()));

final ServerActionHandle<? extends ReleaseProgress, Boolean> serverActionHandle = AccessUtil.release(idProvider, true);

try {

     serverActionHandle.getResult();

} catch (Exception e) {

     Logging.logError("Release Check threw exception", e, getClass());

     return false;

}

final ReleaseProgress releaseResult = serverActionHandle.getProgress(true);

final EnumMap<ReleaseProgress.ProblemType, Set<Long>> problematicElements = releaseResult.getProblematicElements();

String passedMessage="PASSED: "+elementInfo;

if (problematicElements.isEmpty()) {

     Logging.logDebug(passedMessage,getClass());

     continue;

}

final Set<Long> problematicIds = problematicElements.get(ReleaseProgress.ProblemType.VALIDATION_FAILED);

if(problematicIds==null){

     Logging.logDebug(passedMessage,getClass());

     continue;

}

if (problematicIds.contains(idProvider.getId())) {

     result=false;

}

...

return result;

Viele Grüße

Michael

marza
I'm new here

Hallo Timo,

benötigst Du noch weitere Hilfe oder haben Dir die Antworten von Christoph und Michael bereits geholfen?

In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere

Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung

gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Viele Grüße

Marian Zaplatynski

0 Kudos