diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy index f00157c40fa..18521bc1a0b 100644 --- a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy @@ -35,6 +35,7 @@ import com.netgrif.application.engine.rules.domain.RuleRepository import com.netgrif.application.engine.startup.DefaultFiltersRunner import com.netgrif.application.engine.startup.FilterRunner import com.netgrif.application.engine.utils.FullPageRequest +import com.netgrif.application.engine.validations.interfaces.IValidationService import com.netgrif.application.engine.workflow.domain.* import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome @@ -177,6 +178,9 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { @Autowired PublicViewProperties publicViewProperties + @Autowired + IValidationService validationService + FrontendActionOutcome Frontend /** @@ -1084,8 +1088,8 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { } } - Validation validation(String rule, I18nString message) { - return new Validation(rule, message) + Validation validation(String name, Arguments clientArguments, Arguments serverArguments, I18nString message) { + return new Validation(name, clientArguments, serverArguments, message) } // TODO: release/8.0.0 remove? diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ValidationDelegate.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ValidationDelegate.groovy new file mode 100644 index 00000000000..255666ba6ea --- /dev/null +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ValidationDelegate.groovy @@ -0,0 +1,145 @@ +package com.netgrif.application.engine.petrinet.domain.dataset.logic.action + + +import com.netgrif.application.engine.petrinet.domain.dataset.* +import groovy.util.logging.Slf4j + +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.time.format.DateTimeParseException + +@Slf4j +class ValidationDelegate { + + public static final String FUTURE = 'future' + public static final String TODAY = 'today' + public static final String PAST = 'past' + public static final String NOW = 'now' + public static final String INF = 'inf' + public static final String TEL_NUMBER_REGEX = '^(?:\\+?(\\d{1,3}))?([-. (]*(\\d{3})[-. )]*)?((\\d{3})[-. ]*(\\d{2,4})(?:[-.x ]*(\\d+))?)$' + public static final String EMAIL_REGEX = '^[a-zA-Z0-9\\._\\%\\+\\-]+@[a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,}$' + + // todo NAE-1788: thisField keyword + Field thisField + + Boolean notEmpty() { return thisField.rawValue != null } + + // boolean field validations + Boolean requiredTrue() { return thisField instanceof BooleanField && notEmpty() && thisField.rawValue == true } + + // date field validations + Boolean between(def from, def to) { + if (!(thisField instanceof DateField || thisField instanceof DateTimeField)) { + return false + } + + LocalDateTime updateDate_TODAY = thisField instanceof DateField ? LocalDate.now().atStartOfDay() : LocalDateTime.now() + LocalDateTime thisFieldValue = thisField.rawValue instanceof LocalDateTime ? thisField.rawValue : thisField.rawValue.atStartOfDay() + + def fromDate = from + if (from instanceof String) { + LocalDate parsedDate = parseStringToLocalDate(from) + fromDate = parsedDate ? parsedDate.atStartOfDay() : from + } + + def toDate = to + if (to instanceof String) { + LocalDate parsedDate = parseStringToLocalDate(to) + toDate = parsedDate ? parsedDate.atStartOfDay() : to + } + + if ((fromDate == TODAY || fromDate == NOW) && toDate == FUTURE) { + if (thisFieldValue < updateDate_TODAY) { + return false + } + } else if (fromDate == PAST && (toDate == TODAY || toDate == NOW)) { + if (thisFieldValue > updateDate_TODAY) { + return false + } + } else if (fromDate == PAST && (toDate instanceof LocalDateTime)) { + if (thisFieldValue > toDate) { + return false + } + } else if (fromDate == TODAY && (toDate instanceof LocalDateTime)) { + if (thisFieldValue > toDate || thisFieldValue < updateDate_TODAY) { + return false + } + } else if ((fromDate instanceof LocalDateTime) && toDate == TODAY) { + if (thisFieldValue < fromDate || thisFieldValue > updateDate_TODAY) { + return false + } + } else if (toDate == FUTURE && (fromDate instanceof LocalDateTime)) { + if (thisFieldValue < fromDate) { + return false + } + } else if ((fromDate instanceof LocalDateTime) && (toDate instanceof LocalDateTime)) { + if (thisFieldValue > toDate || thisFieldValue < fromDate) { + return false + } + } + return true + } + + Boolean workday() { return (thisField instanceof DateField || thisField instanceof DateTimeField) && notEmpty() && !thisField.rawValue.dayOfWeek.isWeekend() } + + + Boolean weekend() { return (thisField instanceof DateField || thisField instanceof DateTimeField) && notEmpty() && thisField.rawValue.dayOfWeek.isWeekend() } + + protected static LocalDate parseStringToLocalDate(String stringDate) { + if (stringDate == null) { + return null + } + List patterns = Arrays.asList("dd.MM.yyyy", "") + try { + return LocalDate.parse(stringDate, DateTimeFormatter.BASIC_ISO_DATE) + } catch (DateTimeParseException ignored) { + try { + return LocalDate.parse(stringDate, DateTimeFormatter.ISO_DATE) + } catch (DateTimeParseException ignored2) { + for (String pattern : patterns) { + try { + return LocalDateTime.parse(stringDate, DateTimeFormatter.ofPattern(pattern)) + } catch (DateTimeParseException | IllegalArgumentException ignored3) { + } + } + } + } + return null + } + + // number field validations + Boolean odd() { return thisField instanceof NumberField && notEmpty() && thisField.rawValue as Double % 2 != 0 } + + Boolean even() { return thisField instanceof NumberField && notEmpty() && thisField.rawValue as Double % 2 == 0 } + + Boolean positive() { return thisField instanceof NumberField && notEmpty() && thisField.rawValue >= 0 } + + Boolean negative() { return thisField instanceof NumberField && notEmpty() && thisField.rawValue <= 0 } + + Boolean decimal() { return thisField instanceof NumberField && notEmpty() && thisField.rawValue as Double % 1 == 0 } + + Boolean inrange(def from, def to) { + + if (from instanceof String && from.toLowerCase() == INF) { + from = Double.MIN_VALUE + } + + if (to instanceof String && to.toLowerCase() == INF) { + to = Double.MAX_VALUE + } + return thisField instanceof NumberField && notEmpty() && thisField.rawValue >= from as Double && thisField.rawValue <= to as Double + } + + // text field validations + Boolean regex(String pattern) { return thisField instanceof TextField && notEmpty() && thisField.rawValue ==~ pattern } + + Boolean minLength(Integer minLength) { return thisField instanceof TextField && notEmpty() && (thisField.rawValue as String).length() >= minLength } + + Boolean maxLength(Integer maxLength) { return thisField instanceof TextField && notEmpty() && (thisField.rawValue as String).length() <= maxLength } + + Boolean telNumber() { return regex(TEL_NUMBER_REGEX) } + + Boolean email() { return regex(EMAIL_REGEX) } + +} diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ValidationExecutioner.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ValidationExecutioner.groovy new file mode 100644 index 00000000000..5b7f5e7cd9f --- /dev/null +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ValidationExecutioner.groovy @@ -0,0 +1,94 @@ +package com.netgrif.application.engine.petrinet.domain.dataset.logic.action + +import com.netgrif.application.engine.event.IGroovyShellFactory +import com.netgrif.application.engine.petrinet.domain.dataset.Field +import com.netgrif.application.engine.petrinet.domain.dataset.Validation +import com.netgrif.application.engine.validations.ValidationRegistry +import com.netgrif.application.engine.workflow.domain.Case +import groovy.util.logging.Slf4j +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Lookup +import org.springframework.stereotype.Component + +@Slf4j +@Component +abstract class ValidationExecutioner { + + @Lookup("validationDelegate") + abstract ValidationDelegate getValidationDelegate() + + @Autowired + private ValidationRegistry registry; + + @Autowired + private IGroovyShellFactory shellFactory + + void execute(Case useCase, Field field, List validations) { + if (!validations) { + return + } + + log.info("Validations: ${validations.collect { it.name }}") + + ValidationDelegate delegate = initDelegate(useCase, field, validations.collect { it.name }) + validations.each { validation -> + runValidation(field, validation, delegate) + } + } + + protected void runValidation(Field field, Validation validation, ValidationDelegate delegate) { + if (field.rawValue == null) { + return + } + + Closure code = initCode(validation, delegate) + if (!code()) { + throw new IllegalArgumentException(validation.message.toString()) + } + } + + protected Closure getValidationCode(String validationName) { + return this.registry.getValidation(validationName) + } + + protected static String escapeSpecialCharacters(String s){ + return s.replace('\\', '\\\\') + .replace('\'', '\\\'') + } + + protected Closure initCode(Validation validation, ValidationDelegate delegate) { + List argumentList = [] + if (validation.serverArguments != null) { + argumentList = validation.serverArguments.argument.collect { it.isDynamic ? it.value : "'${escapeSpecialCharacters(it.value)}'" } + } + String validationCall = "${validation.name}(${argumentList.join(", ")})" + Closure code = this.shellFactory.getGroovyShell().evaluate("{ -> return " + validationCall + " }") as Closure + return code.rehydrate(delegate, code.owner, code.thisObject) + } + + protected ValidationDelegate initDelegate(Case useCase, Field thisField, List validationNames) { + ValidationDelegate delegate = getValidationDelegate() + delegate.metaClass.useCase = useCase + useCase.dataSet.fields.values().forEach { Field field -> + delegate.metaClass."$field.importId" = field + } + + validationNames = filterConflictedValidationNames(useCase, validationNames) + validationNames.each { validationName -> + delegate.metaClass."$validationName" = getValidationCode(validationName) + } + + delegate.thisField = thisField + return delegate + } + + private static List filterConflictedValidationNames(Case useCase, List validationNames) { + List fieldNames = useCase.dataSet.fields.keySet() as List + fieldNames.retainAll(validationNames) + if (!fieldNames.isEmpty()) { + log.warn("Ignoring validations {} for case [{}]: field names are identical with validation names", fieldNames, useCase.stringId) + validationNames -= fieldNames + } + return validationNames + } +} diff --git a/src/main/groovy/com/netgrif/application/engine/startup/RunnerController.groovy b/src/main/groovy/com/netgrif/application/engine/startup/RunnerController.groovy index d4ee2174a85..5b90e32db4d 100644 --- a/src/main/groovy/com/netgrif/application/engine/startup/RunnerController.groovy +++ b/src/main/groovy/com/netgrif/application/engine/startup/RunnerController.groovy @@ -27,6 +27,7 @@ class RunnerController { MailRunner, DemoRunner, QuartzSchedulerRunner, + ValidationRunner, FinisherRunnerSuperCreator, FinisherRunner, ] diff --git a/src/main/groovy/com/netgrif/application/engine/startup/ValidationRunner.groovy b/src/main/groovy/com/netgrif/application/engine/startup/ValidationRunner.groovy new file mode 100644 index 00000000000..be1f8fbcfc8 --- /dev/null +++ b/src/main/groovy/com/netgrif/application/engine/startup/ValidationRunner.groovy @@ -0,0 +1,58 @@ +package com.netgrif.application.engine.startup + +import com.netgrif.application.engine.auth.service.interfaces.IUserService +import com.netgrif.application.engine.validations.interfaces.IValidationService +import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.QCase +import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository +import com.querydsl.core.types.Predicate +import groovy.util.logging.Slf4j +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.data.domain.PageRequest +import org.springframework.stereotype.Component + +@Slf4j +@Component +class ValidationRunner extends AbstractOrderedCommandLineRunner { + + private static final int PAGE_SIZE = 100 + public static final String VALIDATION_FILE_NAME = "engine-processes/validations/validation.xml" + public static final String VALIDATION_PETRI_NET_IDENTIFIER = "validation" + public static final String VALIDATION_ACTIVE_PLACE_ID = "active" + public static final String VALIDATION_NAME_FIELD_ID = "name" + public static final String VALIDATION_GROOVY_DEFINITION_FIELD_ID = "validation_definition_groovy" + + @Autowired + private ImportHelper helper + + @Autowired + private IUserService userService + + @Autowired + private IValidationService validationService + + @Autowired + private CaseRepository caseRepository + + @Override + void run(String... strings) throws Exception { + log.info("Starting validation runner") + + helper.upsertNet(VALIDATION_FILE_NAME, VALIDATION_PETRI_NET_IDENTIFIER) + Predicate predicate = QCase.case$.processIdentifier.eq(VALIDATION_PETRI_NET_IDENTIFIER) & QCase.case$.activePlaces.get(VALIDATION_ACTIVE_PLACE_ID).isNotNull() + long numberActiveValidations = caseRepository.count(predicate) + int pageCount = (int) (numberActiveValidations / PAGE_SIZE) + 1 + pageCount.times { pageNum -> + caseRepository.findAll(predicate, PageRequest.of(pageNum, PAGE_SIZE)) + .getContent() + .each { Case validationCase -> + validationService.registerValidation( + validationCase.getDataSet().get(VALIDATION_NAME_FIELD_ID).rawValue as String, + validationCase.getDataSet().get(VALIDATION_GROOVY_DEFINITION_FIELD_ID).rawValue as String + ) + } + } + + log.info("Validation runner finished, [{}] validations successfully imported", numberActiveValidations) + } +} \ No newline at end of file diff --git a/src/main/groovy/com/netgrif/application/engine/validation/domain/ValidationDataInput.groovy b/src/main/groovy/com/netgrif/application/engine/validation/domain/ValidationDataInput.groovy deleted file mode 100644 index 97e6f6865a1..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/domain/ValidationDataInput.groovy +++ /dev/null @@ -1,24 +0,0 @@ -package com.netgrif.application.engine.validation.domain - -import com.netgrif.application.engine.petrinet.domain.I18nString -import com.netgrif.application.engine.petrinet.domain.dataset.Field -import lombok.AllArgsConstructor -import lombok.Data - -class ValidationDataInput { - - Field data - - I18nString validationMessage - - Locale locale - - String validationRegex - - ValidationDataInput(Field data, I18nString validationMessage, Locale locale, String validationRegex) { - this.data = data - this.validationMessage = validationMessage - this.locale = locale - this.validationRegex = validationRegex - } -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/AbstractFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/AbstractFieldValidation.groovy deleted file mode 100644 index 16b2c490718..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/AbstractFieldValidation.groovy +++ /dev/null @@ -1,14 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -class AbstractFieldValidation implements Serializable { - - private static final long serialVersionUID = 3287601522204188694L - - void notempty(ValidationDataInput validationData) { - if (validationData.getData().getValue() == null || validationData.getData().getRawValue() == null) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/BooleanFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/BooleanFieldValidation.groovy deleted file mode 100644 index 201e8460ce0..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/BooleanFieldValidation.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.petrinet.domain.dataset.BooleanField -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -class BooleanFieldValidation extends AbstractFieldValidation { - -// REQUIRED_TRUE = 'requiredTrue' -// REQUIRED = 'required' - - void requiredtrue(ValidationDataInput validationData) { - Boolean value = ((BooleanField) validationData.getData()).getRawValue() - if (!(value == true) || value == null) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/DateFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/DateFieldValidation.groovy deleted file mode 100644 index 3beaecd6294..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/DateFieldValidation.groovy +++ /dev/null @@ -1,122 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.petrinet.domain.dataset.DateField -import com.netgrif.application.engine.petrinet.domain.dataset.DateTimeField -import com.netgrif.application.engine.petrinet.domain.dataset.Field -import com.netgrif.application.engine.validation.domain.ValidationDataInput -import groovy.util.logging.Slf4j - -import java.time.DayOfWeek -import java.time.LocalDate -import java.time.format.DateTimeFormatter -import java.time.format.DateTimeParseException -import java.time.temporal.ChronoField - -@Slf4j -class DateFieldValidation extends AbstractFieldValidation { - -// BETWEEN = 'between' -// WORKDAY = 'workday' -// WEEKEND = 'weekend' -// REQUIRED = 'required', -// VALID_BETWEEN = 'validBetween', -// VALID_WORKDAY = 'validWorkday', -// VALID_WEEKEND = 'validWeekend' - -// between today,future -// between past,today -// between 2020-03-03,today - - public static final String FUTURE = "future" - public static final String TODAY = "today" - public static final String PAST = "past" - public static final String NOW = "now" - - void between(ValidationDataInput validationData) { - LocalDate updateDate_TODAY = LocalDate.now() - List regex = validationData.getValidationRegex().trim().split(",") - LocalDate setDate = getDateValue(validationData.getData()) - - if (regex.size() == 2) { - def fromDate = parseStringToLocalDate(regex.get(0)) != null ? parseStringToLocalDate(regex.get(0)) : regex.get(0) - def toDate = parseStringToLocalDate(regex.get(1)) != null ? parseStringToLocalDate(regex.get(1)) : regex.get(1) - if ((fromDate == TODAY || fromDate == NOW) && toDate == FUTURE) { - if (setDate < updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (fromDate == PAST && (toDate == TODAY || toDate == NOW)) { - if (setDate > updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (fromDate == PAST && (toDate instanceof LocalDate)) { - if (setDate > toDate) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (fromDate == TODAY && (toDate instanceof LocalDate)) { - if (setDate < toDate || setDate > updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if ((fromDate instanceof LocalDate) && toDate == TODAY) { - if (setDate < fromDate || setDate > updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (toDate == FUTURE && (fromDate instanceof LocalDate)) { - if (setDate < fromDate) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if ((fromDate instanceof LocalDate) && (toDate instanceof LocalDate)) { - if (setDate > toDate || setDate < fromDate) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - } - - void workday(ValidationDataInput validationData) { - LocalDate setDate = getDateValue(validationData.getData()) - if (isWeekend(setDate)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - - void weekend(ValidationDataInput validationData) { - LocalDate setDate = getDateValue(validationData.getData()) - if (!isWeekend(setDate)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - - // TODO: release/8.0.0 Refactor, each type own validator with common functions - LocalDate getDateValue(Field field) { - if (field instanceof DateField) { - return ((DateField) field).getRawValue() - } - throw new IllegalArgumentException("Cannot validate field " + field.stringId + " of type " + field.type + " with date validation") - } - - protected static boolean isWeekend(LocalDate day) { - DayOfWeek dayOfWeek = DayOfWeek.of(day.get(ChronoField.DAY_OF_WEEK)); - return dayOfWeek == DayOfWeek.SUNDAY || dayOfWeek == DayOfWeek.SATURDAY; - } - - protected LocalDate parseStringToLocalDate(String stringDate) { - if (stringDate == null) { - return null - } - List patterns = Arrays.asList("dd.MM.yyyy") - try { - return LocalDate.parse(stringDate, DateTimeFormatter.BASIC_ISO_DATE) - } catch (DateTimeParseException ignored) { - try { - return LocalDate.parse(stringDate, DateTimeFormatter.ISO_DATE) - } catch (DateTimeParseException ignored2) { - for (String pattern : patterns) { - try { - return LocalDate.parse(stringDate, DateTimeFormatter.ofPattern(pattern)) - } catch (DateTimeParseException | IllegalArgumentException ignored3) {} - } - } - } - return null - } -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/DateTimeFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/DateTimeFieldValidation.groovy deleted file mode 100644 index 20d58c025c4..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/DateTimeFieldValidation.groovy +++ /dev/null @@ -1,122 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.petrinet.domain.dataset.DateField -import com.netgrif.application.engine.petrinet.domain.dataset.DateTimeField -import com.netgrif.application.engine.petrinet.domain.dataset.Field -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -import java.time.DayOfWeek -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import java.time.format.DateTimeParseException -import java.time.temporal.ChronoField - -class DateTimeFieldValidation extends AbstractFieldValidation { - -// BETWEEN = 'between' -// WORKDAY = 'workday' -// WEEKEND = 'weekend' -// REQUIRED = 'required', -// VALID_BETWEEN = 'validBetween', -// VALID_WORKDAY = 'validWorkday', -// VALID_WEEKEND = 'validWeekend' - -// between today,future -// between past,today -// between 2020-03-03,today - - public static final String FUTURE = "future" - public static final String TODAY = "today" - public static final String PAST = "past" - public static final String NOW = "now" - - - void between(ValidationDataInput validationData) { - LocalDateTime updateDate_TODAY = LocalDateTime.now() - List regex = validationData.getValidationRegex().trim().split(",") - LocalDateTime setDate = getDateTimeValue(validationData.getData()) - if (regex.size() == 2) { - def fromDate = parseStringToLocalDateTime(regex.get(0)) != null ? parseStringToLocalDateTime(regex.get(0)) : regex.get(0) - def toDate = parseStringToLocalDateTime(regex.get(1)) != null ? parseStringToLocalDateTime(regex.get(1)) : regex.get(1) - if ((fromDate == TODAY || fromDate == NOW) && toDate == FUTURE) { - if (setDate < updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (fromDate == PAST && (toDate == TODAY || toDate == NOW)) { - if (setDate > updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (fromDate == PAST && (toDate instanceof LocalDateTime)) { - if (setDate > toDate) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (fromDate == TODAY && (toDate instanceof LocalDateTime)) { - if (setDate < toDate || setDate > updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if ((fromDate instanceof LocalDateTime) && toDate == TODAY) { - if (setDate < fromDate || setDate > updateDate_TODAY) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if (toDate == FUTURE && (fromDate instanceof LocalDateTime)) { - if (setDate < fromDate) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else if ((fromDate instanceof LocalDateTime) && (toDate instanceof LocalDateTime)) { - if (setDate > toDate || setDate < fromDate) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - } - - void workday(ValidationDataInput validationData) { - LocalDateTime setDate = getDateTimeValue(validationData.getData()) - if (isWeekend(setDate)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - - void weekend(ValidationDataInput validationData) { - LocalDateTime setDate = getDateTimeValue(validationData.getData()) - if (!isWeekend(setDate)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - - protected static boolean isWeekend(LocalDateTime day) { - DayOfWeek dayOfWeek = DayOfWeek.of(day.get(ChronoField.DAY_OF_WEEK)); - return dayOfWeek == DayOfWeek.SUNDAY || dayOfWeek == DayOfWeek.SATURDAY; - } -// TODO: release/8.0.0 Refactor, each type own validator with common functions - LocalDateTime getDateTimeValue(Field field) { - if (field instanceof DateTimeField) { - return ((DateTimeField) field).getRawValue() - } - throw new IllegalArgumentException("Cannot validate field " + field.stringId + " of type " + field.type + " with date validation") - } - - protected static LocalDateTime parseStringToLocalDateTime(String stringDate) { - if (stringDate == null) - return null - - List patterns = Arrays.asList("dd.MM.yyyy") - try { - return LocalDate.parse(stringDate, DateTimeFormatter.BASIC_ISO_DATE) - } catch (DateTimeParseException e) { - try { - return LocalDate.parse(stringDate, DateTimeFormatter.ISO_DATE) - } catch (DateTimeParseException ex) { - for (String pattern : patterns) { - try { - return LocalDate.parse(stringDate, DateTimeFormatter.ofPattern(pattern)) - } catch (DateTimeParseException | IllegalArgumentException exc) { - continue - } - } - } - } - return null - } -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/EnumerationFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/EnumerationFieldValidation.groovy deleted file mode 100644 index 265390cce75..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/EnumerationFieldValidation.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -class EnumerationFieldValidation extends AbstractFieldValidation { - -// WRONG_VALUE = 'wrongValue', -// REQUIRED = 'required' - - // TODO: release/8.0.0 should not be possible, setOption should null value if the options is no longer present - void wrongValue(ValidationDataInput validationData) { -// if (!(validationData.getData().getOptions().get(validationData.getData().getValue()))) { -// throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) -// } - } - -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/I18nFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/I18nFieldValidation.groovy deleted file mode 100644 index ae65744bb9f..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/I18nFieldValidation.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -class I18nFieldValidation extends AbstractFieldValidation { - -// TRANSLATION_REQUIRED = 'translationRequired', -// TRANSLATION_ONLY = 'translationOnly', -// REQUIRED_I18N = 'requiredI18n' - - void wrongValue(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == true)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/NumberFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/NumberFieldValidation.groovy deleted file mode 100644 index 070ed4dd80d..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/NumberFieldValidation.groovy +++ /dev/null @@ -1,93 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -class NumberFieldValidation extends AbstractFieldValidation { - static final String INF = 'inf' - -// static final String ODD = 'odd' -// static final String EVEN = 'even' -// static final String POSITIVE = 'positive' -// static final String NEGATIVE = 'negative' -// static final String DECIMAL = 'decimal' -// static final String IN_RANGE = 'inrange' -// static final String INF = 'inf' -// static final String REQUIRED = 'required' -// static final String VALID_ODD = 'validOdd' -// static final String VALID_EVEN = 'validEven' -// static final String VALID_POSITIVE = 'validPositive' -// static final String VALID_NEGATIVE = 'validNegative' -// static final String VALID_DECIMAL = 'validDecimal' -// static final String VALID_IN_RANGE = 'validInRange' - - - void odd(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == null || validationData.getData().getRawValue() == null)) { - if (validationData.getData().getRawValue() % 2 == 0) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void even(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == null || validationData.getData().getRawValue() == null)) { - if (validationData.getData().getRawValue() % 2 != 0) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void positive(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == null || validationData.getData().getRawValue() == null)) { - if (validationData.getData().getRawValue() < 0) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void negative(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == null || validationData.getData().getRawValue() == null)) { - - - if (validationData.getData() != null) { - if (validationData.getData().getRawValue() > 0) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - } - - void decimal(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == null || validationData.getData().getRawValue() == null)) { - if (validationData.getData().getRawValue() % 1 != 0) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void inrange(ValidationDataInput validationData) { - if (!(validationData.getData().getValue() == null || validationData.getData().getRawValue() == null)) { - String[] ranges = validationData.validationRegex.split(",") - if (ranges.size() == 2) { - if (ranges.any { it.toLowerCase().equals(INF) }) { - if (ranges.first().toLowerCase() != INF) { - if (validationData.getData().getRawValue() < ranges[0] as Double) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } else { - if (ranges[1].toLowerCase() != INF) { - if (validationData.getData().getRawValue() > ranges[1] as Double) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - } else { - if (validationData.getData().getRawValue() < ranges[0] as Double || validationData.getData().getRawValue() > ranges[1] as Double) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - } - } - -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/models/TextFieldValidation.groovy b/src/main/groovy/com/netgrif/application/engine/validation/models/TextFieldValidation.groovy deleted file mode 100644 index 33abd482be3..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/models/TextFieldValidation.groovy +++ /dev/null @@ -1,60 +0,0 @@ -package com.netgrif.application.engine.validation.models - -import com.netgrif.application.engine.validation.domain.ValidationDataInput - -class TextFieldValidation extends AbstractFieldValidation { - - public static String telNumberRegex = '^(?:\\+?(\\d{1,3}))?([-. (]*(\\d{3})[-. )]*)?((\\d{3})[-. ]*(\\d{2,4})(?:[-.x ]*(\\d+))?)$' - public static String emailRegex = '^[a-zA-Z0-9\\._\\%\\+\\-]+@[a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,}$' -// REQUIRED = 'required' -// MIN_LENGTH = 'minLength' -// MAX_LENGTH = 'maxLength' -// VALID_MIN_LENGTH = 'minlength' -// VALID_MAX_LENGTH = 'maxlength' -// PATTERN = 'pattern' -// REGEX = 'regex' -// VALID_TEL_NUMBER = 'validTelNumber' -// TEL_NUMBER = 'telNumber' -// EMAIL = 'email' - - void regex(ValidationDataInput validationData) { - if (validationData.getData().getValue() != null && validationData.getData().getRawValue() != null) { - if (!(validationData.getData().getRawValue() ==~ validationData.getValidationRegex())) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void minlength(ValidationDataInput validationData) { - if (validationData.getData().getValue() != null && validationData.getData().getRawValue() != null) { - if (!((validationData.getData().getRawValue() as String).length() >= (validationData.getValidationRegex() as Integer))) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void maxlength(ValidationDataInput validationData) { - if (validationData.getData().getValue() != null && validationData.getData().getRawValue() != null) { - if ((validationData.getData().getRawValue() as String).length() > (validationData.getValidationRegex() as Integer)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void telnumber(ValidationDataInput validationData) { - if (validationData.getData().getValue() != null && validationData.getData().getRawValue() != null) { - if (!(validationData.getData().getRawValue() ==~ telNumberRegex)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - - void email(ValidationDataInput validationData) { - if (validationData.getData().getValue() != null && validationData.getData().getRawValue() != null) { - if (!(validationData.getData().getRawValue() ==~ emailRegex)) { - throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale())) - } - } - } - -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/service/ValidationService.groovy b/src/main/groovy/com/netgrif/application/engine/validation/service/ValidationService.groovy deleted file mode 100644 index 26e8b77afcc..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/service/ValidationService.groovy +++ /dev/null @@ -1,75 +0,0 @@ -package com.netgrif.application.engine.validation.service - -import com.netgrif.application.engine.petrinet.domain.I18nString -import com.netgrif.application.engine.petrinet.domain.dataset.* -import com.netgrif.application.engine.validation.domain.ValidationDataInput -import com.netgrif.application.engine.validation.models.* -import com.netgrif.application.engine.validation.service.interfaces.IValidationService -import groovy.util.logging.Slf4j -import org.springframework.context.i18n.LocaleContextHolder -import org.springframework.stereotype.Service - -import java.util.stream.Collectors - -@Slf4j -@Service -class ValidationService implements IValidationService { - - @Override - void valid(Field dataField) { - if (dataField.getValidations() == null) { - return - } - dataField.getValidations().forEach(validation -> { - List rules = validation.getRule().trim().split(" ").toList() - if (rules.size() >= 1) { - AbstractFieldValidation instance = new AbstractFieldValidation() - if (dataField instanceof NumberField) { - instance = new NumberFieldValidation() - } else if (dataField instanceof TextField) { - instance = new TextFieldValidation() - } else if (dataField instanceof BooleanField) { - instance = new BooleanFieldValidation() - } else if (dataField instanceof DateField) { - instance = new DateFieldValidation() - } else if (dataField instanceof DateTimeField) { - instance = new DateTimeFieldValidation() - } else if (dataField instanceof ButtonField) { - - } else if (dataField instanceof UserField) { - - } else if (dataField instanceof DateField) { - - } else if (dataField instanceof DateTimeField) { - - } else if (dataField instanceof EnumerationField) { - - } else if (dataField instanceof EnumerationMapField) { - - } else if (dataField instanceof MultichoiceMapField) { - - } else if (dataField instanceof MultichoiceField) { - - } else if (dataField instanceof FileField) { - - } else if (dataField instanceof FileListField) { - - } else if (dataField instanceof UserListField) { - - } else if (dataField instanceof I18nField) { - - } - MetaMethod method = instance.metaClass.getMethods().find { it.name.toLowerCase() == rules.first().toLowerCase() } - if (method != null) { - I18nString validMessage = validation.getMessage() ?: new I18nString("Invalid Field value") - method.invoke(instance, new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" ")))) - } else { - log.warn("Method [" + rules.first() + "] in dataField " + dataField.getImportId() + " not found") - } - } - }) - - - } - -} diff --git a/src/main/groovy/com/netgrif/application/engine/validation/service/interfaces/IValidationService.groovy b/src/main/groovy/com/netgrif/application/engine/validation/service/interfaces/IValidationService.groovy deleted file mode 100644 index 22ed23b223c..00000000000 --- a/src/main/groovy/com/netgrif/application/engine/validation/service/interfaces/IValidationService.groovy +++ /dev/null @@ -1,8 +0,0 @@ -package com.netgrif.application.engine.validation.service.interfaces - -import com.netgrif.application.engine.petrinet.domain.dataset.Field - -interface IValidationService { - - void valid(Field dataField); -} \ No newline at end of file diff --git a/src/main/java/com/netgrif/application/engine/configuration/PrototypesConfiguration.java b/src/main/java/com/netgrif/application/engine/configuration/PrototypesConfiguration.java index b23b385c5ac..cda58dc5076 100644 --- a/src/main/java/com/netgrif/application/engine/configuration/PrototypesConfiguration.java +++ b/src/main/java/com/netgrif/application/engine/configuration/PrototypesConfiguration.java @@ -4,6 +4,7 @@ import com.netgrif.application.engine.importer.service.Importer; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionDelegate; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ExpressionDelegate; +import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ValidationDelegate; import com.netgrif.application.engine.workflow.domain.FileStorageConfiguration; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Bean; @@ -31,6 +32,12 @@ public ExpressionDelegate expressionDelegate() { return new ExpressionDelegate(); } + @Bean("validationDelegate") + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public ValidationDelegate validationDelegate() { + return new ValidationDelegate(); + } + @Bean("fileStorageConfiguration") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public FileStorageConfiguration fileStorageConfiguration() { diff --git a/src/main/java/com/netgrif/application/engine/export/service/ExportService.java b/src/main/java/com/netgrif/application/engine/export/service/ExportService.java index 5cb141defb3..c214cfe061d 100644 --- a/src/main/java/com/netgrif/application/engine/export/service/ExportService.java +++ b/src/main/java/com/netgrif/application/engine/export/service/ExportService.java @@ -15,6 +15,7 @@ import com.netgrif.application.engine.workflow.domain.Task; import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository; import com.netgrif.application.engine.workflow.domain.repositories.TaskRepository; +import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import com.querydsl.core.types.Predicate; @@ -59,6 +60,8 @@ public class ExportService implements IExportService { @Autowired private IUserService userService; + @Autowired + private IDataService dataService; @Override public Set buildDefaultCsvCaseHeader(List exportCases) { @@ -74,7 +77,7 @@ public Set buildDefaultCsvTaskHeader(List exportTasks) { Set header = new LinkedHashSet<>(); exportTasks.forEach( exportTask -> - header.addAll(exportTask.getImmediateDataFields()) + header.addAll(dataService.getImmediateFields(exportTask).stream().map(Field::getStringId).collect(Collectors.toSet())) ); return header; } diff --git a/src/main/java/com/netgrif/application/engine/importer/service/FieldFactory.java b/src/main/java/com/netgrif/application/engine/importer/service/FieldFactory.java index bbb0903f021..06d6603545e 100644 --- a/src/main/java/com/netgrif/application/engine/importer/service/FieldFactory.java +++ b/src/main/java/com/netgrif/application/engine/importer/service/FieldFactory.java @@ -3,14 +3,11 @@ import com.netgrif.application.engine.configuration.properties.DatabaseProperties; import com.netgrif.application.engine.importer.model.Data; import com.netgrif.application.engine.importer.model.DataType; -import com.netgrif.application.engine.importer.model.Valid; import com.netgrif.application.engine.importer.service.builder.FieldBuilder; import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; import com.netgrif.application.engine.importer.service.validation.IDataValidator; import com.netgrif.application.engine.petrinet.domain.Component; -import com.netgrif.application.engine.petrinet.domain.I18nString; -import com.netgrif.application.engine.petrinet.domain.dataset.Field; -import com.netgrif.application.engine.petrinet.domain.dataset.Validation; +import com.netgrif.application.engine.petrinet.domain.dataset.*; import lombok.extern.slf4j.Slf4j; import java.util.List; @@ -54,19 +51,18 @@ Field getField(Data data, Importer importer) throws IllegalArgumentException, if (data.getPlaceholder() != null) field.setPlaceholder(importer.toI18NString(data.getPlaceholder())); - // TODO: release/8.0.0 validation register - // TODO: release/8.0.0 valid deprecated - if (data.getValid() != null) { - List list = data.getValid(); - for (Valid item : list) { - // TODO: release/8.0.0 new I18nString? - field.addValidation(new Validation(item.getValue(), new I18nString())); - } - } if (data.getValidations() != null) { List list = data.getValidations().getValidation(); for (com.netgrif.application.engine.importer.model.Validation item : list) { - field.addValidation(new Validation(item.getExpression().getValue(), importer.toI18NString(item.getMessage()))); + Arguments clientArguments = null; + if (item.getClientArguments() != null) { + clientArguments = new Arguments(item.getClientArguments().getArgument().stream().map(arg -> new Argument(arg.getValue(), arg.isDynamic())).collect(Collectors.toList())); + } + Arguments serverArguments = null; + if (item.getServerArguments() != null) { + serverArguments = new Arguments(item.getServerArguments().getArgument().stream().map(arg -> new Argument(arg.getValue(), arg.isDynamic())).collect(Collectors.toList())); + } + field.addValidation(new Validation(item.getName(), clientArguments, serverArguments, importer.toI18NString(item.getMessage()))); } } if (data.getComponent() != null) { diff --git a/src/main/java/com/netgrif/application/engine/importer/service/validation/DataValidator.java b/src/main/java/com/netgrif/application/engine/importer/service/validation/DataValidator.java index 4cf2a9dfe33..4a96c4b65d1 100644 --- a/src/main/java/com/netgrif/application/engine/importer/service/validation/DataValidator.java +++ b/src/main/java/com/netgrif/application/engine/importer/service/validation/DataValidator.java @@ -11,7 +11,6 @@ public class DataValidator extends ModelValidator implements IDataValidator { @Override public void checkDeprecatedAttributes(Data data) { validateAttribute(data.getView(), "view", data.getId()); - validateAttribute(data.getValid() != null && !data.getValid().isEmpty() ? data.getValid() : null, "valid", data.getId()); validateAttribute(data.getFormat(), "format", data.getId()); validateAttribute(data.getValues() != null && !data.getValues().isEmpty() ? data.getValues() : null, "values", data.getId()); } diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Argument.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Argument.java new file mode 100644 index 00000000000..bcd44dd3fc2 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Argument.java @@ -0,0 +1,27 @@ +package com.netgrif.application.engine.petrinet.domain.dataset; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Argument implements Serializable { + + private static final long serialVersionUID = -8701225585091953864L; + + protected String value; + protected Boolean isDynamic; + + @Override + public Argument clone() { + Argument cloned = new Argument(); + cloned.setValue(value); + cloned.setIsDynamic(isDynamic); + return cloned; + } +} diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Arguments.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Arguments.java new file mode 100644 index 00000000000..e3dc353f19c --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Arguments.java @@ -0,0 +1,30 @@ +package com.netgrif.application.engine.petrinet.domain.dataset; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Arguments implements Serializable { + + private static final long serialVersionUID = -2385696520525471923L; + + protected List argument; + + @Override + public Arguments clone() { + Arguments cloned = new Arguments(); + if (argument != null) { + List clonedArgument = new ArrayList<>(); + argument.forEach(a -> clonedArgument.add(a.clone())); + cloned.setArgument(clonedArgument); + } + return cloned; + } +} diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Validation.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Validation.java index 4b672333e0e..611af521a31 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Validation.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/dataset/Validation.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; @Data @NoArgsConstructor @@ -14,13 +16,21 @@ public class Validation implements Serializable { private static final long serialVersionUID = 3287600522204188694L; - protected String rule; + protected String name; + private Arguments clientArguments; + private Arguments serverArguments; private I18nString message; @Override public Validation clone() { Validation cloned = new Validation(); - cloned.setRule(rule); + cloned.setName(name); + if (clientArguments != null) { + cloned.setClientArguments(clientArguments.clone()); + } + if (serverArguments != null) { + cloned.setServerArguments(serverArguments.clone()); + } if (this.message != null) { cloned.setMessage(this.message.clone()); } diff --git a/src/main/java/com/netgrif/application/engine/validations/ValidationRegistry.java b/src/main/java/com/netgrif/application/engine/validations/ValidationRegistry.java new file mode 100644 index 00000000000..e4a9c1457c4 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/validations/ValidationRegistry.java @@ -0,0 +1,32 @@ +package com.netgrif.application.engine.validations; + +import groovy.lang.Closure; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public final class ValidationRegistry { + + private final Map> validationsMap = new ConcurrentHashMap<>(); + + public Closure addValidation(String name, Closure closure) { + if (validationsMap.containsKey(name)) { + throw new IllegalArgumentException("Validation with name " + name + " already exists."); + } + return validationsMap.put(name, closure); + } + + public Closure getValidation(String name) { + return validationsMap.get(name); + } + + public Closure removeValidation(String name) { + return validationsMap.remove(name); + } + + public void removeAllValidations() { validationsMap.clear(); } +} diff --git a/src/main/java/com/netgrif/application/engine/validations/ValidationService.java b/src/main/java/com/netgrif/application/engine/validations/ValidationService.java new file mode 100644 index 00000000000..d3a8bb57519 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/validations/ValidationService.java @@ -0,0 +1,69 @@ +package com.netgrif.application.engine.validations; + +import com.netgrif.application.engine.event.IGroovyShellFactory; +import com.netgrif.application.engine.petrinet.domain.Transition; +import com.netgrif.application.engine.petrinet.domain.dataset.Field; +import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ValidationExecutioner; +import com.netgrif.application.engine.validations.interfaces.IValidationService; +import com.netgrif.application.engine.workflow.domain.Case; +import groovy.lang.Closure; +import lombok.extern.slf4j.Slf4j; +import org.codehaus.groovy.control.CompilationFailedException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class ValidationService implements IValidationService { + + private final ValidationRegistry validationRegistry; + + private final ValidationExecutioner validationExecutioner; + + private final IGroovyShellFactory shellFactory; + + @Autowired + public ValidationService(ValidationRegistry validationRegistry, ValidationExecutioner validationExecutioner, IGroovyShellFactory shellFactory) { + this.validationRegistry = validationRegistry; + this.validationExecutioner = validationExecutioner; + this.shellFactory = shellFactory; + } + + @Override + public void validateTransition(Case useCase, Transition transition) { + transition.getDataSet().keySet().forEach(fieldId -> { + if (useCase.getDataSet().get(fieldId) != null) { + validationExecutioner.execute(useCase, useCase.getDataSet().get(fieldId), useCase.getDataSet().get(fieldId).getValidations()); + } + }); + } + + @Override + public void validateField(Case useCase, Field field) { + validationExecutioner.execute(useCase, field, field.getValidations()); + } + + @Override + public void registerValidation(String name, String definition) throws ClassCastException, CompilationFailedException { + if (definition == null) { + throw new IllegalArgumentException("Definition cannot be empty."); + } + Closure code = (Closure) this.shellFactory.getGroovyShell().evaluate("{" + definition + "}"); + validationRegistry.addValidation(name, code); + } + + @Override + public Closure getValidation(String name) { + return validationRegistry.getValidation(name); + } + + @Override + public void unregisterValidation(String name) { + validationRegistry.removeValidation(name); + } + + @Override + public void clearValidations() { + validationRegistry.removeAllValidations(); + } +} diff --git a/src/main/java/com/netgrif/application/engine/validations/interfaces/IValidationService.java b/src/main/java/com/netgrif/application/engine/validations/interfaces/IValidationService.java new file mode 100644 index 00000000000..8ca9f08d7e6 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/validations/interfaces/IValidationService.java @@ -0,0 +1,22 @@ +package com.netgrif.application.engine.validations.interfaces; + +import com.netgrif.application.engine.petrinet.domain.Transition; +import com.netgrif.application.engine.petrinet.domain.dataset.Field; +import com.netgrif.application.engine.workflow.domain.Case; +import groovy.lang.Closure; +import org.codehaus.groovy.control.CompilationFailedException; + +public interface IValidationService { + + void validateTransition(Case useCase, Transition transition); + + void validateField(Case useCase, Field field); + + void registerValidation(String name, String definition) throws ClassCastException, CompilationFailedException; + + Closure getValidation(String name); + + void unregisterValidation(String name); + + void clearValidations(); +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/Task.java b/src/main/java/com/netgrif/application/engine/workflow/domain/Task.java index e63f53e91b8..a408cd5e03a 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/Task.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/Task.java @@ -111,12 +111,6 @@ public class Task implements Serializable { private String transactionId; - // TODO: release/8.0.0 remove, dynamically load from dataSet - @Getter - @Setter - @JsonIgnore - @Builder.Default - private LinkedHashSet immediateDataFields = new LinkedHashSet<>(); @Getter @Setter @Transient diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java b/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java index fe5e93bf263..6585fe3bf91 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java @@ -18,11 +18,8 @@ import com.netgrif.application.engine.petrinet.domain.events.DataEvent; import com.netgrif.application.engine.petrinet.domain.events.EventPhase; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.validation.service.interfaces.IValidationService; -import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.DataFieldBehavior; -import com.netgrif.application.engine.workflow.domain.EventNotExecutableException; -import com.netgrif.application.engine.workflow.domain.Task; +import com.netgrif.application.engine.validations.interfaces.IValidationService; +import com.netgrif.application.engine.workflow.domain.*; import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataEventOutcome; import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; @@ -87,7 +84,7 @@ public class DataService implements IDataService { protected IPetriNetService petriNetService; @Autowired - protected IValidationService validation; + protected IValidationService validationService; @Value("${nae.image.preview.scaling.px:400}") protected int imageScale; @@ -227,9 +224,8 @@ public SetDataEventOutcome setDataField(Task task, String fieldId, Field newD setOutcomeMessage(task, useCase, outcome, fieldId, field, DataEventType.SET); } useCase.getDataSet().get(fieldId).applyChanges(newDataField); - if (validationEnable) { - validation.valid(useCase.getDataSet().get(fieldId)); - } + validationService.validateField(useCase, useCase.getDataSet().get(fieldId)); + useCase = workflowService.save(useCase); outcome.addChangedField(fieldId, newDataField); historyService.save(new SetDataEventLog(task, useCase, EventPhase.EXECUTION, DataSet.of(fieldId, newDataField), user)); @@ -745,7 +741,8 @@ public Page setImmediateFields(Page tasks) { @Override public List> getImmediateFields(Task task) { Case useCase = workflowService.findOne(task.getCaseId()); - List> fields = task.getImmediateDataFields().stream().map(f -> useCase.getDataSet().get(f)).collect(Collectors.toList()); + Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); + List> fields = transition.getDataSet().keySet().stream().map(f -> useCase.getDataSet().get(f)).filter(field -> field.getBehaviors().get(task.getTransitionId()).isImmediate()).collect(Collectors.toList()); // TODO: release/8.0.0 order? // LongStream.range(0L, fields.size()).forEach(index -> fields.get((int) index).setOrder(index)); return fields; diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java b/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java index 363dc7e2a74..05b6ff03eda 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java @@ -7,6 +7,7 @@ import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.workflow.domain.QTask; import com.netgrif.application.engine.workflow.domain.Task; +import com.netgrif.application.engine.workflow.domain.State; import com.netgrif.application.engine.workflow.web.requestbodies.TaskSearchRequest; import com.netgrif.application.engine.workflow.web.requestbodies.taskSearch.TaskSearchCaseRequest; import com.querydsl.core.BooleanBuilder; @@ -112,6 +113,7 @@ private Predicate buildSingleQuery(TaskSearchRequest request, LoggedUser user, L buildFullTextQuery(request, builder); buildTransitionQuery(request, builder); buildTagsQuery(request, builder); + buildStateQuery(request, builder); boolean resultAlwaysEmpty = buildGroupQuery(request, user, locale, builder); if (resultAlwaysEmpty) @@ -120,6 +122,15 @@ private Predicate buildSingleQuery(TaskSearchRequest request, LoggedUser user, L return builder; } + private void buildStateQuery(TaskSearchRequest request, BooleanBuilder query) { + if (request.state == null) { + return; + } + BooleanBuilder builder = new BooleanBuilder(); + builder.or(QTask.task.state.eq(request.state)); + query.and(builder); + } + private void buildStringIdQuery(TaskSearchRequest request, BooleanBuilder query) { if (request.stringId == null || request.stringId.isEmpty()) { return; diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index b8045e2533c..e459edbe1c0 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -31,7 +31,7 @@ import com.netgrif.application.engine.rules.service.interfaces.IRuleEngine; import com.netgrif.application.engine.utils.DateUtils; import com.netgrif.application.engine.utils.FullPageRequest; -import com.netgrif.application.engine.validation.service.interfaces.IValidationService; +import com.netgrif.application.engine.validations.interfaces.IValidationService; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.State; import com.netgrif.application.engine.workflow.domain.Task; @@ -113,7 +113,7 @@ public class TaskService implements ITaskService { protected IHistoryService historyService; @Autowired - protected IValidationService validation; + protected IValidationService validationService; @Autowired public void setElasticTaskService(IElasticTaskService elasticTaskService) { @@ -273,7 +273,7 @@ public FinishTaskEventOutcome finishTask(Task task, IUser user, Map outcomes = new ArrayList<>(eventService.runActions(transition.getPreFinishActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); useCase = workflowService.findOne(task.getCaseId()); task = findOne(task.getStringId()); @@ -551,30 +551,6 @@ protected List executeTransition(Task task, Case useCase) { return outcomes; } - void validateData(Transition transition, Case useCase) { -// TODO: release/8.0.0 fix validation -// for (Map.Entry entry : transition.getDataSet().entrySet()) { -// if (useCase.getPetriNet().getDataSet().get(entry.getKey()) != null -// && useCase.getPetriNet().getDataSet().get(entry.getKey()).getValidations() != null) { -// validation.valid(useCase.getPetriNet().getDataSet().get(entry.getKey()), useCase.getDataField(entry.getKey())); -// } -// if (!useCase.getDataField(entry.getKey()).isRequired(transition.getImportId())) -// continue; -// if (useCase.getDataField(entry.getKey()).isUndefined(transition.getImportId()) && !entry.getValue().isRequired()) -// continue; -// -// Object value = useCase.getDataSet().get(entry.getKey()).getValue(); -// if (value == null) { -// Field field = useCase.getField(entry.getKey()); -// throw new IllegalArgumentException("Field \"" + field.getName() + "\" has null value"); -// } -// if (value instanceof String && ((String) value).isEmpty()) { -// Field field = useCase.getField(entry.getKey()); -// throw new IllegalArgumentException("Field \"" + field.getName() + "\" has empty value"); -// } -// } - } - protected void scheduleTaskExecution(Task task, LocalDateTime time, Case useCase) { log.info("[{}]: Task {} scheduled to run at {}", useCase.getStringId(), task.getTitle(), time.toString()); scheduler.schedule(() -> { @@ -781,7 +757,6 @@ private Task createFromTransition(Transition transition, Case useCase) { .caseTitle(useCase.getTitle()) .priority(transition.getPriority()) .icon(transition.getIcon() == null ? useCase.getIcon() : transition.getIcon()) - .immediateDataFields(transition.getImmediateData()) .assignPolicy(transition.getAssignPolicy()) .dataFocusPolicy(transition.getDataFocusPolicy()) .finishPolicy(transition.getFinishPolicy()) diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/TaskSearchRequest.java b/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/TaskSearchRequest.java index b205d45681a..d701ffefdcd 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/TaskSearchRequest.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/TaskSearchRequest.java @@ -6,6 +6,7 @@ import com.netgrif.application.engine.workflow.web.requestbodies.taskSearch.TaskSearchCaseRequest; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import com.netgrif.application.engine.workflow.domain.State; import java.util.List; import java.util.Map; @@ -45,4 +46,6 @@ public class TaskSearchRequest { public List stringId; public Map tags; + + public State state; } \ No newline at end of file diff --git a/src/main/resources/petriNets/engine-processes/org_group.xml b/src/main/resources/petriNets/engine-processes/org_group.xml index 67a91e1a48d..ef669d7a13a 100644 --- a/src/main/resources/petriNets/engine-processes/org_group.xml +++ b/src/main/resources/petriNets/engine-processes/org_group.xml @@ -103,7 +103,7 @@ Add e-meail address to send invitation - email + email diff --git a/src/main/resources/petriNets/engine-processes/validations/validation.xml b/src/main/resources/petriNets/engine-processes/validations/validation.xml new file mode 100644 index 00000000000..87d72bbe9a7 --- /dev/null +++ b/src/main/resources/petriNets/engine-processes/validations/validation.xml @@ -0,0 +1,610 @@ + + validation + 1.0.0 + VAL + Validation + home + true + false + false + + + system + + true + true + true + + + + admin + + false + false + true + + + + default + + false + false + true + + + + system + System + + + admin + Admin + + + + name + Name + + + validation_definition_groovy + Validation definition - Groovy + + textarea + + + + num_arguments_groovy + Number of arguments - Groovy + + + validation_definition_javascript + Validation definition - JavaScript + + textarea + + + + num_arguments_javascript + Number of arguments - JavaScript + + + version + Version + + + validation_type + Type + + + + + + validation_type_set + + + validation_type: f.validation_type, + validation_definition_groovy: f.validation_definition_groovy, + num_arguments_groovy: f.num_arguments_groovy, + validation_definition_javascript: f.validation_definition_javascript, + num_arguments_javascript: f.num_arguments_javascript, + init_trans: t.init, + detail_trans: t.detail; + + make [validation_definition_groovy, num_arguments_groovy], editable on init_trans when { validation_type.rawValue && validation_type.rawValue.contains("server") } + make [validation_definition_groovy, num_arguments_groovy], editable on detail_trans when { validation_type.rawValue && validation_type.rawValue.contains("server") } + make [validation_definition_groovy, num_arguments_groovy], hidden on transitions when { !validation_type.rawValue || !validation_type.rawValue.contains("server") } + make [validation_definition_javascript, num_arguments_javascript], editable on init_trans when { validation_type.rawValue && validation_type.rawValue.contains("client") } + make [validation_definition_javascript, num_arguments_javascript], editable on detail_trans when { validation_type.rawValue && validation_type.rawValue.contains("client") } + make [validation_definition_javascript, num_arguments_javascript], hidden on transitions when { !validation_type.rawValue || !validation_type.rawValue.contains("client") } + + + + + + + Meno + Typ + Definícia validácie - Groovy + Počet argumentov - Groovy + Definícia validácie - JavaScript + Počet argumentov - JavaScript + Verzia + Detail + Aktivovať + Deaktivovať + + + Name + Typ + Validierungsdefinition - Groovy + Anzahl der Argumente - Groovy + Validierungsdefinition - JavaScript + Anzahl der Argumente - JavaScript + Ausführung + Detail + Aktivieren + Deaktivieren + + + + init + 300 + 300 + + + init_0 + 4 + grid + + name + + editable + required + + + 0 + 0 + 1 + 2 + + outline + + + + validation_definition_groovy + + hidden + + + 0 + 2 + 2 + 4 + + outline + + + + validation_definition_javascript + + hidden + + + 0 + 5 + 2 + 4 + + outline + + + + version + + editable + + + 2 + 0 + 1 + 2 + + outline + + + + num_arguments_groovy + + hidden + + + 0 + 4 + 1 + 2 + + outline + + + + num_arguments_javascript + + hidden + + + 0 + 7 + 1 + 2 + + outline + + + + validation_type + + editable + required + + + 0 + 1 + 1 + 4 + + outline + + + + + init_assign + + + init_finish + + + init_cancel + + + init_delegate + + + + activate + 580 + 220 + + + admin + + true + true + true + true + true + + + + onFinish_activate + + + name: f.name, + validation_definition_groovy: f.validation_definition_groovy, + validation_type: f.validation_type; + + if (validation_type.rawValue && validation_type.rawValue.contains("server")) { + validationService.registerValidation(name.rawValue, validation_definition_groovy.rawValue) + } + + + + + validation_type: f.validation_type, + validation_definition_groovy: f.validation_definition_groovy, + num_arguments_groovy: f.num_arguments_groovy, + validation_definition_javascript: f.validation_definition_javascript, + num_arguments_javascript: f.num_arguments_javascript, + detail_trans: t.detail; + + make [validation_definition_groovy, num_arguments_groovy], visible on detail_trans when { validation_type.rawValue && validation_type.rawValue.contains("server") } + make [validation_definition_groovy, num_arguments_groovy], hidden on detail_trans when { !validation_type.rawValue || !validation_type.rawValue.contains("server") } + make [validation_definition_javascript, num_arguments_javascript], visible on detail_trans when { validation_type.rawValue && validation_type.rawValue.contains("client") } + make [validation_definition_javascript, num_arguments_javascript], hidden on detail_trans when { !validation_type.rawValue || !validation_type.rawValue.contains("client") } + + + + + + deactivate + 580 + 380 + + + admin + + true + true + true + true + + + + onFinish_deactivate + + + name: f.name, + validation_type: f.validation_type, + validation_definition_groovy: f.validation_definition_groovy, + num_arguments_groovy: f.num_arguments_groovy, + validation_definition_javascript: f.validation_definition_javascript, + num_arguments_javascript: f.num_arguments_javascript, + detail_trans: t.detail; + + make [validation_definition_groovy, num_arguments_groovy], editable on detail_trans when { validation_type.rawValue && validation_type.rawValue.contains("server") } + make [validation_definition_groovy, num_arguments_groovy], hidden on detail_trans when { !validation_type.rawValue || !validation_type.rawValue.contains("server") } + make [validation_definition_javascript, num_arguments_javascript], editable on detail_trans when { validation_type.rawValue && validation_type.rawValue.contains("client") } + make [validation_definition_javascript, num_arguments_javascript], hidden on detail_trans when { !validation_type.rawValue || !validation_type.rawValue.contains("client") } + + if (validation_type.rawValue && validation_type.rawValue.contains("server")) { + validationService.unregisterValidation(name.rawValue) + } + + + + + + detail + 300 + 60 + + + detail_0 + 4 + grid + + name + + visible + immediate + + + 0 + 0 + 1 + 2 + + outline + + + + version + + visible + + + 2 + 0 + 1 + 2 + + outline + + + + validation_definition_javascript + + hidden + immediate + + + 0 + 5 + 2 + 4 + + outline + + + + validation_definition_groovy + + hidden + + + 0 + 2 + 2 + 4 + + outline + + + + num_arguments_groovy + + hidden + + + 0 + 4 + 1 + 2 + + outline + + + + num_arguments_javascript + + hidden + + + 0 + 7 + 1 + 2 + + outline + + + + validation_type + + visible + immediate + + + 0 + 1 + 1 + 4 + + outline + + + + + detail_assign + + + detail_finish + + + detail_cancel + + + detail_delegate + + + + active_detail + 752 + 208 + + + detail_0 + 4 + grid + + name + + visible + immediate + + + 0 + 0 + 1 + 2 + + outline + + + + validation_definition_javascript + + hidden + immediate + + + 0 + 1 + 2 + 4 + + outline + + + + validation_type + + visible + immediate + + + 0 + 3 + 1 + 4 + + outline + + + + + + p1 + 180 + 300 + + + inactive + 420 + 300 + + 0 + false + + + active + 740 + 300 + + 0 + false + + + initialized + 300 + 180 + + 0 + false + + + a1 + regular + p1 + init + 1 + + + a2 + regular + init + initialized + 1 + + + a3 + read + initialized + detail + 1 + + + a5 + regular + init + inactive + 1 + + + a6 + regular + inactive + activate + 1 + + + a7 + regular + activate + active + 1 + + + a8 + regular + active + deactivate + 1 + + + a9 + regular + deactivate + inactive + 1 + + + a10 + read + active + active_detail + 1 + + \ No newline at end of file diff --git a/src/main/resources/petriNets/insurance_portal_demo.xml b/src/main/resources/petriNets/insurance_portal_demo.xml index 2887d9f33f1..65b639a4cbf 100644 --- a/src/main/resources/petriNets/insurance_portal_demo.xml +++ b/src/main/resources/petriNets/insurance_portal_demo.xml @@ -5508,7 +5508,7 @@ Telefónne číslo 109018 Poistník - telnumber + telNumber field: f.109020, @@ -6354,7 +6354,7 @@ Telefónne číslo 109032 Poistený - telnumber + telNumber Email diff --git a/src/main/resources/petriNets/insurance_role_test.xml b/src/main/resources/petriNets/insurance_role_test.xml index ef4cd543430..53594ba16c0 100644 --- a/src/main/resources/petriNets/insurance_role_test.xml +++ b/src/main/resources/petriNets/insurance_role_test.xml @@ -5512,7 +5512,7 @@ Telefónne číslo 109018 Poistník - telnumber + telNumber field: f.109020, @@ -6358,7 +6358,7 @@ Telefónne číslo 109032 Poistený - telnumber + telNumber Email diff --git a/src/main/resources/petriNets/petriflow_schema.xsd b/src/main/resources/petriNets/petriflow_schema.xsd index 28e88a26d6f..b98d13925e6 100644 --- a/src/main/resources/petriNets/petriflow_schema.xsd +++ b/src/main/resources/petriNets/petriflow_schema.xsd @@ -1,8 +1,801 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy b/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy index db7992527bc..f5430a8f312 100644 --- a/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy +++ b/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy @@ -52,6 +52,8 @@ class TestHelper { private UriRunner uriRunner @Autowired private IPetriNetService petriNetService + @Autowired + private ValidationRunner validationRunner void truncateDbs() { template.db.drop() @@ -74,6 +76,7 @@ class TestHelper { filterRunner.run() impersonationRunner.run() superCreator.run() + validationRunner.run() finisherRunner.run() } } \ No newline at end of file diff --git a/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy b/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy index b5296effb6b..0dca4593f27 100644 --- a/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy @@ -84,7 +84,7 @@ class GroovyShellFactoryTest { void roleActionsTest() { userService.metaClass.groovyShellTestMethod = { String string, I18nString i18nString -> println("groovyShellTestMethod") } - def user = userService.findByEmail(userService.getSystem().getEmail(), false) + def user = userService.findByEmail(userService.getSystem().getEmail()) def processRoleCount = user.processRoles.size() def roles = roleService.findAll(net.getStringId()) assert roles.size() == 1 @@ -93,7 +93,7 @@ class GroovyShellFactoryTest { new HashSet(roles.collect { it.stringId } + user.processRoles.collect { it.stringId }), new LoggedUser("", "a", "", []) ) - user = userService.findByEmail(userService.getSystem().getEmail(), false) + user = userService.findByEmail(userService.getSystem().getEmail()) assert user.processRoles.size() == processRoleCount + 1 } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy deleted file mode 100644 index a3992a8c08a..00000000000 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy +++ /dev/null @@ -1,100 +0,0 @@ -package com.netgrif.application.engine.petrinet.domain.dataset - -import com.netgrif.application.engine.TestHelper -import com.netgrif.application.engine.petrinet.domain.VersionType -import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.startup.ImportHelper -import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome -import com.netgrif.application.engine.workflow.service.interfaces.IDataService -import com.netgrif.application.engine.workflow.service.interfaces.ITaskService -import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService -import groovy.transform.CompileStatic -import groovy.util.logging.Slf4j -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.test.context.ActiveProfiles -import org.springframework.test.context.junit.jupiter.SpringExtension - -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import java.time.temporal.ChronoUnit - -@Slf4j -@SpringBootTest -@ActiveProfiles(["test"]) -@CompileStatic -@ExtendWith(SpringExtension.class) -class DynamicValidationPerformanceTest { - - @Autowired - private TestHelper testHelper - - @Autowired - private ImportHelper importHelper - - @Autowired - private IPetriNetService petriNetService - - @Autowired - private SuperCreator superCreator - - @Autowired - private IDataService dataService - - @Autowired - private ITaskService taskService - - @Autowired - private IWorkflowService workflowService - - @BeforeEach - void before() { - testHelper.truncateDbs() - } - - @Test - void testValidations() { - // TODO: release/8.0.0 Object f.text_valid_switch does not exists - ImportPetriNetEventOutcome optNet1 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) - ImportPetriNetEventOutcome optNet2 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) - - def aCase1 = importHelper.createCase("Case 1", optNet1.getNet()) - def aCase2 = importHelper.createCase("Case 2", optNet2.getNet()) - - run(aCase1, aCase2) - run(aCase1, aCase2) - run(aCase1, aCase2) - run(aCase1, aCase2) - run(aCase1, aCase2) - run(aCase1, aCase2) - } - - Map getData(Case useCase) { - Task task = task(useCase) - return dataService.getData(task, useCase, superCreator.getSuperUser()).getData().collectEntries { [(it.fieldId): (it)] } - } - - Task task(Case useCase) { - return taskService.findOne(useCase.getTaskStringId("transition")) - } - - void run(Case first, Case second) { - LocalDateTime pre1 = LocalDateTime.now() - getData(first) - LocalDateTime post1 = LocalDateTime.now() - - LocalDateTime pre2 = LocalDateTime.now() - getData(second) - LocalDateTime post2 = LocalDateTime.now() - - DateTimeFormatter format = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS") - log.info("With dynamic validations: ${pre1.format(format)} - ${post1.format(format)} = ${ChronoUnit.MILLIS.between(pre1, post1)}ms") - log.info("With static validations: ${pre2.format(format)} - ${post2.format(format)} = ${ChronoUnit.MILLIS.between(pre2, post2)}ms") - } -} diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy deleted file mode 100644 index 3f2a1f5479c..00000000000 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy +++ /dev/null @@ -1,121 +0,0 @@ -package com.netgrif.application.engine.petrinet.domain.dataset - -import com.netgrif.application.engine.TestHelper -import com.netgrif.application.engine.petrinet.domain.VersionType -import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.startup.ImportHelper -import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome -import com.netgrif.application.engine.workflow.service.interfaces.IDataService -import com.netgrif.application.engine.workflow.service.interfaces.ITaskService -import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.test.context.ActiveProfiles -import org.springframework.test.context.junit.jupiter.SpringExtension - -@SpringBootTest -@ActiveProfiles(["test"]) -@ExtendWith(SpringExtension.class) -class DynamicValidationTest { - - @Autowired - private TestHelper testHelper - - @Autowired - private ImportHelper importHelper - - @Autowired - private IPetriNetService petriNetService - - @Autowired - private SuperCreator superCreator - - @Autowired - private IDataService dataService - - @Autowired - private ITaskService taskService - - @Autowired - private IWorkflowService workflowService - - @BeforeEach - void before() { - testHelper.truncateDbs(); - } - -// @Test -// @Disabled -// void testValidations() { -// ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) -// Case useCase = importHelper.createCase("test", optNet.getNet()) -// Map data = getData(useCase) -// assert (data["number"]).validations[0] instanceof DynamicValidation -// assert (data["number"]).validations[0].compiledRule == ("inrange ${useCase.dataSet["min"].value as Integer},${useCase.dataSet["max"].value as Integer}" as String) -// assert (data["number"]).validations[0].validationMessage.defaultValue == "Number field validation message" -// -// assert (data["text"]).validations[0] instanceof DynamicValidation -// assert (data["text"]).validations[0].compiledRule == ("maxLength ${useCase.dataSet["max"].value as Integer}" as String) -// -// assert (data["date"]).validations[0] instanceof DynamicValidation -// assert (data["date"]).validations[0].compiledRule == ("between past,today-P${useCase.dataSet["max"].value as Integer}D" as String) -// -// SetDataEventOutcome changes = setData(useCase, ["number_valid_switch": ["type": "boolean", "value": true], -// "text_valid_switch" : ["type": "boolean", "value": true]]) -// assert (changes.changedFields["number"].attributes["validations"] as List)[0]["validationRule"] == "odd" -// assert (changes.changedFields["text"].attributes["validations"] as List)[0]["validationRule"] == "email" -// -// useCase = workflowService.findOne(useCase.stringId) -// assert useCase.dataSet["number"].validations[0].validationRule == "odd" -// assert useCase.dataSet["text"].validations[0].validationRule == "email" -// -// data = getData(useCase) -// assert !((data["number"]).validations[0] instanceof DynamicValidation) -// assert (data["number"]).validations[0].validationRule == "odd" -// -// assert !((data["text"]).validations[0] instanceof DynamicValidation) -// assert (data["text"]).validations[0].validationRule == "email" -// -// changes = setData(useCase, ["number_valid_switch": ["type": "boolean", "value": false], -// "text_valid_switch" : ["type": "boolean", "value": false]]) -// assert (changes.changedFields["number"].attributes["validations"] as List)[0]["validationRule"] == ("inrange ${useCase.dataSet["min"].value as Integer},${useCase.dataSet["max"].value as Integer}" as String) -// assert (changes.changedFields["text"].attributes["validations"] as List)[0]["validationRule"] == ("maxLength ${useCase.dataSet["max"].value as Integer}" as String) -// -// setData(useCase, ["min": ["type": "number", "value": "10"], -// "max": ["type": "number", "value": "20"]]) -// -// useCase = workflowService.findOne(useCase.stringId) -// data = getData(useCase) -// assert data["number"].validations[0].compiledRule == ("inrange 10,20" as String) -// assert data["text"].validations[0].compiledRule == ("maxLength 20" as String) -// -// assert useCase.dataSet["number"].validations[0].validationRule == '''inrange ${min.value as Integer},${max.value as Integer}''' -// assert useCase.dataSet["text"].validations[0].validationRule == '''maxLength ${max.value as Integer}''' -// -// assert (useCase.dataSet["number"].validations[0] as DynamicValidation).expression.definition == '''"inrange ${min.value as Integer},${max.value as Integer}"''' -// assert (useCase.dataSet["text"].validations[0] as DynamicValidation).expression.definition == '''"maxLength ${max.value as Integer}"''' -// -// } -// -// Map getData(Case useCase) { -// Task task = task(useCase) -// return dataService.getData(task, useCase).getData().collectEntries { [(it.importId): (it)] } -// } -// -// SetDataEventOutcome setData(Case useCase, Map> values) { -// Task task = task(useCase) -// return dataService.setData(task, ImportHelper.populateDataset(values)) -// } -// -// Task task(Case useCase) { -// return taskService.findOne(useCase.tasks.find { it.transitionId == "transition" }.taskId) -// } -} diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy index a0d1c0f70da..0596b2cef7c 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy @@ -94,9 +94,10 @@ class FieldTest { assert field.placeholder.defaultValue == "Number field placeholder" //TODO: release/8.0.0 validations are ignored // java.lang.NullPointerException: Cannot invoke method get() on null object - assert field.validations.get(0).rule == "inrange 0,inf" - assert field.validations.get(1).rule == "inrange 0,inf" - assert field.validations.get(1).message.defaultValue == "Number field validation message" + assert field.validations.get(0).name == "inrange" + assert field.validations.get(0).serverArguments.argument.get(0).value == "0" + assert field.validations.get(0).serverArguments.argument.get(1).value == "inf" + assert field.validations.get(0).message.defaultValue == "Number field validation message" } private void assertTextField() { @@ -105,9 +106,8 @@ class FieldTest { assert field.description.defaultValue == "Text field description" assert field.name.defaultValue == "Text" assert field.placeholder.defaultValue == "Text field placeholder" - assert field.validations.get(0).rule == "email" - assert field.validations.get(1).rule == "email" - assert field.validations.get(1).message.defaultValue == "Mail validation message" + assert field.validations.get(0).name == "email" + assert field.validations.get(0).message.defaultValue == "Mail validation message" } private void assertEnumerationField() { @@ -153,11 +153,14 @@ class FieldTest { assert field.description.defaultValue == "Date field description" assert field.name.defaultValue == "Date" assert field.placeholder.defaultValue == "Date field placeholder" - assert field.validations.get(0).rule == "between today,future" - assert field.validations.get(1).message.defaultValue == "Date field validation message" - assert field.validations.get(1).rule == "between today,future" - assert field.validations.get(2).message.defaultValue == "Date field validation message 2" - assert field.validations.get(2).rule == "between today,tommorow" + assert field.validations.get(0).message.defaultValue == "Date field validation message" + assert field.validations.get(0).name == "between" + assert field.validations.get(0).serverArguments.argument.get(0).value == "today" + assert field.validations.get(0).serverArguments.argument.get(1).value == "future" + assert field.validations.get(1).message.defaultValue == "Date field validation message 2" + assert field.validations.get(1).name == "between" + assert field.validations.get(1).serverArguments.argument.get(0).value == "today" + assert field.validations.get(1).serverArguments.argument.get(1).value == "tommorow" } private void assertFileField() { @@ -217,9 +220,15 @@ class FieldTest { assert field.description.defaultValue == "This is I18n text field" assert field.placeholder.defaultValue == "Text I18n field" assert field.defaultValue.defaultValue == "Default i18n text value" - assert field.validations.get(0).rule == "translationRequired sk,en" + assert field.validations.get(0).name == "translationRequired" + assert field.validations.get(0).serverArguments.argument.get(0).value == "sk" + assert field.validations.get(0).serverArguments.argument.get(1).value == "en" assert field.validations.get(0).message.defaultValue == "Slovak and English language required" - assert field.validations.get(1).rule == "translationOnly sk,en,cz,de" + assert field.validations.get(1).name == "translationOnly" + assert field.validations.get(1).serverArguments.argument.get(0).value == "sk" + assert field.validations.get(1).serverArguments.argument.get(1).value == "en" + assert field.validations.get(1).serverArguments.argument.get(2).value == "cz" + assert field.validations.get(1).serverArguments.argument.get(3).value == "de" assert field.validations.get(1).message.defaultValue == "Only Slovak, English, Czech and German languages allowed" } } \ No newline at end of file diff --git a/src/test/groovy/com/netgrif/application/engine/validation/BooleanFieldValidationTest.groovy b/src/test/groovy/com/netgrif/application/engine/validation/BooleanFieldValidationTest.groovy index c6d8dc4bbda..37991006e3a 100644 --- a/src/test/groovy/com/netgrif/application/engine/validation/BooleanFieldValidationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/validation/BooleanFieldValidationTest.groovy @@ -1,31 +1,29 @@ package com.netgrif.application.engine.validation import com.netgrif.application.engine.TestHelper -import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.dataset.BooleanField -import com.netgrif.application.engine.validation.domain.ValidationDataInput -import com.netgrif.application.engine.validation.models.BooleanFieldValidation -import org.junit.jupiter.api.Assertions +import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ValidationDelegate import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest -import org.springframework.context.i18n.LocaleContextHolder import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension -import java.util.stream.Collectors @SpringBootTest @ActiveProfiles(["test"]) @ExtendWith(SpringExtension.class) class BooleanFieldValidationTest { - public static final String ErrorMessage = "Invalid Field value" @Autowired private TestHelper testHelper + private static ValidationDelegate getValidationDelegate() { + return new ValidationDelegate() + } + @BeforeEach void setup() { testHelper.truncateDbs() @@ -33,54 +31,32 @@ class BooleanFieldValidationTest { @Test void requiredTrue() { - BooleanFieldValidation booleanFieldValidation = new BooleanFieldValidation() - BooleanField dataField = new BooleanField(rawValue: true) - I18nString validMessage = new I18nString(ErrorMessage) - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new BooleanField(rawValue: true) - booleanFieldValidation.requiredtrue(input) + assert delegate.requiredTrue() } - @Test - void notempty() { - BooleanFieldValidation booleanFieldValidation = new BooleanFieldValidation() - BooleanField dataField = new BooleanField(rawValue: true) - I18nString validMessage = new I18nString(ErrorMessage) - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + void requiredTrue_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new BooleanField(rawValue: false) - booleanFieldValidation.notempty(input) + assert !delegate.requiredTrue() } - @Test - void notempty_Exception() { - BooleanFieldValidation booleanFieldValidation = new BooleanFieldValidation() - BooleanField dataField = new BooleanField() - dataField.value = null - I18nString validMessage = new I18nString(ErrorMessage) - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + void notempty() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new BooleanField(rawValue: true) - IllegalArgumentException thrown = Assertions.assertThrows(IllegalArgumentException.class, () -> { - booleanFieldValidation.notempty(input) - }) - Assertions.assertEquals(ErrorMessage, thrown.getMessage()); + assert delegate.notEmpty() } @Test - void notempty_Exception2() { - BooleanFieldValidation booleanFieldValidation = new BooleanFieldValidation() - BooleanField dataField = new BooleanField() - dataField.value = null - I18nString validMessage = new I18nString(ErrorMessage) - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + void notempty_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new BooleanField(rawValue: null) - IllegalArgumentException thrown = Assertions.assertThrows(IllegalArgumentException.class, () -> { - booleanFieldValidation.notempty(input) - }) - Assertions.assertEquals(ErrorMessage, thrown.getMessage()); + assert !delegate.notEmpty() } } diff --git a/src/test/groovy/com/netgrif/application/engine/validation/NumberFieldValidationTest.groovy b/src/test/groovy/com/netgrif/application/engine/validation/NumberFieldValidationTest.groovy index a4aa85ed99e..6a5ab81c9f2 100644 --- a/src/test/groovy/com/netgrif/application/engine/validation/NumberFieldValidationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/validation/NumberFieldValidationTest.groovy @@ -1,100 +1,138 @@ package com.netgrif.application.engine.validation import com.netgrif.application.engine.TestHelper -import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.dataset.NumberField -import com.netgrif.application.engine.validation.domain.ValidationDataInput -import com.netgrif.application.engine.validation.models.NumberFieldValidation +import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ValidationDelegate import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest -import org.springframework.context.i18n.LocaleContextHolder import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension -import java.util.stream.Collectors +import static org.junit.jupiter.api.Assertions.assertThrows @SpringBootTest @ActiveProfiles(["test"]) @ExtendWith(SpringExtension.class) class NumberFieldValidationTest { + private static final INF = 'inf' @Autowired private TestHelper testHelper + private static ValidationDelegate getValidationDelegate() { + return new ValidationDelegate() + } + @BeforeEach void setup() { testHelper.truncateDbs() } - @Test void odd() { - NumberFieldValidation numberFieldValidation = new NumberFieldValidation() - NumberField dataField = new NumberField(rawValue: 5) - I18nString validMessage = new I18nString("Invalid Field value") - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 5) - numberFieldValidation.odd(input) + assert delegate.odd() } + @Test + void odd_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 4) + + assert !delegate.odd() + } @Test void even() { - NumberFieldValidation numberFieldValidation = new NumberFieldValidation() - NumberField dataField = new NumberField(rawValue: 4) - I18nString validMessage = new I18nString("Invalid Field value") - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 4) + + assert delegate.even() + } - numberFieldValidation.even(input) + @Test + void even_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 5) + + assert !delegate.even() } @Test void positive() { - NumberFieldValidation numberFieldValidation = new NumberFieldValidation() - NumberField dataField = new NumberField(rawValue: 4) - I18nString validMessage = new I18nString("Invalid Field value") - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 4) + + assert delegate.positive() + } - numberFieldValidation.positive(input) + @Test + void positive_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: -4) + + assert !delegate.positive() } @Test - void positivenegative() { - NumberFieldValidation numberFieldValidation = new NumberFieldValidation() - NumberField dataField = new NumberField(rawValue: -4) - I18nString validMessage = new I18nString("Invalid Field value") - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) - - numberFieldValidation.negative(input) + void negative() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: -4) + + assert delegate.negative() + } + + @Test + void negative_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 4) + + assert !delegate.negative() } @Test void decimal() { - NumberFieldValidation numberFieldValidation = new NumberFieldValidation() - NumberField dataField = new NumberField(rawValue: 4) - I18nString validMessage = new I18nString("Invalid Field value") - List rules = [] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 4) + + assert delegate.decimal() + } + + @Test + void decimal_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 4.1) - numberFieldValidation.decimal(input) + assert !delegate.decimal() } @Test void inrange() { - NumberFieldValidation numberFieldValidation = new NumberFieldValidation() - NumberField dataField = new NumberField(rawValue: 7) - I18nString validMessage = new I18nString("Invalid Field value") - List rules = ["5,10"] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 7) + + assert delegate.inrange(5, 10) + + assert delegate.inrange(INF, 10) + + assert delegate.inrange(5, INF) + + assert delegate.inrange(INF, INF) + + assert delegate.inrange("5", "10") + } + + @Test + void inrange_fail() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new NumberField(rawValue: 7) - numberFieldValidation.inrange(input) + assertThrows(NumberFormatException.class, { !delegate.inrange('totok', INF) }) } } diff --git a/src/test/groovy/com/netgrif/application/engine/validation/TextFieldValidationTest.groovy b/src/test/groovy/com/netgrif/application/engine/validation/TextFieldValidationTest.groovy index e806d4b9a96..1754bbbd9e2 100644 --- a/src/test/groovy/com/netgrif/application/engine/validation/TextFieldValidationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/validation/TextFieldValidationTest.groovy @@ -3,8 +3,10 @@ package com.netgrif.application.engine.validation import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.dataset.TextField -import com.netgrif.application.engine.validation.domain.ValidationDataInput -import com.netgrif.application.engine.validation.models.TextFieldValidation +import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ValidationDelegate + +//import com.netgrif.application.engine.validation.domain.ValidationDataInput +//import com.netgrif.application.engine.validation.models.TextFieldValidation import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -22,40 +24,39 @@ import java.util.stream.Collectors @ExtendWith(SpringExtension.class) class TextFieldValidationTest { - public static final String ErrorMessage = "Invalid Field value" @Autowired private TestHelper testHelper + private static ValidationDelegate getValidationDelegate() { + return new ValidationDelegate() + } + @BeforeEach void setup() { testHelper.truncateDbs() } @Test - void minlength_Exception() { - TextFieldValidation textFieldValidation = new TextFieldValidation() - TextField dataField = new TextField(rawValue: 'totok') - I18nString validMessage = new I18nString(ErrorMessage) - List rules = ["minlength","6"] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) - - IllegalArgumentException thrown = Assertions.assertThrows(IllegalArgumentException.class, () -> { - textFieldValidation.minlength(input) - }) - Assertions.assertEquals(ErrorMessage, thrown.getMessage()); + void minLength() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new TextField(rawValue: 'totok') + + assert !delegate.minLength(6) + + assert delegate.minLength(5) + + assert delegate.minLength(4) } @Test - void maxlength_Exception() { - TextFieldValidation textFieldValidation = new TextFieldValidation() - TextField dataField = new TextField(rawValue: 'totok') - I18nString validMessage = new I18nString(ErrorMessage) - List rules = ["maxlength","4"] - ValidationDataInput input = new ValidationDataInput(dataField, validMessage, LocaleContextHolder.getLocale(), rules.stream().skip(1).collect(Collectors.joining(" "))) - - IllegalArgumentException thrown = Assertions.assertThrows(IllegalArgumentException.class, () -> { - textFieldValidation.maxlength(input) - }) - Assertions.assertEquals(ErrorMessage, thrown.getMessage()); + void maxLength() { + ValidationDelegate delegate = getValidationDelegate() + delegate.thisField = new TextField(rawValue: 'totok') + + assert !delegate.maxLength(4) + + assert delegate.maxLength(5) + + assert delegate.maxLength(6) } } diff --git a/src/test/groovy/com/netgrif/application/engine/validation/ValidationTest.groovy b/src/test/groovy/com/netgrif/application/engine/validation/ValidationTest.groovy index 4e640f09792..7b9d3a060ad 100644 --- a/src/test/groovy/com/netgrif/application/engine/validation/ValidationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/validation/ValidationTest.groovy @@ -14,9 +14,9 @@ import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.web.responsebodies.DataSet -import org.junit.Ignore import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired @@ -25,7 +25,6 @@ import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension import java.time.LocalDate -import java.time.format.DateTimeFormatter @SpringBootTest @ActiveProfiles(["test"]) diff --git a/src/test/groovy/com/netgrif/application/engine/validation/ValidationTestDynamic.groovy b/src/test/groovy/com/netgrif/application/engine/validation/ValidationTestDynamic.groovy new file mode 100644 index 00000000000..5bad5dee602 --- /dev/null +++ b/src/test/groovy/com/netgrif/application/engine/validation/ValidationTestDynamic.groovy @@ -0,0 +1,312 @@ +package com.netgrif.application.engine.validation + +import com.netgrif.application.engine.TestHelper +import com.netgrif.application.engine.petrinet.domain.PetriNet +import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.dataset.Field +import com.netgrif.application.engine.petrinet.domain.dataset.MultichoiceMapField +import com.netgrif.application.engine.petrinet.domain.dataset.TextField +import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService +import com.netgrif.application.engine.startup.ImportHelper +import com.netgrif.application.engine.startup.ValidationRunner +import com.netgrif.application.engine.validations.interfaces.IValidationService +import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService +import com.netgrif.application.engine.workflow.web.responsebodies.DataSet +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.junit.jupiter.SpringExtension + +@SpringBootTest +@ActiveProfiles(["test"]) +@ExtendWith(SpringExtension.class) +class ValidationTestDynamic { + + public static final String VALIDATION_PETRI_NET_IDENTIFIER = "validation" + public static final String VALIDATION_NAME_FIELD_ID = "name" + public static final String VALIDATION_VALIDATION_TYPE_FIELD_ID = "validation_type" + public static final String VALIDATION_DEFINITION_GROOVY_FIELD_ID = "validation_definition_groovy" + public static final String VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID = "num_arguments_groovy" + public static final String VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID = "validation_definition_javascript" + public static final String VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID = "num_arguments_javascript" + public static final String VALIDATION_INIT_TRANS_ID = "init" + public static final String VALIDATION_DETAIL_TRANS_ID = "detail" + + @Autowired + private ImportHelper importHelper + + @Autowired + private TestHelper testHelper + + @Autowired + private IPetriNetService petriNetService + + @Autowired + private IWorkflowService workflowService + + @Autowired + private IValidationService validationService + + @Autowired + protected ValidationRunner validationRunner + + @BeforeEach + void setup() { + testHelper.truncateDbs() + validationService.clearValidations() + } + + private PetriNet importTextNet() { + PetriNet testNet = importHelper.createNet("validation/valid_text.xml", VersionType.MAJOR).get() + assert testNet != null + return testNet + } + + private Case createValidation(String name, String validationDefinitionGroovy, Boolean active = true) { + PetriNet net = petriNetService.getNewestVersionByIdentifier(VALIDATION_PETRI_NET_IDENTIFIER) + + Case validationCase = importHelper.createCase("Validation ${name}", net) + assert validationCase != null + + Task validationTask = importHelper.assignTaskToSuper("Init", validationCase.stringId).getTask() + assert validationTask != null + + SetDataEventOutcome outcome = importHelper.setTaskData("Init", validationCase.stringId, new DataSet([ + (VALIDATION_NAME_FIELD_ID): new TextField(rawValue: name), + (VALIDATION_VALIDATION_TYPE_FIELD_ID): new MultichoiceMapField(rawValue: ["server"]), + (VALIDATION_DEFINITION_GROOVY_FIELD_ID): new TextField(rawValue: validationDefinitionGroovy) + ] as Map>)) + assert outcome != null + + validationTask = importHelper.finishTaskAsSuper("Init", validationCase.stringId).getTask() + assert validationTask != null + + if (active) { + validationTask = importHelper.assignTaskToSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + + validationTask = importHelper.finishTaskAsSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + } + + validationCase = workflowService.findOne(validationCase.stringId) + assert validationCase.tasks.get("deactivate") != null + + return validationCase + } + + @Test + void textDynamic_validation() { + + createValidation("aaaa", "a -> thisField.rawValue.size() == a as Integer", true) + + PetriNet testNet = importTextNet() + Case aCase = importHelper.createCase("TestCase", testNet) + assert aCase != null + Task task = importHelper.assignTaskToSuper("Test", aCase.stringId).getTask() + assert task != null + importHelper.setTaskData(task.getStringId(), new DataSet(["text06": new TextField(rawValue: "12345")])) + Task taskFinish = importHelper.finishTaskAsSuper("Test", aCase.stringId).getTask() + assert taskFinish != null + } + + @Test + void textDynamic_validation_fail() { + + createValidation("aaaa", "a -> thisField.rawValue.size() == a as Integer", true) + + PetriNet testNet = importTextNet() + Case aCase = importHelper.createCase("TestCase", testNet) + assert aCase != null + Task task = importHelper.assignTaskToSuper("Test", aCase.stringId).getTask() + assert task != null + + IllegalArgumentException thrown = Assertions.assertThrows(IllegalArgumentException.class, () -> { + importHelper.setTaskData(task.getStringId(), new DataSet(["text06": new TextField(rawValue: "1234567")])) + Task taskFinish = importHelper.finishTaskAsSuper("Test", aCase.stringId).getTask() + assert taskFinish != null + }) + + assert "error-text06" == thrown.getMessage() + } + + @Test + void textDynamic_validation_conflictWithFieldName() { + + createValidation("number01", "a -> thisField.rawValue.size() == a as Integer", true) + + PetriNet testNet = importTextNet() + Case aCase = importHelper.createCase("TestCase", testNet) + assert aCase != null + Task task = importHelper.assignTaskToSuper("Test", aCase.stringId).getTask() + assert task != null + + Assertions.assertThrows(MissingMethodException.class, () -> { + importHelper.setTaskData(task.getStringId(), new DataSet(["text07": new TextField(rawValue: "1234567")])) + Task taskFinish = importHelper.finishTaskAsSuper("Test", aCase.stringId).getTask() + assert taskFinish != null + }) + } + + @Test + void dynamicValidation_process_importActive() { + createValidation("test1", "-> thisField.rawValue = 1", true) + createValidation("test2", "-> thisField.rawValue = 2", true) + createValidation("test3", "-> thisField.rawValue = 3", false) + + assert validationService.getValidation("test1") instanceof Closure && validationService.getValidation("test1") != null + assert validationService.getValidation("test2") instanceof Closure && validationService.getValidation("test2") != null + assert validationService.getValidation("test3") == null + + validationService.clearValidations() + + assert validationService.getValidation("test1") == null + assert validationService.getValidation("test2") == null + assert validationService.getValidation("test3") == null + + validationRunner.run() + + assert validationService.getValidation("test1") instanceof Closure && validationService.getValidation("test1") != null + assert validationService.getValidation("test2") instanceof Closure && validationService.getValidation("test2") != null + assert validationService.getValidation("test3") == null + } + + @Test + void dynamicValidation_process_behaviors() { + PetriNet net = petriNetService.getNewestVersionByIdentifier(VALIDATION_PETRI_NET_IDENTIFIER) + + Case validationCase = importHelper.createCase("Validation test", net) + assert validationCase != null + + Task validationTask = importHelper.assignTaskToSuper("Init", validationCase.stringId).getTask() + assert validationTask != null + + assert validationCase.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + + SetDataEventOutcome outcome = importHelper.setTaskData("Init", validationCase.stringId, new DataSet([ + (VALIDATION_VALIDATION_TYPE_FIELD_ID): new MultichoiceMapField(rawValue: ["client"]), + ] as Map>)) + assert outcome != null + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + + outcome = importHelper.setTaskData("Init", validationCase.stringId, new DataSet([ + (VALIDATION_VALIDATION_TYPE_FIELD_ID): new MultichoiceMapField(rawValue: ["server"]), + ] as Map>)) + assert outcome != null + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + + outcome = importHelper.setTaskData("Init", validationCase.stringId, new DataSet([ + (VALIDATION_VALIDATION_TYPE_FIELD_ID): new MultichoiceMapField(rawValue: ["server", "client"]), + ] as Map>)) + assert outcome != null + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_INIT_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert outcome.case.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + + outcome = importHelper.setTaskData("Init", validationCase.stringId, new DataSet([ + (VALIDATION_NAME_FIELD_ID): new TextField(rawValue: "test"), + (VALIDATION_VALIDATION_TYPE_FIELD_ID): new MultichoiceMapField(rawValue: ["server"]), + (VALIDATION_DEFINITION_GROOVY_FIELD_ID): new TextField(rawValue: "-> thisField.rawValue == 1") + ] as Map>)) + assert outcome != null + + validationTask = importHelper.finishTaskAsSuper("Init", validationCase.stringId).getTask() + assert validationTask != null + + validationTask = importHelper.assignTaskToSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + + validationTask = importHelper.finishTaskAsSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + + validationCase = workflowService.findOne(validationCase.stringId) + + assert validationCase.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).visible + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).visible + assert validationCase.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + + validationTask = importHelper.assignTaskToSuper("Deactivate", validationCase.stringId).getTask() + assert validationTask != null + + validationTask = importHelper.finishTaskAsSuper("Deactivate", validationCase.stringId).getTask() + assert validationTask != null + + validationCase = workflowService.findOne(validationCase.stringId) + + assert validationCase.dataSet.get(VALIDATION_DEFINITION_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_GROOVY_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).editable + assert validationCase.dataSet.get(VALIDATION_DEFINITION_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + assert validationCase.dataSet.get(VALIDATION_NUM_ARGUMENTS_JAVASCRIPT_FIELD_ID).behaviors.get(VALIDATION_DETAIL_TRANS_ID).hidden + } + + @Test + void dynamicValidation_process_create() { + PetriNet net = petriNetService.getNewestVersionByIdentifier(VALIDATION_PETRI_NET_IDENTIFIER) + + Case validationCase = importHelper.createCase("Validation test", net) + assert validationCase != null + + Task validationTask = importHelper.assignTaskToSuper("Init", validationCase.stringId).getTask() + assert validationTask != null + + SetDataEventOutcome outcome = importHelper.setTaskData("Init", validationCase.stringId, new DataSet([ + (VALIDATION_NAME_FIELD_ID): new TextField(rawValue: "test"), + (VALIDATION_VALIDATION_TYPE_FIELD_ID): new MultichoiceMapField(rawValue: ["server"]), + (VALIDATION_DEFINITION_GROOVY_FIELD_ID): new TextField(rawValue: null) + ] as Map>)) + assert outcome != null + + validationTask = importHelper.finishTaskAsSuper("Init", validationCase.stringId).getTask() + assert validationTask != null + + validationTask = importHelper.assignTaskToSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + + Assertions.assertThrows(IllegalArgumentException.class, () -> { + validationTask = importHelper.finishTaskAsSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + }) + + outcome = importHelper.setTaskData("Detail", validationCase.stringId, new DataSet([ + (VALIDATION_DEFINITION_GROOVY_FIELD_ID): new TextField(rawValue: "-> thisField.rawValue == 1") + ] as Map>)) + assert outcome != null + + validationTask = importHelper.finishTaskAsSuper("Activate", validationCase.stringId).getTask() + assert validationTask != null + } +} diff --git a/src/test/resources/data_test.xml b/src/test/resources/data_test.xml index a9e4feb8786..4060c221c99 100644 --- a/src/test/resources/data_test.xml +++ b/src/test/resources/data_test.xml @@ -10,10 +10,13 @@ Number Number field placeholder Number field description - inrange 0,inf - inrange 0,inf + inrange + + 0 + inf + Number field validation message @@ -25,10 +28,9 @@ Text Text field placeholder Text field description - email - email + email Mail validation message @@ -67,10 +69,9 @@ Boolean Boolean field placeholder Boolean field description - requiredTrue - requiredTrue + requiredTrue Boolean field validation message @@ -82,14 +83,21 @@ Date Date field placeholder Date field description - between today,future - between today,future + between + + today + future + Date field validation message - between today,tommorow + between + + today + tommorow + Date field validation message 2 @@ -114,14 +122,21 @@ DateTime DateTime field placeholder DateTime field description - between today,future - between today,future + between + + today + future + Date field validation message - between today,future + between + + today + future + Date field validation message 2 @@ -162,11 +177,21 @@ Default i18n text value - translationRequired sk,en + translationRequired + + sk + en + Slovak and English language required - translationOnly sk,en,cz,de + translationOnly + + sk + en + cz + de + Only Slovak, English, Czech and German languages allowed diff --git a/src/test/resources/petriNets/dynamic_validations.xml b/src/test/resources/petriNets/dynamic_validations.xml deleted file mode 100644 index 892960bfa6c..00000000000 --- a/src/test/resources/petriNets/dynamic_validations.xml +++ /dev/null @@ -1,132 +0,0 @@ - - dynamic_validations - dynamic_validations - true - DVT - - - min - Min - - - max - Max - 5 - - - number - Number - - - inrange ${min.value as Integer},${max.value as Integer} - Number field validation message - - - - - text - Text - - - maxLength ${max.value as Integer} - Text field validation message - - - - - date - Date - - - between past,today-P${max.value as Integer}D - Date field validation message - - - - - - number_valid_switch - Switch - - - number_valid_switch: f.number_valid_switch, - number: f.number; - - if (number_valid_switch.value) { - change number validations { "odd" } - } else { - change number validations { dynamicValidation('''inrange ${min.value as Integer},${max.value as Integer}''', - null) } - } - - - - - text_valid_switch - Switch - - - text_valid_switch: f.text_valid_switch, - text: f.text; - - if (text_valid_switch.value) { - change text validations { "email" } - } else { - change text validations { dynamicValidation('''maxLength ${max.value as Integer}''', null) } - } - - - - - transition - 200 - 200 - - auto - - - min - - editable - - - - max - - editable - - - - number - - editable - - - - text - - editable - - - - date - - editable - - - - number_valid_switch - - editable - - - - text_valid_switch - - editable - - - - - \ No newline at end of file diff --git a/src/test/resources/petriNets/dynamic_validations_performance_test.xml b/src/test/resources/petriNets/dynamic_validations_performance_test.xml deleted file mode 100644 index b6fa31f6112..00000000000 --- a/src/test/resources/petriNets/dynamic_validations_performance_test.xml +++ /dev/null @@ -1,3306 +0,0 @@ - - dynamic_validations_performance - dynamic_validations_performance - true - DVT - - - min - Min - - - max - Max - 5 - - - number - Number - - - inrange ${min.value as Integer},${max.value as Integer} - Number field validation message - - - - - text - Text - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_01 - Text 01 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_02 - Text 02 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_03 - Text 03 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_04 - Text 04 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_05 - Text 05 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_06 - Text 06 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_07 - Text 07 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_08 - Text 08 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_09 - Text 09 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_10 - Text 10 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_11 - Text 11 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_12 - Text 12 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_13 - Text 13 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_14 - Text 14 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_15 - Text 15 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_16 - Text 16 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_17 - Text 17 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_18 - Text 18 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_19 - Text 19 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_20 - Text 20 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_21 - Text 21 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_22 - Text 22 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_23 - Text 23 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_24 - Text 24 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_25 - Text 25 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_26 - Text 26 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_27 - Text 27 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_28 - Text 28 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_29 - Text 29 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_30 - Text 30 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_31 - Text 31 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_32 - Text 32 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_33 - Text 33 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_34 - Text 34 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_35 - Text 35 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_36 - Text 36 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_37 - Text 37 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_38 - Text 38 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_39 - Text 39 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_40 - Text 40 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_41 - Text 41 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_42 - Text 42 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_43 - Text 43 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_44 - Text 44 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_45 - Text 45 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_46 - Text 46 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_47 - Text 47 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_48 - Text 48 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_49 - Text 49 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_50 - Text 50 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_51 - Text 51 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_52 - Text 52 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_53 - Text 53 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_54 - Text 54 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_55 - Text 55 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_56 - Text 56 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_57 - Text 57 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_58 - Text 58 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_59 - Text 59 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_60 - Text 60 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_61 - Text 61 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_62 - Text 62 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_63 - Text 63 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_64 - Text 64 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_65 - Text 65 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_66 - Text 66 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_67 - Text 67 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_68 - Text 68 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_69 - Text 69 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_70 - Text 70 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_71 - Text 71 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_72 - Text 72 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_73 - Text 73 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_74 - Text 74 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_75 - Text 75 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_76 - Text 76 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_77 - Text 77 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_78 - Text 78 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_79 - Text 79 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_80 - Text 80 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_81 - Text 81 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_82 - Text 82 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_83 - Text 83 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_84 - Text 84 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_85 - Text 85 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_86 - Text 86 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_87 - Text 87 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_88 - Text 88 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_89 - Text 89 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_90 - Text 90 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_91 - Text 91 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_92 - Text 92 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_93 - Text 93 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_94 - Text 94 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_95 - Text 95 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_96 - Text 96 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_97 - Text 97 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_98 - Text 98 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - text_99 - Text 99 - - - maxLength ${max.value as Integer} - Text field validation message - - - - - number_01 - Text 01 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_02 - Text 02 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_03 - Text 03 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_04 - Text 04 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_05 - Text 05 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_06 - Text 06 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_07 - Text 07 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_08 - Text 08 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_09 - Text 09 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_10 - Text 10 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_11 - Text 11 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_12 - Text 12 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_13 - Text 13 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_14 - Text 14 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_15 - Text 15 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_16 - Text 16 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_17 - Text 17 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_18 - Text 18 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_19 - Text 19 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_20 - Text 20 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_21 - Text 21 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_22 - Text 22 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_23 - Text 23 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_24 - Text 24 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_25 - Text 25 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_26 - Text 26 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_27 - Text 27 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_28 - Text 28 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_29 - Text 29 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_30 - Text 30 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_31 - Text 31 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_32 - Text 32 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_33 - Text 33 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_34 - Text 34 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_35 - Text 35 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_36 - Text 36 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_37 - Text 37 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_38 - Text 38 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_39 - Text 39 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_40 - Text 40 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_41 - Text 41 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_42 - Text 42 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_43 - Text 43 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_44 - Text 44 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_45 - Text 45 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_46 - Text 46 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_47 - Text 47 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_48 - Text 48 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_49 - Text 49 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_50 - Text 50 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_51 - Text 51 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_52 - Text 52 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_53 - Text 53 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_54 - Text 54 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_55 - Text 55 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_56 - Text 56 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_57 - Text 57 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_58 - Text 58 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_59 - Text 59 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_60 - Text 60 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_61 - Text 61 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_62 - Text 62 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_63 - Text 63 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_64 - Text 64 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_65 - Text 65 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_66 - Text 66 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_67 - Text 67 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_68 - Text 68 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_69 - Text 69 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_70 - Text 70 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_71 - Text 71 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_72 - Text 72 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_73 - Text 73 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_74 - Text 74 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_75 - Text 75 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_76 - Text 76 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_77 - Text 77 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_78 - Text 78 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_79 - Text 79 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_80 - Text 80 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_81 - Text 81 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_82 - Text 82 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_83 - Text 83 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_84 - Text 84 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_85 - Text 85 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_86 - Text 86 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_87 - Text 87 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_88 - Text 88 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_89 - Text 89 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_90 - Text 90 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_91 - Text 91 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_92 - Text 92 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_93 - Text 93 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_94 - Text 94 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_95 - Text 95 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_96 - Text 96 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_97 - Text 97 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_98 - Text 98 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - number_99 - Text 99 - - - inrange 0,${max.value as Integer} - Text field validation message - - - - - - date - Date - - - between past,today-P${max.value as Integer}D - Date field validation message - - - - - - number_valid_switch - Switch - - - number_valid_switch: f.number_valid_switch, - number: f.number; - - if (number_valid_switch.value) { - change number validations { "odd" } - } else { - change number validations { new - com.netgrif.application.engine.petrinet.domain.dataset.Validation('''inrange - ${min.value as Integer},${max.value as Integer}''', true) } - } - - - - - text_valid_switch - Switch - - - text_valid_switch: f.text_valid_switch, - text: f.text; - - if (text_valid_switch.value) { - change text validations { "email" } - } else { - change text validations { - new com.netgrif.application.engine.petrinet.domain.dataset.Validation( - '''log.info("running");maxLength ${max.value as Integer}''', - new com.netgrif.application.engine.petrinet.domain.I18nString("")) - } - } - - - - - transition - 200 - 200 - - auto - - - min - - editable - - - - max - - editable - - - - number - - editable - - - - text - - editable - - - - date - - editable - - - - number_valid_switch - - editable - - - - text_valid_switch - - editable - - - - text_01 - - editable - - - - text_02 - - editable - - - - text_03 - - editable - - - - text_04 - - editable - - - - text_05 - - editable - - - - text_06 - - editable - - - - text_07 - - editable - - - - text_08 - - editable - - - - text_09 - - editable - - - - text_10 - - editable - - - - text_11 - - editable - - - - text_12 - - editable - - - - text_13 - - editable - - - - text_14 - - editable - - - - text_15 - - editable - - - - text_16 - - editable - - - - text_17 - - editable - - - - text_18 - - editable - - - - text_19 - - editable - - - - text_20 - - editable - - - - text_21 - - editable - - - - text_22 - - editable - - - - text_23 - - editable - - - - text_24 - - editable - - - - text_25 - - editable - - - - text_26 - - editable - - - - text_27 - - editable - - - - text_28 - - editable - - - - text_29 - - editable - - - - text_30 - - editable - - - - text_31 - - editable - - - - text_32 - - editable - - - - text_33 - - editable - - - - text_34 - - editable - - - - text_35 - - editable - - - - text_36 - - editable - - - - text_37 - - editable - - - - text_38 - - editable - - - - text_39 - - editable - - - - text_40 - - editable - - - - text_41 - - editable - - - - text_42 - - editable - - - - text_43 - - editable - - - - text_44 - - editable - - - - text_45 - - editable - - - - text_46 - - editable - - - - text_47 - - editable - - - - text_48 - - editable - - - - text_49 - - editable - - - - text_50 - - editable - - - - text_51 - - editable - - - - text_52 - - editable - - - - text_53 - - editable - - - - text_54 - - editable - - - - text_55 - - editable - - - - text_56 - - editable - - - - text_57 - - editable - - - - text_58 - - editable - - - - text_59 - - editable - - - - text_60 - - editable - - - - text_61 - - editable - - - - text_62 - - editable - - - - text_63 - - editable - - - - text_64 - - editable - - - - text_65 - - editable - - - - text_66 - - editable - - - - text_67 - - editable - - - - text_68 - - editable - - - - text_69 - - editable - - - - text_70 - - editable - - - - text_71 - - editable - - - - text_72 - - editable - - - - text_73 - - editable - - - - text_74 - - editable - - - - text_75 - - editable - - - - text_76 - - editable - - - - text_77 - - editable - - - - text_78 - - editable - - - - text_79 - - editable - - - - text_80 - - editable - - - - text_81 - - editable - - - - text_82 - - editable - - - - text_83 - - editable - - - - text_84 - - editable - - - - text_85 - - editable - - - - text_86 - - editable - - - - text_87 - - editable - - - - text_88 - - editable - - - - text_89 - - editable - - - - text_90 - - editable - - - - text_91 - - editable - - - - text_92 - - editable - - - - text_93 - - editable - - - - text_94 - - editable - - - - text_95 - - editable - - - - text_96 - - editable - - - - text_97 - - editable - - - - text_98 - - editable - - - - text_99 - - editable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml b/src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml deleted file mode 100644 index 9b1684aed87..00000000000 --- a/src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml +++ /dev/null @@ -1,3278 +0,0 @@ - - dynamic_validations_performance_comparison - dynamic_validations_performance_comparison - true - DVT - - - min - Min - - - max - Max - 5 - - - number - Number - - - inrange 0,10 - Number field validation message - - - - - text - Text - - - maxLength 10 - Text field validation message - - - - - text_01 - Text 01 - - - maxLength 10 - Text field validation message - - - - - text_02 - Text 02 - - - maxLength 10 - Text field validation message - - - - - text_03 - Text 03 - - - maxLength 10 - Text field validation message - - - - - text_04 - Text 04 - - - maxLength 10 - Text field validation message - - - - - text_05 - Text 05 - - - maxLength 10 - Text field validation message - - - - - text_06 - Text 06 - - - maxLength 10 - Text field validation message - - - - - text_07 - Text 07 - - - maxLength 10 - Text field validation message - - - - - text_08 - Text 08 - - - maxLength 10 - Text field validation message - - - - - text_09 - Text 09 - - - maxLength 10 - Text field validation message - - - - - text_10 - Text 10 - - - maxLength 10 - Text field validation message - - - - - text_11 - Text 11 - - - maxLength 10 - Text field validation message - - - - - text_12 - Text 12 - - - maxLength 10 - Text field validation message - - - - - text_13 - Text 13 - - - maxLength 10 - Text field validation message - - - - - text_14 - Text 14 - - - maxLength 10 - Text field validation message - - - - - text_15 - Text 15 - - - maxLength 10 - Text field validation message - - - - - text_16 - Text 16 - - - maxLength 10 - Text field validation message - - - - - text_17 - Text 17 - - - maxLength 10 - Text field validation message - - - - - text_18 - Text 18 - - - maxLength 10 - Text field validation message - - - - - text_19 - Text 19 - - - maxLength 10 - Text field validation message - - - - - text_20 - Text 20 - - - maxLength 10 - Text field validation message - - - - - text_21 - Text 21 - - - maxLength 10 - Text field validation message - - - - - text_22 - Text 22 - - - maxLength 10 - Text field validation message - - - - - text_23 - Text 23 - - - maxLength 10 - Text field validation message - - - - - text_24 - Text 24 - - - maxLength 10 - Text field validation message - - - - - text_25 - Text 25 - - - maxLength 10 - Text field validation message - - - - - text_26 - Text 26 - - - maxLength 10 - Text field validation message - - - - - text_27 - Text 27 - - - maxLength 10 - Text field validation message - - - - - text_28 - Text 28 - - - maxLength 10 - Text field validation message - - - - - text_29 - Text 29 - - - maxLength 10 - Text field validation message - - - - - text_30 - Text 30 - - - maxLength 10 - Text field validation message - - - - - text_31 - Text 31 - - - maxLength 10 - Text field validation message - - - - - text_32 - Text 32 - - - maxLength 10 - Text field validation message - - - - - text_33 - Text 33 - - - maxLength 10 - Text field validation message - - - - - text_34 - Text 34 - - - maxLength 10 - Text field validation message - - - - - text_35 - Text 35 - - - maxLength 10 - Text field validation message - - - - - text_36 - Text 36 - - - maxLength 10 - Text field validation message - - - - - text_37 - Text 37 - - - maxLength 10 - Text field validation message - - - - - text_38 - Text 38 - - - maxLength 10 - Text field validation message - - - - - text_39 - Text 39 - - - maxLength 10 - Text field validation message - - - - - text_40 - Text 40 - - - maxLength 10 - Text field validation message - - - - - text_41 - Text 41 - - - maxLength 10 - Text field validation message - - - - - text_42 - Text 42 - - - maxLength 10 - Text field validation message - - - - - text_43 - Text 43 - - - maxLength 10 - Text field validation message - - - - - text_44 - Text 44 - - - maxLength 10 - Text field validation message - - - - - text_45 - Text 45 - - - maxLength 10 - Text field validation message - - - - - text_46 - Text 46 - - - maxLength 10 - Text field validation message - - - - - text_47 - Text 47 - - - maxLength 10 - Text field validation message - - - - - text_48 - Text 48 - - - maxLength 10 - Text field validation message - - - - - text_49 - Text 49 - - - maxLength 10 - Text field validation message - - - - - text_50 - Text 50 - - - maxLength 10 - Text field validation message - - - - - text_51 - Text 51 - - - maxLength 10 - Text field validation message - - - - - text_52 - Text 52 - - - maxLength 10 - Text field validation message - - - - - text_53 - Text 53 - - - maxLength 10 - Text field validation message - - - - - text_54 - Text 54 - - - maxLength 10 - Text field validation message - - - - - text_55 - Text 55 - - - maxLength 10 - Text field validation message - - - - - text_56 - Text 56 - - - maxLength 10 - Text field validation message - - - - - text_57 - Text 57 - - - maxLength 10 - Text field validation message - - - - - text_58 - Text 58 - - - maxLength 10 - Text field validation message - - - - - text_59 - Text 59 - - - maxLength 10 - Text field validation message - - - - - text_60 - Text 60 - - - maxLength 10 - Text field validation message - - - - - text_61 - Text 61 - - - maxLength 10 - Text field validation message - - - - - text_62 - Text 62 - - - maxLength 10 - Text field validation message - - - - - text_63 - Text 63 - - - maxLength 10 - Text field validation message - - - - - text_64 - Text 64 - - - maxLength 10 - Text field validation message - - - - - text_65 - Text 65 - - - maxLength 10 - Text field validation message - - - - - text_66 - Text 66 - - - maxLength 10 - Text field validation message - - - - - text_67 - Text 67 - - - maxLength 10 - Text field validation message - - - - - text_68 - Text 68 - - - maxLength 10 - Text field validation message - - - - - text_69 - Text 69 - - - maxLength 10 - Text field validation message - - - - - text_70 - Text 70 - - - maxLength 10 - Text field validation message - - - - - text_71 - Text 71 - - - maxLength 10 - Text field validation message - - - - - text_72 - Text 72 - - - maxLength 10 - Text field validation message - - - - - text_73 - Text 73 - - - maxLength 10 - Text field validation message - - - - - text_74 - Text 74 - - - maxLength 10 - Text field validation message - - - - - text_75 - Text 75 - - - maxLength 10 - Text field validation message - - - - - text_76 - Text 76 - - - maxLength 10 - Text field validation message - - - - - text_77 - Text 77 - - - maxLength 10 - Text field validation message - - - - - text_78 - Text 78 - - - maxLength 10 - Text field validation message - - - - - text_79 - Text 79 - - - maxLength 10 - Text field validation message - - - - - text_80 - Text 80 - - - maxLength 10 - Text field validation message - - - - - text_81 - Text 81 - - - maxLength 10 - Text field validation message - - - - - text_82 - Text 82 - - - maxLength 10 - Text field validation message - - - - - text_83 - Text 83 - - - maxLength 10 - Text field validation message - - - - - text_84 - Text 84 - - - maxLength 10 - Text field validation message - - - - - text_85 - Text 85 - - - maxLength 10 - Text field validation message - - - - - text_86 - Text 86 - - - maxLength 10 - Text field validation message - - - - - text_87 - Text 87 - - - maxLength 10 - Text field validation message - - - - - text_88 - Text 88 - - - maxLength 10 - Text field validation message - - - - - text_89 - Text 89 - - - maxLength 10 - Text field validation message - - - - - text_90 - Text 90 - - - maxLength 10 - Text field validation message - - - - - text_91 - Text 91 - - - maxLength 10 - Text field validation message - - - - - text_92 - Text 92 - - - maxLength 10 - Text field validation message - - - - - text_93 - Text 93 - - - maxLength 10 - Text field validation message - - - - - text_94 - Text 94 - - - maxLength 10 - Text field validation message - - - - - text_95 - Text 95 - - - maxLength 10 - Text field validation message - - - - - text_96 - Text 96 - - - maxLength 10 - Text field validation message - - - - - text_97 - Text 97 - - - maxLength 10 - Text field validation message - - - - - text_98 - Text 98 - - - maxLength 10 - Text field validation message - - - - - text_99 - Text 99 - - - maxLength 10 - Text field validation message - - - - - number_01 - Text 01 - - - inrange 0,5 - Text field validation message - - - - - number_02 - Text 02 - - - inrange 0,5 - Text field validation message - - - - - number_03 - Text 03 - - - inrange 0,5 - Text field validation message - - - - - number_04 - Text 04 - - - inrange 0,5 - Text field validation message - - - - - number_05 - Text 05 - - - inrange 0,5 - Text field validation message - - - - - number_06 - Text 06 - - - inrange 0,5 - Text field validation message - - - - - number_07 - Text 07 - - - inrange 0,5 - Text field validation message - - - - - number_08 - Text 08 - - - inrange 0,5 - Text field validation message - - - - - number_09 - Text 09 - - - inrange 0,5 - Text field validation message - - - - - number_10 - Text 10 - - - inrange 0,5 - Text field validation message - - - - - number_11 - Text 11 - - - inrange 0,5 - Text field validation message - - - - - number_12 - Text 12 - - - inrange 0,5 - Text field validation message - - - - - number_13 - Text 13 - - - inrange 0,5 - Text field validation message - - - - - number_14 - Text 14 - - - inrange 0,5 - Text field validation message - - - - - number_15 - Text 15 - - - inrange 0,5 - Text field validation message - - - - - number_16 - Text 16 - - - inrange 0,5 - Text field validation message - - - - - number_17 - Text 17 - - - inrange 0,5 - Text field validation message - - - - - number_18 - Text 18 - - - inrange 0,5 - Text field validation message - - - - - number_19 - Text 19 - - - inrange 0,5 - Text field validation message - - - - - number_20 - Text 20 - - - inrange 0,5 - Text field validation message - - - - - number_21 - Text 21 - - - inrange 0,5 - Text field validation message - - - - - number_22 - Text 22 - - - inrange 0,5 - Text field validation message - - - - - number_23 - Text 23 - - - inrange 0,5 - Text field validation message - - - - - number_24 - Text 24 - - - inrange 0,5 - Text field validation message - - - - - number_25 - Text 25 - - - inrange 0,5 - Text field validation message - - - - - number_26 - Text 26 - - - inrange 0,5 - Text field validation message - - - - - number_27 - Text 27 - - - inrange 0,5 - Text field validation message - - - - - number_28 - Text 28 - - - inrange 0,5 - Text field validation message - - - - - number_29 - Text 29 - - - inrange 0,5 - Text field validation message - - - - - number_30 - Text 30 - - - inrange 0,5 - Text field validation message - - - - - number_31 - Text 31 - - - inrange 0,5 - Text field validation message - - - - - number_32 - Text 32 - - - inrange 0,5 - Text field validation message - - - - - number_33 - Text 33 - - - inrange 0,5 - Text field validation message - - - - - number_34 - Text 34 - - - inrange 0,5 - Text field validation message - - - - - number_35 - Text 35 - - - inrange 0,5 - Text field validation message - - - - - number_36 - Text 36 - - - inrange 0,5 - Text field validation message - - - - - number_37 - Text 37 - - - inrange 0,5 - Text field validation message - - - - - number_38 - Text 38 - - - inrange 0,5 - Text field validation message - - - - - number_39 - Text 39 - - - inrange 0,5 - Text field validation message - - - - - number_40 - Text 40 - - - inrange 0,5 - Text field validation message - - - - - number_41 - Text 41 - - - inrange 0,5 - Text field validation message - - - - - number_42 - Text 42 - - - inrange 0,5 - Text field validation message - - - - - number_43 - Text 43 - - - inrange 0,5 - Text field validation message - - - - - number_44 - Text 44 - - - inrange 0,5 - Text field validation message - - - - - number_45 - Text 45 - - - inrange 0,5 - Text field validation message - - - - - number_46 - Text 46 - - - inrange 0,5 - Text field validation message - - - - - number_47 - Text 47 - - - inrange 0,5 - Text field validation message - - - - - number_48 - Text 48 - - - inrange 0,5 - Text field validation message - - - - - number_49 - Text 49 - - - inrange 0,5 - Text field validation message - - - - - number_50 - Text 50 - - - inrange 0,5 - Text field validation message - - - - - number_51 - Text 51 - - - inrange 0,5 - Text field validation message - - - - - number_52 - Text 52 - - - inrange 0,5 - Text field validation message - - - - - number_53 - Text 53 - - - inrange 0,5 - Text field validation message - - - - - number_54 - Text 54 - - - inrange 0,5 - Text field validation message - - - - - number_55 - Text 55 - - - inrange 0,5 - Text field validation message - - - - - number_56 - Text 56 - - - inrange 0,5 - Text field validation message - - - - - number_57 - Text 57 - - - inrange 0,5 - Text field validation message - - - - - number_58 - Text 58 - - - inrange 0,5 - Text field validation message - - - - - number_59 - Text 59 - - - inrange 0,5 - Text field validation message - - - - - number_60 - Text 60 - - - inrange 0,5 - Text field validation message - - - - - number_61 - Text 61 - - - inrange 0,5 - Text field validation message - - - - - number_62 - Text 62 - - - inrange 0,5 - Text field validation message - - - - - number_63 - Text 63 - - - inrange 0,5 - Text field validation message - - - - - number_64 - Text 64 - - - inrange 0,5 - Text field validation message - - - - - number_65 - Text 65 - - - inrange 0,5 - Text field validation message - - - - - number_66 - Text 66 - - - inrange 0,5 - Text field validation message - - - - - number_67 - Text 67 - - - inrange 0,5 - Text field validation message - - - - - number_68 - Text 68 - - - inrange 0,5 - Text field validation message - - - - - number_69 - Text 69 - - - inrange 0,5 - Text field validation message - - - - - number_70 - Text 70 - - - inrange 0,5 - Text field validation message - - - - - number_71 - Text 71 - - - inrange 0,5 - Text field validation message - - - - - number_72 - Text 72 - - - inrange 0,5 - Text field validation message - - - - - number_73 - Text 73 - - - inrange 0,5 - Text field validation message - - - - - number_74 - Text 74 - - - inrange 0,5 - Text field validation message - - - - - number_75 - Text 75 - - - inrange 0,5 - Text field validation message - - - - - number_76 - Text 76 - - - inrange 0,5 - Text field validation message - - - - - number_77 - Text 77 - - - inrange 0,5 - Text field validation message - - - - - number_78 - Text 78 - - - inrange 0,5 - Text field validation message - - - - - number_79 - Text 79 - - - inrange 0,5 - Text field validation message - - - - - number_80 - Text 80 - - - inrange 0,5 - Text field validation message - - - - - number_81 - Text 81 - - - inrange 0,5 - Text field validation message - - - - - number_82 - Text 82 - - - inrange 0,5 - Text field validation message - - - - - number_83 - Text 83 - - - inrange 0,5 - Text field validation message - - - - - number_84 - Text 84 - - - inrange 0,5 - Text field validation message - - - - - number_85 - Text 85 - - - inrange 0,5 - Text field validation message - - - - - number_86 - Text 86 - - - inrange 0,5 - Text field validation message - - - - - number_87 - Text 87 - - - inrange 0,5 - Text field validation message - - - - - number_88 - Text 88 - - - inrange 0,5 - Text field validation message - - - - - number_89 - Text 89 - - - inrange 0,5 - Text field validation message - - - - - number_90 - Text 90 - - - inrange 0,5 - Text field validation message - - - - - number_91 - Text 91 - - - inrange 0,5 - Text field validation message - - - - - number_92 - Text 92 - - - inrange 0,5 - Text field validation message - - - - - number_93 - Text 93 - - - inrange 0,5 - Text field validation message - - - - - number_94 - Text 94 - - - inrange 0,5 - Text field validation message - - - - - number_95 - Text 95 - - - inrange 0,5 - Text field validation message - - - - - number_96 - Text 96 - - - inrange 0,5 - Text field validation message - - - - - number_97 - Text 97 - - - inrange 0,5 - Text field validation message - - - - - number_98 - Text 98 - - - inrange 0,5 - Text field validation message - - - - - number_99 - Text 99 - - - inrange 0,5 - Text field validation message - - - - - - date - Date - - - between past,today-P1D - Date field validation message - - - - - - number_valid_switch - Switch - - - - text_valid_switch - Switch - - - - transition - 200 - 200 - - auto - - - min - - editable - - - - max - - editable - - - - number - - editable - - - - text - - editable - - - - date - - editable - - - - number_valid_switch - - editable - - - - text_valid_switch - - editable - - - - text_01 - - editable - - - - text_02 - - editable - - - - text_03 - - editable - - - - text_04 - - editable - - - - text_05 - - editable - - - - text_06 - - editable - - - - text_07 - - editable - - - - text_08 - - editable - - - - text_09 - - editable - - - - text_10 - - editable - - - - text_11 - - editable - - - - text_12 - - editable - - - - text_13 - - editable - - - - text_14 - - editable - - - - text_15 - - editable - - - - text_16 - - editable - - - - text_17 - - editable - - - - text_18 - - editable - - - - text_19 - - editable - - - - text_20 - - editable - - - - text_21 - - editable - - - - text_22 - - editable - - - - text_23 - - editable - - - - text_24 - - editable - - - - text_25 - - editable - - - - text_26 - - editable - - - - text_27 - - editable - - - - text_28 - - editable - - - - text_29 - - editable - - - - text_30 - - editable - - - - text_31 - - editable - - - - text_32 - - editable - - - - text_33 - - editable - - - - text_34 - - editable - - - - text_35 - - editable - - - - text_36 - - editable - - - - text_37 - - editable - - - - text_38 - - editable - - - - text_39 - - editable - - - - text_40 - - editable - - - - text_41 - - editable - - - - text_42 - - editable - - - - text_43 - - editable - - - - text_44 - - editable - - - - text_45 - - editable - - - - text_46 - - editable - - - - text_47 - - editable - - - - text_48 - - editable - - - - text_49 - - editable - - - - text_50 - - editable - - - - text_51 - - editable - - - - text_52 - - editable - - - - text_53 - - editable - - - - text_54 - - editable - - - - text_55 - - editable - - - - text_56 - - editable - - - - text_57 - - editable - - - - text_58 - - editable - - - - text_59 - - editable - - - - text_60 - - editable - - - - text_61 - - editable - - - - text_62 - - editable - - - - text_63 - - editable - - - - text_64 - - editable - - - - text_65 - - editable - - - - text_66 - - editable - - - - text_67 - - editable - - - - text_68 - - editable - - - - text_69 - - editable - - - - text_70 - - editable - - - - text_71 - - editable - - - - text_72 - - editable - - - - text_73 - - editable - - - - text_74 - - editable - - - - text_75 - - editable - - - - text_76 - - editable - - - - text_77 - - editable - - - - text_78 - - editable - - - - text_79 - - editable - - - - text_80 - - editable - - - - text_81 - - editable - - - - text_82 - - editable - - - - text_83 - - editable - - - - text_84 - - editable - - - - text_85 - - editable - - - - text_86 - - editable - - - - text_87 - - editable - - - - text_88 - - editable - - - - text_89 - - editable - - - - text_90 - - editable - - - - text_91 - - editable - - - - text_92 - - editable - - - - text_93 - - editable - - - - text_94 - - editable - - - - text_95 - - editable - - - - text_96 - - editable - - - - text_97 - - editable - - - - text_98 - - editable - - - - text_99 - - editable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/resources/petriNets/groovy_shell_test.xml b/src/test/resources/petriNets/groovy_shell_test.xml index 51d41498cbe..a2a631389e9 100644 --- a/src/test/resources/petriNets/groovy_shell_test.xml +++ b/src/test/resources/petriNets/groovy_shell_test.xml @@ -25,7 +25,7 @@ newVariable_1 - validation("String", new I18nString("I18nString")) + validation("String", null, null, new I18nString("I18nString")) return "value" @@ -43,7 +43,7 @@ t1_assign - validation("String", new I18nString("I18nString")) + validation("String", null, null, new I18nString("I18nString")) diff --git a/src/test/resources/petriNets/validation/valid_boolean.xml b/src/test/resources/petriNets/validation/valid_boolean.xml index 77c4c1e5054..7d01a695ebb 100644 --- a/src/test/resources/petriNets/validation/valid_boolean.xml +++ b/src/test/resources/petriNets/validation/valid_boolean.xml @@ -11,7 +11,7 @@ <validations> <validation> - <expression>requiredTrue</expression> + <name>requiredTrue</name> <message>error-boolean</message> </validation> </validations> diff --git a/src/test/resources/petriNets/validation/valid_date.xml b/src/test/resources/petriNets/validation/valid_date.xml index 008cd3b31bb..95fef4a5b63 100644 --- a/src/test/resources/petriNets/validation/valid_date.xml +++ b/src/test/resources/petriNets/validation/valid_date.xml @@ -12,7 +12,15 @@ <title/> <validations> <validation> - <expression>between today,future</expression> <!-- od dnes do buducnosti--> + <name>between</name> <!-- od dnes do buducnosti--> + <serverArguments> + <argument>today</argument> + <argument>future</argument> + </serverArguments> + <clientArguments> + <argument>today</argument> + <argument>future</argument> + </clientArguments> <message>error-date01</message> </validation> </validations> @@ -22,7 +30,15 @@ <title/> <validations> <validation> - <expression>between past,today</expression> <!-- od minulosti do dnešného dňa --> + <name>between</name> <!-- od minulosti do dnešného dňa --> + <serverArguments> + <argument>past</argument> + <argument>today</argument> + </serverArguments> + <clientArguments> + <argument>past</argument> + <argument>today</argument> + </clientArguments> <message>error-date02</message> </validation> </validations> @@ -32,7 +48,15 @@ <title/> <validations> <validation> - <expression>between 2020-03-03,today</expression> <!-- od datumu do dnešného dňa --> + <name>between</name> <!-- od datumu do dnešného dňa --> + <serverArguments> + <argument>2020-03-03</argument> + <argument>today</argument> + </serverArguments> + <clientArguments> + <argument>2020-03-03</argument> + <argument>today</argument> + </clientArguments> <message>error-date03</message> </validation> </validations> @@ -42,7 +66,15 @@ <title/> <validations> <validation> - <expression>between past,2020-03-03</expression> <!-- od minulosti do datumu --> + <name>between</name> <!-- od minulosti do datumu --> + <serverArguments> + <argument>past</argument> + <argument>2020-03-03</argument> + </serverArguments> + <clientArguments> + <argument>past</argument> + <argument>2020-03-03</argument> + </clientArguments> <message>error-date04</message> </validation> </validations> @@ -52,7 +84,15 @@ <title/> <validations> <validation> - <expression>between 2020-01-01,2022-03-03</expression> <!-- od datumu do datumu --> + <name>between</name> <!-- od datumu do datumu --> + <serverArguments> + <argument>2020-01-01</argument> + <argument>2022-03-03</argument> + </serverArguments> + <clientArguments> + <argument>2020-01-01</argument> + <argument>2022-03-03</argument> + </clientArguments> <message>error-date05</message> </validation> </validations> @@ -62,7 +102,7 @@ <title/> <validations> <validation> - <expression>workday</expression> <!-- pracovny den --> + <name>workday</name> <!-- pracovny den --> <message>error-date06</message> </validation> </validations> @@ -72,7 +112,7 @@ <title/> <validations> <validation> - <expression>weekend</expression> <!-- vikend --> + <name>weekend</name> <!-- vikend --> <message>error-date07</message> </validation> </validations> diff --git a/src/test/resources/petriNets/validation/valid_number.xml b/src/test/resources/petriNets/validation/valid_number.xml index bbcb7063438..1537f66d129 100644 --- a/src/test/resources/petriNets/validation/valid_number.xml +++ b/src/test/resources/petriNets/validation/valid_number.xml @@ -12,7 +12,7 @@ <title/> <validations> <validation> - <expression>odd</expression> + <name>odd</name> <message>error-number01</message> </validation> </validations> @@ -22,7 +22,7 @@ <title/> <validations> <validation> - <expression>even</expression> + <name>even</name> <message>error-number02</message> </validation> </validations> @@ -32,7 +32,7 @@ <title/> <validations> <validation> - <expression>positive</expression> + <name>positive</name> <message>error-number03</message> </validation> </validations> @@ -42,7 +42,7 @@ <title/> <validations> <validation> - <expression>negative</expression> + <name>negative</name> <message>error-number04</message> </validation> </validations> @@ -52,7 +52,7 @@ <title/> <validations> <validation> - <expression>decimal</expression> + <name>decimal</name> <message>error-number05</message> </validation> </validations> @@ -62,7 +62,15 @@ <title/> <validations> <validation> - <expression>inrange 10,20</expression> + <name>inrange</name> + <serverArguments> + <argument>10</argument> + <argument>20</argument> + </serverArguments> + <clientArguments> + <argument>10</argument> + <argument>20</argument> + </clientArguments> <message>error-number06</message> </validation> </validations> @@ -73,11 +81,19 @@ <title/> <validations> <validation> - <expression>odd</expression> + <name>odd</name> <message>error-number07-1</message> </validation> <validation> - <expression>inrange 1,5</expression> + <name>inrange</name> + <serverArguments> + <argument>inf</argument> + <argument>5</argument> + </serverArguments> + <clientArguments> + <argument>inf</argument> + <argument>5</argument> + </clientArguments> <message>error-number07-2</message> </validation> </validations> diff --git a/src/test/resources/petriNets/validation/valid_regex.xml b/src/test/resources/petriNets/validation/valid_regex.xml index 2b9dd0239a6..70c19e7c8e2 100644 --- a/src/test/resources/petriNets/validation/valid_regex.xml +++ b/src/test/resources/petriNets/validation/valid_regex.xml @@ -11,7 +11,13 @@ <title/> <validations> <validation> - <expression>regex ^([0-9]{1,6})$</expression> <!-- Cislo pocet znakov 1-6 --> + <name>regex</name> + <serverArguments> + <argument>^([0-9]{1,6})$</argument> <!-- Cislo pocet znakov 1-6 --> + </serverArguments> + <clientArguments> + <argument>^([0-9]{1,6})$</argument> <!-- Cislo pocet znakov 1-6 --> + </clientArguments> <message>error-regex01</message> </validation> </validations> @@ -21,7 +27,13 @@ <title/> <validations> <validation> - <expression>regex ^([a-zA-Z0-9\-]{10})$</expression> <!-- Cislo alebo pismeno a polcka 10 znakov --> + <name>regex</name> + <serverArguments> + <argument>^([a-zA-Z0-9\-]{10})$</argument> <!-- Cislo alebo pismeno a polcka 10 znakov --> + </serverArguments> + <clientArguments> + <argument>^([a-zA-Z0-9\-]{10})$</argument> <!-- Cislo alebo pismeno a polcka 10 znakov --> + </clientArguments> <message>error-regex02</message> </validation> </validations> @@ -31,7 +43,13 @@ <title/> <validations> <validation> - <expression>regex ^(TOTOK[a-zA-Z0-9]{7})$</expression> <!-- Prefix max 12 znakov --> + <name>regex</name> + <serverArguments> + <argument>^(TOTOK[a-zA-Z0-9]{7})$</argument> <!-- Prefix max 12 znakov --> + </serverArguments> + <clientArguments> + <argument>^(TOTOK[a-zA-Z0-9]{7})$</argument> <!-- Prefix max 12 znakov --> + </clientArguments> <message>error-regex03</message> </validation> </validations> @@ -41,7 +59,13 @@ <title/> <validations> <validation> - <expression>regex ^([a-zA-Z0-9 ]{1,10})$</expression> <!-- 10 znakov vratane medzeri --> + <name>regex</name> + <serverArguments> + <argument>^([a-zA-Z0-9 ]{1,10})$</argument> <!-- 10 znakov vratane medzeri --> + </serverArguments> + <clientArguments> + <argument>^([a-zA-Z0-9 ]{1,10})$</argument> <!-- 10 znakov vratane medzeri --> + </clientArguments> <message>error-regex04</message> </validation> </validations> @@ -51,7 +75,13 @@ <title/> <validations> <validation> - <expression>regex ^([A-ž0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/? ]{1,100})$</expression> <!-- pismena a specialne znaky max100 --> + <name>regex</name> + <serverArguments> + <argument>^([A-ž0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/? ]{1,100})$</argument> <!-- pismena a specialne znaky max100 --> + </serverArguments> + <clientArguments> + <argument>^([A-ž0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/? ]{1,100})$</argument> <!-- pismena a specialne znaky max100 --> + </clientArguments> <message>error-regex05</message> </validation> </validations> @@ -61,7 +91,13 @@ <title/> <validations> <validation> - <expression>regex ^[a-zA-Z0-9\._\%\+\-]+@[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,}$</expression> <!-- E-mail --> + <name>regex</name> + <serverArguments> + <argument>^[a-zA-Z0-9\._\%\+\-]+@[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,}$</argument> <!-- E-mail --> + </serverArguments> + <clientArguments> + <argument>^[a-zA-Z0-9\._\%\+\-]+@[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,}$</argument> <!-- E-mail --> + </clientArguments> <message>error-regex06</message> </validation> </validations> diff --git a/src/test/resources/petriNets/validation/valid_text.xml b/src/test/resources/petriNets/validation/valid_text.xml index 6935722ddc2..d0985c103a4 100644 --- a/src/test/resources/petriNets/validation/valid_text.xml +++ b/src/test/resources/petriNets/validation/valid_text.xml @@ -12,7 +12,7 @@ <title/> <validations> <validation> - <expression>email</expression> + <name>email</name> <message>error-text01</message> </validation> </validations> @@ -22,7 +22,7 @@ <title/> <validations> <validation> - <expression>telnumber</expression> + <name>telNumber</name> <message>error-text02</message> </validation> </validations> @@ -32,7 +32,13 @@ <title/> <validations> <validation> - <expression>maxlength 6</expression> + <name>maxLength</name> + <serverArguments> + <argument>6</argument> + </serverArguments> + <clientArguments> + <argument>6</argument> + </clientArguments> <message>error-text03</message> </validation> </validations> @@ -42,7 +48,13 @@ <title/> <validations> <validation> - <expression>minlength 3</expression> + <name>minLength</name> + <serverArguments> + <argument>3</argument> + </serverArguments> + <clientArguments> + <argument>3</argument> + </clientArguments> <message>error-text04</message> </validation> </validations> @@ -52,15 +64,61 @@ <title/> <validations> <validation> - <expression>minlength 3</expression> + <name>minLength</name> + <serverArguments> + <argument>3</argument> + </serverArguments> + <clientArguments> + <argument>3</argument> + </clientArguments> <message>error-text05</message> </validation> <validation> - <expression>maxlength 6</expression> + <name>maxLength</name> + <serverArguments> + <argument>6</argument> + </serverArguments> + <clientArguments> + <argument>6</argument> + </clientArguments> <message>error-text05</message> </validation> </validations> </data> + <data type="text"> + <id>text06</id> + <title/> + <validations> + <validation> + <name>aaaa</name> + <serverArguments> + <argument dynamic="true">number01.rawValue</argument> + </serverArguments> + <clientArguments> + <argument dynamic="true">number01.rawValue</argument> + </clientArguments> + <message>error-text06</message> + </validation> + </validations> + </data> + <data type="text"> + <id>text07</id> + <title/> + <validations> + <validation> + <name>number01</name> + <serverArguments> + <argument dynamic="true">number01.rawValue</argument> + </serverArguments> + <message>error-text07</message> + </validation> + </validations> + </data> + <data type="number"> + <id>number01</id> + <title/> + <init>5</init> + </data> <transition> <id>t1</id> <x>260</x> @@ -140,6 +198,20 @@ <appearance>outline</appearance> </layout> </dataRef> + <dataRef> + <id>text06</id> + <logic> + <behavior>editable</behavior> + </logic> + <layout> + <x>0</x> + <y>5</y> + <rows>1</rows> + <cols>4</cols> + <template>material</template> + <appearance>outline</appearance> + </layout> + </dataRef> </dataGroup> <event type="assign"> <id>t1_assign</id>