envContext.setProperties(eventProperties); EventProducer eventProducer = Framework.getService(EventProducer.class); eventProducer.fireEvent(envContext.newEvent(DocumentRoutingConstants.Events.afterWorkflowTaskEnded.name()));
envContext.setProperties(eventProperties); EventProducer eventProducer = Framework.getService(EventProducer.class); eventProducer.fireEvent(envContext.newEvent(DocumentRoutingConstants.Events.afterWorkflowTaskCreated.name()));
EventProducer eventProducer = Framework.getService(EventProducer.class); eventProducer.fireEvent( envContext.newEvent(DocumentRoutingConstants.Events.afterWorkflowTaskReassigned.name()));
EventProducer eventProducer = Framework.getService(EventProducer.class); eventProducer.fireEvent( envContext.newEvent(DocumentRoutingConstants.Events.afterWorkflowTaskDelegated.name()));
@Override public void cancel(CoreSession session, DocumentRouteElement element) { GraphRoute graph = element instanceof GraphRoute ? (GraphRoute) element : null; Map<String, Serializable> eventProperties = new HashMap<>(); if (graph != null) { eventProperties.put("modelId", graph.getModelId()); eventProperties.put("modelName", graph.getModelName()); eventProperties.put(RoutingAuditHelper.WORKFLOW_VARIABLES, (Serializable) graph.getVariables()); eventProperties.put(RoutingAuditHelper.WORKFLOW_INITATIOR, graph.getInitiator()); // Get the list of pending node List<String> pendingNodeNames = new ArrayList<>(); for (GraphNode suspendedNode : graph.getSuspendedNodes()) { pendingNodeNames.add(suspendedNode.getId()); } eventProperties.put("pendingNodes", (Serializable) pendingNodeNames); } EventFirer.fireEvent(session, element, eventProperties, DocumentRoutingConstants.Events.beforeWorkflowCanceled.name()); super.cancel(session, element); if (graph == null) { return; } // also cancel tasks // also cancel sub-workflows for (GraphNode node : graph.getNodes()) { node.cancelTasks(); node.cancelSubRoute(); } }
/** * Query the audit for an entry of the Routing category matching the given event and returns the time elapsed since it is recorded. * * @since 7.4 */ public static long computeElapsedTime(DocumentRoutingConstants.Events event, String elementId) { Logs logs = Framework.getService(Logs.class); if (logs != null && StringUtils.isNotBlank(elementId)) { Map<String, FilterMapEntry> filterMap = new HashMap<>(); FilterMapEntry categoryFilterMapEntry = new FilterMapEntry(); categoryFilterMapEntry.setColumnName(BuiltinLogEntryData.LOG_CATEGORY); categoryFilterMapEntry.setOperator("="); categoryFilterMapEntry.setQueryParameterName(BuiltinLogEntryData.LOG_CATEGORY); categoryFilterMapEntry.setObject(DocumentRoutingConstants.ROUTING_CATEGORY); filterMap.put(BuiltinLogEntryData.LOG_CATEGORY, categoryFilterMapEntry); FilterMapEntry eventIdFilterMapEntry = new FilterMapEntry(); eventIdFilterMapEntry.setColumnName(BuiltinLogEntryData.LOG_EVENT_ID); eventIdFilterMapEntry.setOperator("="); eventIdFilterMapEntry.setQueryParameterName(BuiltinLogEntryData.LOG_EVENT_ID); eventIdFilterMapEntry.setObject(event.name()); filterMap.put(BuiltinLogEntryData.LOG_EVENT_ID, eventIdFilterMapEntry); List<LogEntry> logEntries = logs.getLogEntriesFor(elementId, filterMap, true); if (logEntries.size() > 0) { LogEntry logEntry = logEntries.get(0); Date start = logEntry.getEventDate(); return new Date().getTime() - start.getTime(); } } return -1; }
@Override public void run() { String routeDocId = getRouteModelDocIdWithId(session, routeModelId); DocumentModel model = session.getDocument(new IdRef(routeDocId)); DocumentModel instance = persister.createDocumentRouteInstanceFromDocumentRouteModel(model, session); route = instance.getAdapter(DocumentRoute.class); route.setAttachedDocuments(docIds); route.save(session); Map<String, Serializable> props = new HashMap<>(); props.put(DocumentRoutingConstants.INITIATOR_EVENT_CONTEXT_KEY, initiator); fireEvent(DocumentRoutingConstants.Events.beforeRouteReady.name(), props); route.setReady(session); fireEvent(DocumentRoutingConstants.Events.afterRouteReady.name(), props); route.save(session); if (startInstance) { fireEvent(DocumentRoutingConstants.Events.beforeRouteStart.name(), new HashMap<>()); DocumentRoutingEngineService routingEngine = Framework.getService( DocumentRoutingEngineService.class); routingEngine.start(route, map, session); fireEventAfterWorkflowStarted(route, session); } res[0] = instance.getId(); }
@Override public void cancel(DocumentRoute routeInstance, CoreSession session) { final String routeDocId = routeInstance.getDocument().getId(); new UnrestrictedSessionRunner(session) { @Override public void run() { DocumentModel routeDoc = session.getDocument(new IdRef(routeDocId)); DocumentRoute routeInstance = routeDoc.getAdapter(DocumentRoute.class); if (routeInstance == null) { throw new NuxeoException("Document " + routeDoc + " can not be adapted to a DocumentRoute"); } routeInstance.cancel(session); } }.runUnrestricted(); Map<String, Serializable> properties = new HashMap<String, Serializable>(); properties.put(WORKFLOW_NAME_EVENT_PROPERTY_KEY, routeInstance.getTitle()); properties.put(WORKFLOW_ID_EVENT_PROPERTY_KEY, routeDocId); EventFirer.fireEvent(session, routeInstance.getAttachedDocuments(session), properties, DocumentRoutingConstants.Events.workflowCanceled.name()); } }
@Override public void undo(CoreSession session, DocumentRouteElement element) { EventFirer.fireEvent(session, element, null, DocumentRoutingConstants.Events.beforeUndoingStep.name()); try (OperationContext context = new OperationContext(session)) { context.put(DocumentRoutingConstants.OPERATION_STEP_DOCUMENT_KEY, element); context.setInput(element.getAttachedDocuments(session)); String operationChainId; String docType = element.getDocument().getType(); if (element.isDone()) { operationChainId = getDocumentRoutingService().getUndoFromDoneOperationChainId(docType); } else if (element.isRunning()) { operationChainId = getDocumentRoutingService().getUndoFromRunningOperationChainId(docType); } else { throw new RuntimeException("Trying to undo a step neither in done nor running state."); } getAutomationService().run(context, operationChainId); } catch (OperationException e) { throw new NuxeoException(e); } EventFirer.fireEvent(session, element, null, DocumentRoutingConstants.Events.afterUndoingStep.name()); }
@Override public void run(CoreSession session, DocumentRouteElement element) { if (element.isRunning()) { return; } else { element.setRunning(session); } if (!(element instanceof DocumentRouteStep)) { throw new RuntimeException("Method run should be overriden in parent class."); } EventFirer.fireEvent(session, element, null, DocumentRoutingConstants.Events.beforeStepRunning.name()); try (OperationContext context = new OperationContext(session)) { context.put(DocumentRoutingConstants.OPERATION_STEP_DOCUMENT_KEY, element); context.setInput(element.getAttachedDocuments(session)); if (!element.isDone()) { EventFirer.fireEvent(session, element, null, DocumentRoutingConstants.Events.stepWaiting.name()); } String chainId = getDocumentRoutingService().getOperationChainId(element.getDocument().getType()); getAutomationService().run(context, chainId); } catch (OperationException e) { throw new NuxeoException(e); } }
protected void fireWorkflowCompletionEvent(CoreSession session) { EventFirer.fireEvent(session, this, null, DocumentRoutingConstants.Events.afterRouteFinish.name()); Map<String, Serializable> eventProperties = new HashMap<String, Serializable>(); // First compute duration long duration = RoutingAuditHelper.computeDurationSinceWfStarted(getDocument().getId()); if (duration >= 0) { eventProperties.put(RoutingAuditHelper.TIME_SINCE_WF_STARTED, duration); } eventProperties.put(RoutingAuditHelper.WORKFLOW_INITATIOR, this.getInitiator()); // Add common info about workflow if (this instanceof GraphRoute) { eventProperties.put(RoutingAuditHelper.WORKFLOW_VARIABLES, (Serializable) ((GraphRoute) this).getVariables()); } eventProperties.put("modelId", getModelId()); eventProperties.put("modelName", getModelName()); EventFirer.fireEvent(session, this, eventProperties, DocumentRoutingConstants.Events.afterWorkflowFinish.name()); }
@Override public void handleEvent(Event event) { if (!DocumentRoutingConstants.Events.afterRouteFinish.name().equals(event.getName())) { return; } DocumentEventContext docCtx = (DocumentEventContext) event.getContext(); CoreSession session = docCtx.getCoreSession(); DocumentModel routeInstanceDoc = docCtx.getSourceDocument(); List<Task> openTasks = Framework.getService(TaskService.class).getAllTaskInstances( routeInstanceDoc.getId(), session); for (Task task : openTasks) { getDocumentRoutingService().cancelTask(session, task.getId()); } }
@Override public void run() { DocumentModel instance = session.getDocument(new IdRef(routeInstanceId)); DocumentRoute route = instance.getAdapter(DocumentRoute.class); if (docIds != null) { route.setAttachedDocuments(docIds); route.save(session); } fireEvent(DocumentRoutingConstants.Events.beforeRouteStart.name(), new HashMap<>(), route, session); DocumentRoutingEngineService routingEngine = Framework.getService(DocumentRoutingEngineService.class); routingEngine.start(route, map, session); fireEventAfterWorkflowStarted(route, session); }
@Override public void backToReady(CoreSession session) { EventFirer.fireEvent(session, this, null, DocumentRoutingConstants.Events.beforeStepBackToReady.name()); followTransition(ElementLifeCycleTransistion.backToReady, session, false); EventFirer.fireEvent(session, this, null, DocumentRoutingConstants.Events.afterStepBackToReady.name()); }
@Override public void validate(CoreSession session) { // validate this routeModel EventFirer.fireEvent(session, this, null, DocumentRoutingConstants.Events.beforeRouteValidated.name()); setValidated(session); EventFirer.fireEvent(session, this, null, DocumentRoutingConstants.Events.afterRouteValidated.name()); setReadOnly(session); } }
protected void fireEventAfterWorkflowStarted(DocumentRoute route, CoreSession session) { Map<String, Serializable> eventProperties = new HashMap<>(); eventProperties.put(RoutingAuditHelper.WORKFLOW_INITATIOR, route.getInitiator()); eventProperties.put("modelId", route.getModelId()); eventProperties.put("modelName", route.getModelName()); if (route instanceof GraphRoute) { eventProperties.put(RoutingAuditHelper.WORKFLOW_VARIABLES, (Serializable) ((GraphRoute) route).getVariables()); } fireEvent(DocumentRoutingConstants.Events.afterWorkflowStarted.name(), eventProperties, route, session); }
@Override public void setDone(CoreSession session) { followTransition(ElementLifeCycleTransistion.toDone, session, false); EventFirer.fireEvent(session, this, null, DocumentRoutingConstants.Events.afterStepRunning.name()); }