rkurz
Elite Observer

WorkflowAgent in Modul

Hallo zusammen,

wie kann ich aus einem Modul heraus bzw. "von extern" mittels der API einen Worklfow auf einem Element starten?

Dieser Schnipsel

AdminService admin = project.getUserService().getConnection().getService(AdminService.class);

WorkflowAgent wfla = admin.getConnection().getBroker().requireSpecialist(WorkflowAgent.TYPE);

liefert

No specialist found for 'de.espirit.firstspirit.workflow.WorkflowAgent$1@c3b4cc34'!

          at de.espirit.firstspirit.agency.AbstractSpecialistsBroker.requireSpecialist(AbstractSpecialistsBroker.java:14)

Hat jemand eine Idee?

Danke!

Nachricht geändert durch Ralph Kurz

7 Replies
MarsDD
Occasional Observer

Hallo Ralph,

durch die Connection zum FS-Server kannst du einen Context holen (ProjectScriptContextImpl) bzw. aus dem Project den UserService. Daraus kannst du dann folgendes machen

TemplateStoreRoot tsr = userService.getTemplateStore();

// alternativ

TemplateStoreRoot tsr = (TemplateStoreRoot) userService.getStore(Store.TEMPLATESTORE, false);

Workflow workflow = tsr.getWorkflowByName("workflowName");

WorkflowAgent workflowAgent = (WorkflowAgent) context.requireSpecialist(WorkflowAgent.TYPE, false);

workflowAgent.WorkflowProcessContext workflowProcessContext = workflowAgent.startWorkflow(workflow, <Object aus Basis IDProvider>);

workflowProcessContext.showActionDialog();

Nicht getestet - jedoch so in der Art und Weise sollte es funktionieren

Viele Grüße

Marcel

0 Kudos

Hallo Marcel,

danke für die Infos.

Bzgl. des ProjectScriptContextImpl: Kann ich da was casten oder baue ich mir den selbst zusammen?

Selbst mit

workflowAgent = (WorkflowAgent) this.serverEnvironment.getBroker().requireSpecialist(WorkflowAgent.TYPE);

aus einem Service heraus erhalte ich

java.lang.IllegalStateException: No specialist found for 'de.espirit.firstspirit.workflow.WorkflowAgent$1@c3b4cc34'!

          at de.espirit.firstspirit.agency.AbstractSpecialistsBroker.requireSpecialist(AbstractSpecialistsBroker.java:14)

Gibt es andere Voraussetzungen dafür, dass dieser Agent exisitiert?

FirstSpirit Version 5.0.606, Java 1.7.0_71, keine Freigabe aktiviert.

Danke und Gruß

Ralph

0 Kudos
MarsDD
Occasional Observer

Hallo Ralph,

bzgl. deiner ProjectScriptContextImpl-Frage:

ScriptContext scriptContext = new ProjectScriptContextImpl(connection, userService, new Hashtable<String, Object>());

BaseContext baseContext = (BaseContext) scriptContext;

Viele Grüße

Marcel

Hallo Marcel,

danke für Deine Hilfe!

Eine schöne Weihnachtszeit wünsche ich Dir!

Gruß

Ralph

0 Kudos

Hallo zusammen,

bitte keine *Impl Klassen verwenden und schon gar nicht Objekte aus diesen heraus erzeugen. Ihr bewegt euch hier im absoluten nicht öffentlichen API Bereich! Wenn sich hier etwas ändert besteht kein Anspruch auf Wartung oder Support.

Wenn ihr z.B. einen ProjectAgent benötigt, könnt ihr euch den über den Broker holen und nutzen.

Falls deine Anfrage noch nicht möglich ist, habe ich noch nicht prüfen können, würde ich dich ggf. bitten dafür einen Feature-Request zu stellen bzw. zu dem Thema ein Helpdesk-Ticket zu öffnen.

Viele Grüße,

Daniel

0 Kudos
mbergmann
Crownpeak employee

Hallo Ralph,

so wie ich Deinen Code verstehe ist die Ursache, dass Du versuchst den WorkflowAgent aus dem aus dem Broker eines ServerEnvironments bzw. einer Connection zu holen.

Diese Broker haben keine Projektbindung, bei der Connection steht es auch explizit in der API:

"Returns broker without project binding".

Beim ServerEnvironment im Rahmen eines Services ergibt sich das daraus, dass eben der Service (bzw. das ServerEnvironment selbst) nicht an ein spezielles Projekt gebunden sind, d.h. letztlich fehlt dadurch auch dem Broker aus dem ServerEnvironment hier die Verbindung zu einem Projekt, die aber für das Holen des WorkflowAgent benötigt wird, siehe API zum WorkflowAgent (oben):

"Agent providing means to start new workflows or process steps in existing ones.

This agent is related to the project specified by the surrounding context."

Die Lösung sollte hier sein, sich über den projektungebundenen Broker wieder einen BrokerAgent zu besorgen und sich von diesem einen Broker mit Projektbindung zu holen:

Connection connection=...

String projectName=...

BrokerAgent brokerAgent = connection.getBroker().requireSpecialist(BrokerAgent.TYPE);

SpecialistsBroker projectSpecificBroker = brokerAgent.getBrokerByProjectName(projectName);

WorkflowAgent wfla = projectSpecificBroker.requireSpecialist(WorkflowAgent.TYPE);

Viele Grüße

Michael

Hallo Herr Bergmann, Hallo Her Witt,

vielen Dank für Ihre Antworten!

0 Kudos