use of com.walmartlabs.concord.forms.ValidationError in project concord by walmartlabs.
the class CustomFormServiceV2 method continueSession.
private Response continueSession(UriInfo uriInfo, HttpHeaders headers, ProcessKey processKey, String formName, Map<String, Object> data) {
// TODO locking
Form form = assertForm(processKey, formName);
boolean yield = form.options().yield();
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 ExternalFileFormValidatorLocaleV2(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, processKey.getInstanceId()));
} 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, processKey.getInstanceId()));
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, processKey.getInstanceId()));
break;
} else if (s == ProcessStatus.FINISHED) {
writeData(formDir, success(form, m, processKey.getInstanceId()));
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(), processKey.getInstanceId()));
}
} catch (FormUtils.ValidationException e) {
ValidationError err = ValidationError.of(e.getField().name(), e.getMessage());
FormData d = prepareData(form, m, Collections.singletonList(err), processKey.getInstanceId());
writeData(formDir, d);
}
} catch (Exception e) {
throw new ConcordApplicationException("Error while submitting a form", e);
}
return redirectToForm(uriInfo, headers, processKey, formName);
}
use of com.walmartlabs.concord.forms.ValidationError in project concord by walmartlabs.
the class CustomFormServiceV2 method prepareData.
private FormData prepareData(boolean success, boolean processFailed, Form form, Map<String, Object> overrides, boolean skipMissingOverrides, List<ValidationError> errors, UUID processInstanceId) {
// TODO merge with FormResource
Map<String, FormDataDefinition> _definitions = new HashMap<>();
// the order of precedence should be:
// submitted value > form call value > field's default value > environment value
Map<String, Object> _values = new HashMap<>(form.options().extraValues());
Map<String, String> _errors = new HashMap<>();
form.fields().stream().filter(f -> f.defaultValue() != null).forEach(f -> _values.put(f.name(), f.defaultValue()));
List<String> fields = form.fields().stream().map(FormField::name).collect(Collectors.toList());
for (FormField f : form.fields()) {
Object allowedValue = f.allowedValue();
_definitions.put(f.name(), new FormDataDefinition(f.label(), f.type(), convert(f.cardinality()), allowedValue));
Object v = overrides != null ? overrides.get(f.name()) : null;
if (v == null && skipMissingOverrides) {
continue;
}
if (v == null) {
continue;
}
_values.put(f.name(), v);
}
if (errors != null) {
for (ValidationError e : errors) {
_errors.put(e.fieldName(), e.error());
}
}
String submitUrl = String.format(FORM_WIZARD_CONTINUE_URL_TEMPLATE, processInstanceId, form.name());
return new FormData(success, processFailed, submitUrl, fields, _definitions, _values, _errors);
}
use of com.walmartlabs.concord.forms.ValidationError 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);
}
use of com.walmartlabs.concord.forms.ValidationError in project concord by walmartlabs.
the class CustomFormServiceV1 method prepareData.
private FormData prepareData(boolean success, boolean processFailed, Form form, Map<String, Object> overrides, boolean skipMissingOverrides, List<ValidationError> errors) {
String processInstanceId = form.getProcessBusinessKey();
String formName = form.getFormDefinition().getName();
String submitUrl = String.format(FORM_WIZARD_CONTINUE_URL_TEMPLATE, processInstanceId, formName);
// TODO merge with FormResource
Map<String, FormDataDefinition> _definitions = new HashMap<>();
// the order of precedence should be:
// submitted value > form call value > field's default value > environment value
Map<String, String> _errors = new HashMap<>();
Map<String, Object> data = FormUtils.values(form);
Map<String, Object> extra = FormUtils.extraValues(form);
Map<String, Object> _values = new HashMap<>(extra);
Map<String, Object> allowedValues = form.getAllowedValues();
if (allowedValues == null) {
allowedValues = Collections.emptyMap();
}
FormDefinition fd = form.getFormDefinition();
List<String> fields = fd.getFields().stream().map(FormField::getName).collect(Collectors.toList());
for (FormField f : fd.getFields()) {
Object allowedValue = allowedValues.get(f.getName());
_definitions.put(f.getName(), new FormDataDefinition(f.getLabel(), f.getType(), f.getCardinality(), allowedValue));
Object v = overrides != null ? overrides.get(f.getName()) : null;
if (v == null && skipMissingOverrides) {
continue;
}
if (v == null) {
v = data.get(f.getName());
}
if (v == null) {
continue;
}
_values.put(f.getName(), v);
}
if (errors != null) {
for (ValidationError e : errors) {
_errors.put(e.fieldName(), e.error());
}
}
return new FormData(success, processFailed, submitUrl, fields, _definitions, _values, _errors);
}
Aggregations