astember
Returning Observer

TargetReference - Remote Medien validieren

Hallo zusammen,

ich habe ein Migrationsskript für die Massen-Änderung von Catalog-Einträgen von lokalen Projekt-Medien auf Remote-Projekt-Medien identischer UID für mehrere Download-Center-Absätze erweitert. Prinzipiell klappt das Skript solange das Ziel im entsprechenden Remote-Projekt existiert. Da ich nur Medien umstellen möchte, die im Remote-Projekt existieren, scheitere ich aktuell an einer entsprechenden Abfrage:

Die TargerReference wird wie folgt angepasst.

...

cardFormData.get(null,"st_file");

file = cFormField.get();

TargetReference remoteFile = TargetReference.TargetReferences.newInstance(file.getLanguage(), file.getUid(), file.getUidType(), "global_media");

cFormField.set(remoteFile);

...

In der API zu TargetReference habe ich keine Möglichkeit gefunden das Ziel zu validieren. Ein remoteFile.get() liefert immer null zurück, was mich vermuten lässt, dass man über dieses Interface nicht auf die Remote-Inhalte zugreifen kann. Wenn das Medium nicht remote existiert führt dies allerdings beim Speichern zu einem Validierungs-Fehler:
ValidationError[element='igw_dlc' (ID=468462, project=460362), msg={MultiFormValidationReport{(DE:{st_folders:[Validation{SAVE,false:Referenced element 'mediafolder:igw_dl_de' does not exi...}]

Die Frage wäre jetzt, ob und wie man ggf. über die Validierung oder eine anderes Interface überprüfen kann, dass das Remote-Medium im definierten Ziel vorhanden ist.

0 Kudos
3 Replies
felix_reinhold
Returning Responder

Hi Andre,

du könntest dir über den BrokerAgent einen Broker für das Remote-Projekt holen.

Über diesen Broker holst du dir dann den Store bzw. die Stores.

getUid und getUidType sollten auch auf der Remote-TargetReference funktionieren.

Auf dem "Remote-Store" kannst du dann mit getStoreElement(uid, uidType) das Element holen. Wenn null zurück kommt, dann existiert es nicht.

Den Store bzw. die Stores würde ich mir einmalig zu Beginn des Skripts holen. Trotzdem kann dieses Abfragen der Existenz sich natürlich negativ auf die Performance des Skriptes auswirken.

Viele Grüße

Felix

0 Kudos

Danke, das hilft schon etwas weiter, allerdings wäre ein kleines Code-Beispiel hilfreich, da ich bisher kaum mit dem SpecialistsBroker interface gearbeitet hab.

Habe mal über die Beanshell-Konsole folgendes versucht, bekomme aber nur ein NULL zurück.

import de.espirit.firstspirit.agency.*

connection = context.getConnection();

broker = connection.getBroker();

remote = broker.requireSpecialist(BrokerAgent.TYPE).getBroker("global_media");

Ich vermute mal, dass ich über den lokalen Projekt-Kontext den falschen broker bekomme.

0 Kudos

Hi Andre,

habe mal schnell was als Beanshell-Skript zusammengetippt:

import de.espirit.firstspirit.access.project.Project;

import de.espirit.firstspirit.access.store.Store;

import de.espirit.firstspirit.access.store.IDProvider;

import de.espirit.firstspirit.agency.BrokerAgent;

import de.espirit.firstspirit.agency.StoreAgent;

import de.espirit.firstspirit.agency.SpecialistsBroker;

IDProvider element = context.getElement();

BrokerAgent brokerAgent = context.requireSpecialist(BrokerAgent.TYPE);

SpecialistsBroker broker = brokerAgent.getBrokerByProjectName("Mithras Energy");

StoreAgent storeAgent = broker.requireSpecialist(StoreAgent.TYPE);

Store store = storeAgent.getStore(element.getStore().getType());

context.logInfo("Exists: " + (store.getStoreElement(element.getUid(), element.getUidType()) != null));

Wenn du das als Kontextmenü-Skript anlegst kannst du Rechtsklick auf einem Element machen und er zeigt dir, ob das Element im Projekt "Mithras Energy" existiert.
Ich denke das solltest du für deine Bedürfnisse anpassen können. Alternativ zum fest verdrahteten Projektnamen kannst du dir bspw. auch aus den RemoteProjektKonfigurationen das Remote-Media-Projekt raussuchen.

Gruß

Felix

0 Kudos