public List<DocumentModel> findRelatedRoute(String documentId) throws ClientException { List<DocumentModel> docs = new ArrayList<DocumentModel>(); if(documentId == null || "".equals(documentId)) { return docs; } List<DocumentRoute> relatedRoutes = getDocumentRoutingService().getDocumentRoutesForAttachedDocument( documentManager, documentId); for (DocumentRoute documentRoute : relatedRoutes) { docs.add(documentRoute.getDocument()); } return docs; }
@Override protected void writeEntityBody(DocumentRoute item, JsonGenerator jg) throws IOException { jg.writeStringField("id", item.getDocument().getId()); jg.writeStringField("name", item.getName()); jg.writeStringField("title", item.getTitle()); jg.writeStringField("state", item.getDocument().getCurrentLifeCycleState()); jg.writeStringField("workflowModelName", item.getModelName()); if (ctx.getFetched(ENTITY_TYPE).contains(FETCH_INITATIOR)) { NuxeoPrincipal principal = userManager.getPrincipal(item.getInitiator()); if (principal != null) { writeEntityField("initiator", principal, jg); } else { jg.writeStringField("initiator", item.getInitiator()); jg.writeStringField("initiator", item.getInitiator()); try (SessionWrapper wrapper = ctx.getSession(item.getDocument())) { final boolean isFetchAttachedDocumentIds = ctx.getFetched(ENTITY_TYPE).contains(FETCH_ATTACHED_DOCUMENTS); for (String docId : item.getAttachedDocuments()) { if (isFetchAttachedDocumentIds) { IdRef idRef = new IdRef(docId);
@Override public DocumentRoute saveRouteAsNewModel(DocumentRoute instance, CoreSession session) { DocumentModel instanceModel = instance.getDocument(); DocumentModel parent = persister.getParentFolderForNewModel(session, instanceModel); String newName = persister.getNewModelName(instanceModel); DocumentModel newmodel = persister.saveDocumentRouteInstanceAsNewModel(instanceModel, parent, newName, session); DocumentRoute newRoute = newmodel.getAdapter(DocumentRoute.class); if (!newRoute.isDraft()) { newRoute.followTransition(DocumentRouteElement.ElementLifeCycleTransistion.toDraft, session, false); } newRoute.getDocument().setPropertyValue("dc:title", newName); newRoute.setAttachedDocuments(new ArrayList<>()); newRoute.save(session); return newRoute; }
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); }
/** * @since 10.1 */ public static String getGraphResourceURL(DocumentRoute route, RenderingContext ctx) { StringBuilder sb = new StringBuilder(ctx.getBaseUrl()); sb.append("api/v1/"); if (route.isValidated()) { // it is a model sb.append("workflowModel/").append(route.getDocument().getName()); } else { // it is an instance sb.append("workflow/").append(route.getDocument().getId()); } sb.append("/graph"); return sb.toString(); } }
@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()); } }
DocumentModel docRoute = session.getDocument(new IdRef(routeId)); DocumentRoute route = docRoute.getAdapter(DocumentRoute.class); List<String> relatedDocIds = route.getAttachedDocuments(); route.cancel(session); log.debug("Canceling workflow " + route.getDocument().getName()); session.removeDocument(route.getDocument().getRef());
public String startRouteRelatedToCurrentDocument() throws ClientException { DocumentRoute route = getRelatedRoute(); // check relatedRoutedoc id if (!StringUtils.isEmpty(relatedRouteModelDocumentId)) { DocumentModel model = documentManager.getDocument(new IdRef( relatedRouteModelDocumentId)); route = model.getAdapter(DocumentRoute.class); } if (route == null) { facesMessages.add( StatusMessage.Severity.WARN, resourcesAccessor.getMessages().get( "feedback.casemanagement.document.route.no.valid.route")); return null; } List<String> documentIds = new ArrayList<String>(); documentIds.add(navigationContext.getCurrentDocument().getId()); route.setAttachedDocuments(documentIds); getDocumentRoutingService().createNewInstance( route.getDocument().getName(), documentIds, documentManager, true); Events.instance().raiseEvent(TaskEventNames.WORKFLOW_NEW_STARTED); webActions.resetTabList(); return null; }
@Override public void run() { DocumentRoute route = session.getDocument(routeModel.getDocument().getRef()) .getAdapter(DocumentRoute.class); route.validate(session); } }.runUnrestricted();
@Override public DocumentModelList getAttachedDocuments(CoreSession session) { List<String> docIds = getDocumentRoute(session).getAttachedDocuments(); List<DocumentRef> refs = new ArrayList<DocumentRef>(); for (String id : docIds) { IdRef idRef = new IdRef(id); if (session.exists(idRef)) { refs.add(idRef); } } return session.getDocuments(refs.toArray(new DocumentRef[] {})); }
List<String> modelNames = new ArrayList<String>(); for (DocumentRoute model : wfModels) { if (session.hasPermission(model.getDocument().getRef(), DocumentRoutingConstants.CAN_DATA_VISU)) { modelNames.add(model.getModelName());
@Override public void handleEvent(Event event) { DocumentEventContext docCtx = (DocumentEventContext) event.getContext(); DocumentRoute route = (DocumentRoute) docCtx.getProperty(DocumentRoutingConstants.DOCUMENT_ELEMENT_EVENT_CONTEXT_KEY); String initiator = (String) docCtx.getProperty(DocumentRoutingConstants.INITIATOR_EVENT_CONTEXT_KEY); CoreSession session = docCtx.getCoreSession(); // initiator is a step validator route.setCanValidateStep(session, initiator); // initiator can see the route ACP acp = route.getDocument().getACP(); ACL acl = acp.getOrCreateACL(DocumentRoutingConstants.DOCUMENT_ROUTING_ACL); acl.add(new ACE(initiator, SecurityConstants.READ, true)); session.setACP(route.getDocument().getRef(), acp, true); }
@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(); }
public DocumentRoute getRunningWorkflowByName(List<DocumentRoute> routes, String workflowName) { DocumentRoute onlineRoute = null; if (routes != null) { Iterator<DocumentRoute> iterator = routes.iterator(); while (iterator.hasNext() && onlineRoute == null) { DocumentRoute route = iterator.next(); if (workflowName.equals(route.getName())) { onlineRoute = route; } } } return onlineRoute; }
@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 start(DocumentRoute routeInstance, Map<String, Serializable> map, CoreSession session) { routeInstance.run(session, map); }
@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();
public boolean currentRouteModelIsDraft() { DocumentModel relatedRouteModel = navigationContext.getCurrentDocument(); DocumentRoute routeModel = relatedRouteModel.getAdapter(DocumentRoute.class); if (routeModel == null) { return false; } return routeModel.isDraft(); }
protected void checkCancelGuards(DocumentRoute route) { NuxeoPrincipal currentUser = getContext().getCoreSession().getPrincipal(); if (currentUser.isAdministrator() || currentUser.isMemberOf("powerusers")) { return; } if (currentUser.getName().equals(route.getInitiator())) { return; } throw new WebSecurityException("You don't have the permission to cancel this workflow"); }
@Override public void finishTask(CoreSession session, DocumentRoute route, Task task, boolean delete) throws DocumentRouteException { DocumentModelList docs = route.getAttachedDocuments(session); try { removePermissionsForTaskActors(session, docs, task); // delete task if (delete) { session.removeDocument(new IdRef(task.getId())); } } catch (DocumentNotFoundException e) { throw new DocumentRouteException("Cannot finish task", e); } }