Search in sources :

Example 1 with Form

use of io.takari.bpm.form.Form in project concord by walmartlabs.

the class FormResourceV1 method submit.

/**
 * Submit form instance's data, potentially resuming a suspended process.
 */
@POST
@ApiOperation(value = "Submit JSON form data")
@Path("/{processInstanceId}/form/{formName}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public FormSubmitResponse submit(@ApiParam @PathParam("processInstanceId") UUID processInstanceId, @ApiParam @PathParam("formName") String formName, @ApiParam Map<String, Object> data) {
    PartialProcessKey processKey = PartialProcessKey.from(processInstanceId);
    Form form = formService.get(processKey, formName);
    if (form == null) {
        throw new ConcordApplicationException("Form " + formName + " not found. Process ID: " + processInstanceId, Status.NOT_FOUND);
    }
    try {
        data = FormUtils.convert(validatorLocale, form, data);
    } catch (ValidationException e) {
        Map<String, String> errors = Collections.singletonMap(e.getField().getName(), e.getMessage());
        return new FormSubmitResponse(processInstanceId, errors);
    }
    FormSubmitResult result = formService.submit(processKey, formName, data);
    Map<String, String> errors = FormUtils.mergeErrors(result.getErrors());
    return new FormSubmitResponse(result.getProcessInstanceId(), errors);
}
Also used : PartialProcessKey(com.walmartlabs.concord.server.sdk.PartialProcessKey) ValidationException(com.walmartlabs.concord.server.process.form.FormUtils.ValidationException) Form(io.takari.bpm.form.Form) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException) ApiOperation(io.swagger.annotations.ApiOperation)

Example 2 with Form

use of io.takari.bpm.form.Form in project concord by walmartlabs.

the class FormAccessManager method assertFormAccess.

@SuppressWarnings("unchecked")
public Form assertFormAccess(ProcessKey processKey, String formName) {
    Form f = getForm(processKey, formName);
    if (f == null) {
        return null;
    }
    if (Roles.isAdmin()) {
        return f;
    }
    Map<String, Object> opts = f.getOptions();
    if (opts == null) {
        return f;
    }
    Map<String, Serializable> runAsParams = (Map<String, Serializable>) opts.get(Constants.Forms.RUN_AS_KEY);
    assertFormAccess(formName, runAsParams);
    return f;
}
Also used : Serializable(java.io.Serializable) Form(io.takari.bpm.form.Form) Map(java.util.Map)

Example 3 with Form

use of io.takari.bpm.form.Form in project concord by walmartlabs.

the class CustomFormServiceV1 method continueSession.

private Response continueSession(UriInfo uriInfo, HttpHeaders headers, ProcessKey processKey, String formName, Map<String, Object> data) {
    // TODO locking
    Form form = assertForm(processKey, formName);
    // TODO constants
    Map<String, Object> opts = form.getOptions();
    boolean yield = opts != null && (boolean) opts.getOrDefault("yield", false);
    Path dst = cfg.getBaseDir().resolve(processKey.toString()).resolve(formName);
    Path formDir = dst.resolve(FORM_DIR_NAME);
    try {
        Map<String, Object> m = new HashMap<>();
        try {
            m = FormUtils.convert(new ExternalFileFormValidatorLocale(processKey, formName, stateManager), form, data);
            FormSubmitResult r = formService.submit(processKey, formName, m);
            if (r.isValid()) {
                if (yield) {
                    // this was the last "interactive" form. The process will continue in "background"
                    // and users should get a success page.
                    writeData(formDir, success(form, m));
                } else {
                    while (true) {
                        ProcessStatus s = queueDao.getStatus(processKey);
                        if (s == ProcessStatus.SUSPENDED) {
                            String nextFormId = formService.nextFormId(processKey);
                            if (nextFormId == null) {
                                writeData(formDir, success(form, m));
                                break;
                            } else {
                                FormSessionResponse nextSession = startSession(processKey, nextFormId);
                                return redirectTo(nextSession.getUri());
                            }
                        } else if (s == ProcessStatus.FAILED || s == ProcessStatus.CANCELLED || s == ProcessStatus.TIMED_OUT) {
                            writeData(formDir, processFailed(form, m));
                            break;
                        } else if (s == ProcessStatus.FINISHED) {
                            writeData(formDir, success(form, m));
                            break;
                        }
                        try {
                            // TODO exp back off?
                            Thread.sleep(STATUS_REFRESH_DELAY);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
                }
            } else {
                writeData(formDir, prepareData(form, m, r.getErrors()));
            }
        } catch (ValidationException e) {
            ValidationError err = ValidationError.of(e.getField().getName(), e.getMessage());
            FormData d = prepareData(form, m, Collections.singletonList(err));
            writeData(formDir, d);
        }
    } catch (Exception e) {
        throw new ConcordApplicationException("Error while submitting a form", e);
    }
    return redirectToForm(uriInfo, headers, processKey, formName);
}
Also used : Path(java.nio.file.Path) ValidationException(com.walmartlabs.concord.server.process.form.FormUtils.ValidationException) Form(io.takari.bpm.form.Form) ProcessStatus(com.walmartlabs.concord.server.sdk.ProcessStatus) FormSubmitResult(com.walmartlabs.concord.server.process.form.FormSubmitResult) ValidationException(com.walmartlabs.concord.server.process.form.FormUtils.ValidationException) IOException(java.io.IOException) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException) ValidationError(com.walmartlabs.concord.forms.ValidationError) ExternalFileFormValidatorLocale(com.walmartlabs.concord.server.process.form.ExternalFileFormValidatorLocale)

Example 4 with Form

use of io.takari.bpm.form.Form in project concord by walmartlabs.

the class CustomFormServiceV1 method startSession.

private FormSessionResponse startSession(ProcessKey processKey, String formName) {
    // TODO locking
    Form form = assertForm(processKey, formName);
    Path dst = cfg.getBaseDir().resolve(processKey.toString()).resolve(formName);
    try {
        Path formDir = dst.resolve(FORM_DIR_NAME);
        if (!Files.exists(formDir)) {
            Files.createDirectories(formDir);
        }
        String resource = FormServiceV1.FORMS_RESOURCES_PATH + "/" + form.getFormDefinition().getName();
        // copy original branding files into the target directory
        boolean branded = stateManager.exportDirectory(processKey, resource, copyTo(formDir));
        if (!branded) {
            // not branded, redirect to the default wizard
            String uri = String.format(NON_BRANDED_FORM_URL_TEMPLATE, processKey, formName);
            return new FormSessionResponse(uri);
        }
        // create JS file containing the form's data
        writeData(formDir, initialData(form));
        // copy shared resources (if present)
        copySharedResources(processKey, dst);
    } catch (IOException e) {
        log.warn("startSession ['{}', '{}'] -> error while preparing a custom form: {}", processKey, formName, e);
        throw new ConcordApplicationException("Error while preparing a custom form", e);
    }
    return new FormSessionResponse(formPath(processKey, formName));
}
Also used : Path(java.nio.file.Path) Form(io.takari.bpm.form.Form) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException) IOException(java.io.IOException)

Example 5 with Form

use of io.takari.bpm.form.Form in project concord by walmartlabs.

the class FormResourceV1 method get.

/**
 * Return the current state of a form instance.
 */
@GET
@ApiOperation("Get the current state of a form")
@Path("/{processInstanceId}/form/{formName}")
@Produces(MediaType.APPLICATION_JSON)
public FormInstanceEntry get(@ApiParam @PathParam("processInstanceId") UUID processInstanceId, @ApiParam @PathParam("formName") String formName) {
    PartialProcessKey processKey = PartialProcessKey.from(processInstanceId);
    Form form = formService.get(processKey, formName);
    if (form == null) {
        throw new ConcordApplicationException("Form " + formName + " not found. Process ID: " + processKey, Status.NOT_FOUND);
    }
    Map<String, Object> data = FormUtils.values(form);
    boolean yield = MapUtils.getBoolean(form.getOptions(), "yield", false);
    Map<String, Object> allowedValues = form.getAllowedValues();
    if (allowedValues == null) {
        allowedValues = Collections.emptyMap();
    }
    List<FormInstanceEntry.Field> fields = new ArrayList<>();
    FormDefinition fd = form.getFormDefinition();
    for (FormField f : fd.getFields()) {
        String fieldName = f.getName();
        FormInstanceEntry.Cardinality c = map(f.getCardinality());
        String type = f.getType();
        Object value = data.get(fieldName);
        Object allowedValue = allowedValues.get(fieldName);
        fields.add(new FormInstanceEntry.Field(fieldName, f.getLabel(), type, c, value, allowedValue, f.getOptions()));
    }
    String pbk = form.getProcessBusinessKey();
    String name = fd.getName();
    String resourcePath = FORMS_RESOURCES_PATH + "/" + name;
    boolean isCustomForm = formService.exists(processKey, resourcePath);
    return new FormInstanceEntry(pbk, name, fields, isCustomForm, yield);
}
Also used : PartialProcessKey(com.walmartlabs.concord.server.sdk.PartialProcessKey) Form(io.takari.bpm.form.Form) FormField(io.takari.bpm.model.form.FormField) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException) FormDefinition(io.takari.bpm.model.form.FormDefinition) FormField(io.takari.bpm.model.form.FormField) ApiOperation(io.swagger.annotations.ApiOperation)

Aggregations

Form (io.takari.bpm.form.Form)7 ConcordApplicationException (com.walmartlabs.concord.server.sdk.ConcordApplicationException)4 PartialProcessKey (com.walmartlabs.concord.server.sdk.PartialProcessKey)3 IOException (java.io.IOException)3 ValidationError (com.walmartlabs.concord.forms.ValidationError)2 ValidationException (com.walmartlabs.concord.server.process.form.FormUtils.ValidationException)2 ApiOperation (io.swagger.annotations.ApiOperation)2 Path (java.nio.file.Path)2 ConfigurationUtils (com.walmartlabs.concord.common.ConfigurationUtils)1 ConcordFormValidator (com.walmartlabs.concord.common.form.ConcordFormValidator)1 Constants (com.walmartlabs.concord.sdk.Constants)1 MapUtils (com.walmartlabs.concord.sdk.MapUtils)1 Payload (com.walmartlabs.concord.server.process.Payload)1 PayloadManager (com.walmartlabs.concord.server.process.PayloadManager)1 ProcessException (com.walmartlabs.concord.server.process.ProcessException)1 ProcessManager (com.walmartlabs.concord.server.process.ProcessManager)1 ExternalFileFormValidatorLocale (com.walmartlabs.concord.server.process.form.ExternalFileFormValidatorLocale)1 FormSubmitResult (com.walmartlabs.concord.server.process.form.FormSubmitResult)1 ProcessKeyCache (com.walmartlabs.concord.server.process.queue.ProcessKeyCache)1 ProcessStateManager (com.walmartlabs.concord.server.process.state.ProcessStateManager)1