Создание и регистрация кастомных типов переменной и кастомные валидаторы

Коллеги, всем привет!

Появилась необходимость проверять MIME-Type у приложенных файлов в пользовательской задаче.

Используется camunda версии 7.13.0

Как выяснилось при создании формы в Camunda Modeler типа переменной file нет. Поэтому реализовал собственный тип как описано ниже:

и зарегистрировал его в конфигурацинном файле камунды:

@Override
    public void preInit(ProcessEngineConfigurationImpl processEngineConfiguration) {
        if (processEngineConfiguration.getCustomFormTypes() == null) {
            processEngineConfiguration.setCustomFormTypes(new ArrayList<AbstractFormFieldType>());
        }

        List<AbstractFormFieldType> formTypes = processEngineConfiguration.getCustomFormTypes();
        formTypes.add(new FileFormFieldType());
    }

Далее создал кастомный валидатор и сделал обращение к нему из формы при помощи вызова бина как в примере ниже:
В конце главы про generated-task-forms

Данный валидатор вызывается при сабмите формы как и положено. Основная задача его проверить, что приложенный файл имеет нужный MIME-type. Но данный файл поступает в метод как inputObject и является экземпляром ByteArrayInputStream. Получить метаданные из variableScope - не получается, т.к. данная переменная еще не находится в скоупе переменных процесса.

Подскажите, где что делаю не так или, может, другой рабочий подход. Но хотелось бы разобраться как делать через кастомные валидаторы :slight_smile:

Если исходить из утверждения, что имя поля формы = имя переменной процесса, то можно реализовать валидатор через TypedVariable:

public class CustomValidator implements FormFieldValidator {

    public boolean validate(Object submittedValue, FormFieldValidatorContext validatorContext) {

        // ... do some custom validation of the submittedValue

        // get access to the current execution
        DelegateExecution e = validatorContext.getExecution();

        // get access to all form fields submitted in the form submit
        Map<String,Object> completeSubmit = validatorContext.getSubmittedValues();

        // Получить TypedVariable (это обертка над переменной процесса, содержащая в себе метаданные:
        // имя файла, mime-type, способ сериализации, класс объекта и ид
        FileValue fileValue = validatorContext.getVariableScope().getVariableTyped("file");

        InputStream is = fileValue.getValue();
        String fileName = fileValue.getFilename();
        String encoding = fileValue.getEncoding();
        String mimeType = fileValue.getMimeType();
        
        // Только фоточки
        return mimeType.equals(MimeTypes.JPG);

    }

}