AndreasOesterle
I'm new here

Dateiänderungsflag über Versionshistorie auslesen

Hallo zusammen,

ich möchte zu einer Mediendatei die Version über die API ausrechnen. Hierzu möchte ich in der Versionshistorie über alle Revisions loopen und prüfen wie oft die Datei geändert wurde.

Öffnet man zu einem Medium die Versionshistorie, dann kann man auch das Flag "Datei" sehen.

Medienhistorie - Dateiänderung.jpg

Jetzt weiss ich nur nicht wie man an das Flag über die API kommt.

Ich habe schon einiges versucht. Auf dem Interface Revision gibt es die Methode getMetaData die ein RevisionMetaData Objekt zurückgibt. Ich nehme an hier muss ich über die Methode getChangedStoreElements die Details auslesen. GetOperation liefert wohl nicht diese Information. Wie ich die verschachtelte Map allerdings auslesen muss um an diese Information zu kommen ist mir rätselhaft. Mir scheint es auch so, dass wenn ich die Methode getChangedStoreElements aufrufe, eine Map<ChangeType,RevisionChangeDetail> aller StoreElements des Projekts bekomme und nicht nur von meinem Medienobjekt. So muss ich dann kompliziert über alle Nodes drüber loopen um wieder auf mein Medienobjekt zu kommen. Habe ich dann die Map<ChangeType,RevisionChangeDetail> weiss ich nicht wie ich jetzt genau mein gewünschtes Flag bekomme. Kann mir hier einer weiterhelfen?

Aktuell habe ich folgendes probiert:


$CMS_SET(revisions, st_internal_document.get().getHistory())$

    $CMS_SET(version, 0)$


$CMS_FOR(revision, revisions)$
   $CMS_SET(changedElements, revision.getMetaData().getChangedStoreElements())$
   $CMS_FOR(key, changedElements.keySet())$
       $CMS_IF(key.getNodeId() == st_internal_document.get().getId())$
          $CMS_SET(basicInfo, changedElements.get(key))$
          $CMS_FOR(bs, basicInfo.keySet())$
  

          $-- Hier möchte ich eigentlich die Versionsnumemr hochzählen. Weil ich aber nicht weiss auf was prüfen, gebe ich einmal den Text als Debug aus --$

          $CMS_SET(version, version + " " + bs.toString())$

          $CMS_END_FOR$
       $CMS_END_IF$
     $CMS_END_FOR$

    $CMS_END_FOR$

4 Replies
kohlbrecher
Crownpeak employee

Hallo Andreas,

was meinst du mit "Version über die API ausrechnen"? Wenn ich dich richtig verstanden habe, ist das ja das eigentliche Problem oder?

Grüße

Jan

0 Kudos

Hallo Jan,

ich möchte in der Versionshistorie zu einem Medium schauen wie oft die Datei modifiziert wurde. Ist die Datei 3Mal modifiziert, dann ist die Version des Mediums 3.

Hierzu möchte ich jetzt das Datei ändern Flag per API auslesen.

VG
Andreas

0 Kudos

Hallo Andreas,

ich fürchte es gibt nur einen Weg der etwas dirty ist. Man kann sich aus den Metadaten einer Revision die zugehörigen Dateien holen und dessen Typ prüfen. Nachstehend ein Beispiel:

historie.jpg

Untersuchung der Revisionen:

bsh % e.getHistory().get(0).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@5934{type=REVISION, id=1, revision=22836},

de.espirit.storage.backend.FileImpl@5931{type=REVISION_META, id=1, revision=22836},

de.espirit.storage.backend.FileImpl@2cd981{type=MEDIA_STORE_NODE_XML, id=2916544, revision=22836}]>

bsh % e.getHistory().get(1).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@5933{type=REVISION, id=1, revision=22835},

de.espirit.storage.backend.FileImpl@5936{type=REVISION_META, id=1, revision=22835},

de.espirit.storage.backend.FileImpl@2cd986{type=MEDIA_STORE_NODE_XML, id=2916544, revision=22835}]>

bsh % e.getHistory().get(2).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@5932{type=REVISION, id=1, revision=22834},

de.espirit.storage.backend.FileImpl@5937{type=REVISION_META, id=1, revision=22834},

de.espirit.storage.backend.FileImpl@2cd987{type=MEDIA_STORE_NODE_XML, id=2916544, revision=22834}]>

bsh % e.getHistory().get(3).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@5931{type=REVISION, id=1, revision=22833},

de.espirit.storage.backend.FileImpl@5934{type=REVISION_META, id=1, revision=22833},

de.espirit.storage.backend.FileImpl@2cd964{type=MEDIA_STORE_FILE, id=2916544, revision=22833}]>

bsh % e.getHistory().get(4).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@5930{type=REVISION, id=1, revision=22832},

de.espirit.storage.backend.FileImpl@5935{type=REVISION_META, id=1, revision=22832},

de.espirit.storage.backend.FileImpl@2cd985{type=MEDIA_STORE_NODE_XML, id=2916544, revision=22832}]>

bsh % e.getHistory().get(7).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@592d{type=REVISION, id=1, revision=22829},

de.espirit.storage.backend.FileImpl@5928{type=REVISION_META, id=1, revision=22829},

de.espirit.storage.backend.FileImpl@2cd978{type=MEDIA_STORE_FILE, id=2916544, revision=22829}]>

Die Einträge aus der Versionshistorie die für den Dateiuplad stehen beinhalten somit immer ein File Objekt vom Typ "MEDIA_STORE_ELEMENT". Mann kann es also so ermitteln:

bsh % e.getHistory().get(7).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@592d{type=REVISION, id=1, revision=22829},

de.espirit.storage.backend.FileImpl@5928{type=REVISION_META, id=1, revision=22829},

de.espirit.storage.backend.FileImpl@2cd978{type=MEDIA_STORE_FILE, id=2916544, revision=22829}]>

bsh % unmodifiableList = e.getHistory().get(7).getMetaData().getFiles();

<[de.espirit.storage.backend.FileImpl@592d{type=REVISION, id=1, revision=22829},

de.espirit.storage.backend.FileImpl@5928{type=REVISION_META, id=1, revision=22829},

de.espirit.storage.backend.FileImpl@2cd978{type=MEDIA_STORE_FILE, id=2916544, revision=22829}]>

bsh % array = unmodifiableList.toArray();

<[Ljava.lang.Object;@139af68>

bsh % array[2].getType().toDebugString();

<MEDIA_STORE_FILE>

bsh % array[2].getType().toDebugString() == "MEDIA_STORE_FILE";

<true>

Nicht besonders schön, sollte aber funktionieren

Gruß, Hendrik

Besten Dank! Über die Methode getFiles habe ich es noch nicht versucht die Metadaten auszulesen.

Ich habe jetzt eine Implementierung hinbekommen, die funktioniert, aber noch nicht ganz sauber ist. Ich habe den Code um Kommentaren ergänzt. Eventuell kann jemand noch meine Unschönheiten korrigieren:

$CMS_SET(revisions, st_internal_document.get().getHistory())$

$CMS_SET(version, 0)$

$CMS_FOR(revision, revisions)$

    $-- start with counting on the last released version --$

    $CMS_IF(revision.getMetaData().getOperation().getType().toString().equalsIgnoreCase("SERVER_RELEASE"))$

        $CMS_SET(start_count, true)$

    $CMS_ELSIF(!start_count.isEmpty)$

        $CMS_FOR(rev_file, revision.getMetaData().getFiles().toArray)$

            $-- Check if the file is changed and not the metadata --$

            $CMS_IF(rev_file.getType().toDebugString().equalsIgnoreCase("MEDIA_STORE_FILE"))$

                $CMS_IF(!preview_revision.isEmpty)$

                    $-- Check if previous version is an auto save. Auto save operations are only hold on previous versions --$

                    $CMS_IF(!preview_revision.getComment().contains("auto"))$

                        $CMS_SET(version, version + 1 )$

                        $-- revisions are sorted from newest to oldest. Get last changed --$

                        $CMS_IF(last_changed.isEmpty)$

                            $CMS_SET(myDate, #global.now.getInstance())$

                            $CMS_SET(void, myDate.setTimeInMillis(revision.getCommitOrCreationTime()))$

                            $CMS_SET(last_changed, myDate.format(ps_dateFormat))$

                        $CMS_END_IF$

                    $CMS_END_IF$

                    $-- there can be more than one MEDIA_STORE_FILE change flags on one revision. Skip before double count --$

                    $CMS_SET(void, #for.BREAK)$   

                $CMS_END_IF$

            $CMS_END_IF$

    $CMS_END_FOR$

    $CMS_END_IF$

    $CMS_SET(preview_revision, revision)$

$CMS_END_FOR$

0 Kudos