Änderungen seit der letzten Veröffentlichung
Im ersten Beispiel sollen die Änderungen, die seit dem Zeitpunkt der letzten Veröffentlichung im Projekt vorgenommen wurden, dargestellt werden.
Es geht um ein Projekt, in dem Gutachten über die Datenquellen-Verwaltung von FirstSpirit verwaltet werden. Bei jeder Veröffentlichung des Projekts soll eine Übersicht der Änderung an den Datensätzen bereitgestellt werden. Zum Ermitteln der Änderungen wird innerhalb der Veröffentlichungsaufträge zunächst ein Post-Deployment-Skript angelegt:
Das Skript ermittelt zuerst die ID der Revision, die zum Zeitpunkt der letzten Veröffentlichung des Projekts aktuell war:
task = context.getTask();
lastExecutionRevisionId = (Long) context.getVariable(task.getName() + ".revision");
if (lastExecutionRevisionId != null) {
context.logInfo("revision of last execution=" + lastExecutionRevisionId);
revId = lastExecutionRevisionId.longValue();}
Anschließend werden alle Revisionen des Projekts seit der letzten Veröffentlichung geholt. Als untere Revisionsgrenze („startRev“) wird dabei die Revision mit der soeben ermittelten Revisions-ID geholt. Als obere Revisionsgrenze wird die aktuelle Revision zum Startzeitpunkt der Veröffentlichung ermittelt:
startRev = project.getRevision(revId);
endRev = project.getRevision(context.getStartTime());
context.logInfo("startRev=" + startRev.id + ", endRev=" + endRev.id);
if (startRev.id == endRev.id) {
context.logInfo("no changes detected");
}
revisions = project.getRevisions(startRev, endRev, 0, null);
Innerhalb einer Schleife werden anschließend alle ermittelten Revisionen auf Änderungen untersucht:
checkChanges(revisions) {
for (revision : revisions) {
metaData = revision.getMetaData();
operation = metaData.getOperation();
if (operation != null) {
type = operation.getType();
switch (type) {
case RevisionOperation.OperationType.CONTENT_COMMIT:
..
..
break;
}
}
}
Dabei sollen hier nur Änderungen an Datenbankinhalten – also vom Operation-Type CONTENT_COMMIT – berücksichtigt werden und zwar nur die neu angelegten und die geänderten Datensätze einer bestimmten Datenbank-Tabelle.
Über:
createdEntities = operation.getCreatedEntities();
releasedEntities = operation.getReleasedEntities();
werden zunächst alle neu erzeugten und alle freigegebenen Datensätze ermittelt. Anschließend wird diese Auswahl auf eine bestimmte Datenbank-Tabelle (hier: MyEntityTypName) eingeschränkt:
ENTITY_TYPE = "MyEntityTypName";
if (ENTITY_TYPE.equals(created.getEntityTypeName())){
..
}
if (ENTITY_TYPE.equals(released.getEntityTypeName())) {
..
}
Zusammenhängend:
case RevisionOperation.OperationType.CONTENT_COMMIT:
createdEntities = operation.getCreatedEntities();
for (created : createdEntities) {
if (ENTITY_TYPE.equals(created.getEntityTypeName())) {
createdCertificates.put(created.getEntityId(), revision);
context.logInfo("\t created entity " + created.getEntityId() + " in revision " + getRevisionString(revision));
}
}
releasedEntities = operation.getReleasedEntities();
for (released : releasedEntities) {
if (ENTITY_TYPE.equals(released.getEntityTypeName())) {
releasedCertificates.put(released.getEntityId(), revision);
context.logInfo("\t released entity " + released.getEntityId() + " in revision " + getRevisionString(revision));
}
}
break;
Anhand der IDs der ermittelten geänderten und freigegeben Datensätze „(created“ und „released“) werden die benötigten Informationen (z. B. die Gutachtennummern) geholt und anschließend zur weiteren Verwendung gespeichert.
context.setProperty("created", createdList);
context.setProperty("updated", updatedList);
Dabei sind die über context.setProperty(..) gespeicherten Werte nur innerhalb des aktuellen Auftrags persistent, können also in einer nachfolgenden Aktion innerhalb des Auftrags mit context.getProperty(..)weiterverwendet werden. In diesem Beispiel werden diese Inhalte in der nachfolgenden Aktion „Mail“, innerhalb der Mailvorlage weiterverwendet:
Hallo,
$CMS_SET(created, #context.getProperty("created"))$$CMS_SET(updated, #context.getProperty("updated"))$
es wurden neue$CMS_IF(created != null)$($CMS_VALUE(created.size)$)$CMS_END_IF$
und geänderte$CMS_IF(updated != null)$($CMS_VALUE(updated.size)$)$CMS_END_IF$
Gutachten auf http://www.gutachten-online.de veröffentlicht.
$CMS_IF(created.size > 0)$Neue Gutachten:
=====================
$CMS_FOR(entity, created)$ * $CMS_VALUE(entity.Gutachtennr)$ ($CMS_VALUE(entity.Datum.format("dd.MM.yy"))$) -
$CMS_VALUE(entity.Kennzeichen)$
$CMS_END_FOR$$CMS_END_IF$
$CMS_IF(updated.size > 0)$Aktualisierte Gutachten:
=====================
$CMS_FOR(entity, updated)$ * $CMS_VALUE(entity.Gutachtennr)$ ($CMS_VALUE(entity.Datum.format("dd.MM.yy"))$) -
$CMS_VALUE(entity.Kennzeichen)$
$CMS_END_FOR$$CMS_END_IF$
--
Dies ist eine automatisch generierte E-Mail, die nach der Veröffentlichung neuer Gutachten verschickt wird.
Bei Fragen wenden Sie sich bitte an info@gutachten-online.de
Die Vorlage erzeugt nun bei der Ausführung eines Veröffentlichungsauftrags eine Email mit den neu erzeugten und den geänderten Inhalten:
Beispiel (Mail):
Hallo,
es wurden neue(4) und geänderte(2) Gutachten auf
http://www.gutachten-online.de
veröffentlicht.
Neue Gutachten:
=====================
* AZ33048/D (10.08.10) - DO-WZ 1234
* AZ45134/D (10.08.10) - DO-XY 4321
* AZ46200/D (11.08.10) - EN-AA 1111
* AZ50261/D (13.08.10) - BO-YZ 5566
Aktualisierte Gutachten:
=====================
* AZ44356/D (10.08.10) - DO-ZZ 3388
* AZ47709/D (05.05.08) - D-YY 9999
--
Dies ist eine automatisch generierte E-Mail, die nach der Veröffentlichung neuer Gutachten verschickt wird.
Bei Fragen wenden Sie sich bitte an info@gutachten-online.de
Inhalte, die über context.setVariable(..) gespeichert wurden, sind auch über die Ausführung des aktuellen Auftragslaufs hinweg persistent (im Gegensatz zum Speichern von Inhalten über context.setProperty(..)). Diese Möglichkeit wird im Beispiel verwendet, um die Revision zum Zeitpunkt des aktuellen Auftrags zu speichern:
context.setVariable(task.getName() + ".revision", new Long(endRev.getId()));
Beim Starten des nächsten Auftrags können diese Informationen dann verwendet werden, um die ID der Revision zu holen, die zum Zeitpunkt der letzten Veröffentlichung des Projekts aktuell war:
lastExecutionRevisionId = (Long) context.getVariable(task.getName() + ".revision");