use of com.adobe.granite.workflow.model.WorkflowModel in project acs-aem-commons by Adobe-Consulting-Services.
the class WorkflowDelegationStep method execute.
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metadata) throws WorkflowException {
Map<String, String> args = getProcessArgsMap(metadata);
String propertyName = args.get(WORKFLOW_PROPERTY_NAME);
String defaultWorkflowModelId = args.get(DEFAULT_WORKFLOW_MODEL);
boolean terminateOnDelegation = Boolean.parseBoolean(StringUtils.lowerCase(args.get(TERMINATE_ON_DELEGATION)));
if (StringUtils.isBlank(propertyName)) {
throw new WorkflowException("PROCESS_ARG [ " + WORKFLOW_PROPERTY_NAME + " ] not defined");
}
log.debug("Provided PROCESS_ARGS: propertyName = [ {} ], Default Workflow Model = [ {} ]", propertyName, defaultWorkflowModelId);
ResourceResolver resolver = null;
WorkflowData wfData = workItem.getWorkflowData();
if (!workflowHelper.isPathTypedPayload(wfData)) {
log.warn("Could not locate a JCR_PATH payload for this workflow. Skipping delegation.");
return;
}
final String path = wfData.getPayload().toString();
// Get the resource resolver
resolver = workflowHelper.getResourceResolver(workflowSession);
if (resolver == null) {
throw new WorkflowException("Could not adapt the WorkflowSession to a ResourceResolver. Something has gone terribly wrong!");
}
// Derive the Page or Asset resource so we have a normalized entry-point for finding the /jcr:content resource
final Resource pageOrAssetResource = workflowHelper.getPageOrAssetResource(resolver, path);
if (pageOrAssetResource == null) {
log.warn("Could not resolve [ {} ] to an Asset or Page. Skipping delegation.", path);
return;
}
// Get the Asset or Page's jcr:content resource, so we have a common inherited property look-up scheme
final Resource jcrContentResource = pageOrAssetResource.getChild(JcrConstants.JCR_CONTENT);
if (jcrContentResource == null) {
throw new WorkflowException(String.format("Could not find a child jcr:content resource for [ %s ]", pageOrAssetResource.getPath()));
}
// Look up the content-hierarchy for the delegate workflow model
final InheritanceValueMap inheritance = new HierarchyNodeInheritanceValueMap(jcrContentResource);
final String foundWorkflowModelId = StringUtils.trim(inheritance.getInherited(propertyName, String.class));
final WorkflowModel delegateWorkflowModel = getDelegateWorkflowModel(workflowSession, foundWorkflowModelId, defaultWorkflowModelId);
if (delegateWorkflowModel != null) {
workflowSession.startWorkflow(delegateWorkflowModel, wfData);
log.info("Delegating payload [ {} ] to Workflow Model [ {} ]", wfData.getPayload(), delegateWorkflowModel.getId());
if (terminateOnDelegation) {
log.info("Terminating current workflow due to PROCESS_ARGS[ {} ] = [ {} ]", TERMINATE_ON_DELEGATION, terminateOnDelegation);
workflowSession.terminateWorkflow(workItem.getWorkflow());
}
} else {
log.warn("No valid delegate Workflow Model could be located. Skipping workflow delegation.");
}
}
use of com.adobe.granite.workflow.model.WorkflowModel in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class WorkflowModelDataSourceServletTest method setUp.
@BeforeEach
public void setUp() throws Exception {
context.load().json(TEST_BASE + CoreComponentTestContext.TEST_CONTENT_JSON, APPS_ROOT);
WorkflowSession workflowSessionMock = mock(WorkflowSession.class);
WorkflowModel workflowModelMock = mock(WorkflowModel.class);
when(workflowModelMock.getTitle()).thenReturn("Workflow Title");
when(workflowModelMock.getId()).thenReturn("test/workflow");
when(workflowSessionMock.getModels()).thenReturn(new WorkflowModel[] { workflowModelMock });
context.registerAdapter(ResourceResolver.class, WorkflowSession.class, (Function<ResourceResolver, WorkflowSession>) input -> workflowSessionMock);
}
use of com.adobe.granite.workflow.model.WorkflowModel in project acs-aem-commons by Adobe-Consulting-Services.
the class WorkflowDelegationStep method getWorkflowModel.
private WorkflowModel getWorkflowModel(WorkflowSession workflowSession, String workflowModelId) {
workflowModelId = StringUtils.stripToEmpty(workflowModelId);
WorkflowModel workflowModel = null;
if (StringUtils.isNotBlank(workflowModelId)) {
if (!workflowModelId.endsWith("/jcr:content/model")) {
ResourceResolver resourceResolver = workflowHelper.getResourceResolver(workflowSession);
Resource resource = resourceResolver.getResource(workflowModelId + "/jcr:content/model");
if (resource != null && StringUtils.equals(resource.getValueMap().get(JcrConstants.JCR_PRIMARYTYPE, String.class), "cq:WorkflowModel")) {
workflowModelId = resource.getPath();
}
}
try {
workflowModel = workflowSession.getModel(workflowModelId);
} catch (WorkflowException e) {
log.warn("Could not find Workflow Model for [ {} ]", workflowModelId);
}
}
return workflowModel;
}
use of com.adobe.granite.workflow.model.WorkflowModel in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class WorkflowModelDataSourceServlet method doGet.
@Override
protected void doGet(@NotNull SlingHttpServletRequest request, @NotNull SlingHttpServletResponse response) throws ServletException, IOException {
try {
WorkflowSession workflowSession = request.getResourceResolver().adaptTo(WorkflowSession.class);
ArrayList<Resource> resources = new ArrayList<>();
if (workflowSession != null) {
WorkflowModel[] models = workflowSession.getModels();
for (WorkflowModel model : models) {
resources.add(new WorkflowModelResource(model, request.getResourceResolver()));
}
}
SimpleDataSource dataSource = new SimpleDataSource(resources.iterator());
request.setAttribute(DataSource.class.getName(), dataSource);
} catch (WorkflowException e) {
throw new ServletException(e);
}
}
Aggregations