Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.netgrif.application.engine.validation.models

import com.netgrif.application.engine.pfql.domain.enums.QueryType
import com.netgrif.application.engine.validation.domain.ValidationDataInput

class CaseFilterFieldValidation extends FilterFieldValidation {

@Override
void query(ValidationDataInput validationData) {
doValidation(validationData, QueryType.CASE)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.netgrif.application.engine.validation.models

import com.netgrif.application.engine.pfql.domain.enums.QueryType
import com.netgrif.application.engine.pfql.service.QueryLangEvaluator
import com.netgrif.application.engine.pfql.service.utils.SearchUtils
import com.netgrif.application.engine.validation.domain.ValidationDataInput

/**
* Abstract base class for validating filter field values against PFQL queries.
* <p>
* This class provides common validation logic for filter fields that need to verify
* whether their values represent valid PFQL queries of a specific type.
* </p>
*/
abstract class FilterFieldValidation extends AbstractFieldValidation {

/**
* Validates the filter field value as a PFQL query.
* <p>
* Implementations must specify the expected query type for validation.
* </p>
*
* @param validationData the validation data input containing the field value and validation context
*/
abstract void query(ValidationDataInput validationData)

/**
* Performs validation of the field value against a specific PFQL query type.
* <p>
* This method checks if the field value is a valid PFQL query and verifies that
* it matches the expected query type. If the value is null or empty, no validation
* is performed. If the query is invalid or does not match the expected type,
* an IllegalArgumentException is thrown with the localized validation message.
* </p>
*
* @param validationData the validation data input containing the field value, locale, and validation message
* @param queryType the expected PFQL query type that the field value should match
* @throws IllegalArgumentException if the query is invalid or does not match the expected type
*/
protected static void doValidation(ValidationDataInput validationData, QueryType queryType) {
if (validationData.getData().getValue() != null && validationData.getData().getValue() != "") {
try {
QueryLangEvaluator evaluator = SearchUtils.evaluateQuery(validationData.getData().getValue() as String)
if (evaluator.resourceType !== queryType) {
throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale()))
}
} catch (Exception ignore) {
throw new IllegalArgumentException(validationData.getValidationMessage().getTranslation(validationData.getLocale()))
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.netgrif.application.engine.validation.models

import com.netgrif.application.engine.pfql.domain.enums.QueryType
import com.netgrif.application.engine.validation.domain.ValidationDataInput

class ProcessFilterValidation extends FilterFieldValidation {

@Override
void query(ValidationDataInput validationData) {
doValidation(validationData, QueryType.PROCESS)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.netgrif.application.engine.validation.models

import com.netgrif.application.engine.pfql.domain.enums.QueryType
import com.netgrif.application.engine.validation.domain.ValidationDataInput

class TaskFilterFieldValidation extends FilterFieldValidation{

@Override
void query(ValidationDataInput validationData) {
doValidation(validationData, QueryType.TASK)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import java.util.stream.Collectors
class ValidationService implements IValidationService {

@Override
public void valid(Field field, DataField dataField) {
void valid(Field field, DataField dataField) {
if (field.getValidations() == null) {
return
}
Expand All @@ -36,6 +36,13 @@ class ValidationService implements IValidationService {
instance = new BooleanFieldValidation()
} else if (field instanceof DateField) {
instance = new DateFieldValidation()
} else if (field instanceof CaseFilterField) {
instance = new CaseFilterFieldValidation()
} else if (field instanceof TaskFilterField) {
instance = new TaskFilterFieldValidation()
} else if (field instanceof ProcessFilterField) {
instance = new ProcessFilterValidation()
}
// } else if (field instanceof DateTimeField) {
// instance = new DateTimeFieldValidation()
// } else if (field instanceof ButtonField) {
Expand All @@ -61,13 +68,12 @@ class ValidationService implements IValidationService {
// } else if (field instanceof UserListField) {
//
// } else if (field instanceof I18nField) {
}
MetaMethod method = instance.metaClass.getMethods().find { it.name.toLowerCase() == rules.first().toLowerCase() }
if (method != null) {
I18nString validMessage = validation.getValidationMessage() != null ? validation.getValidationMessage() : 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 " + field.getImportId() + " not found")
log.warn("Method [{}] in dataField {} not found", rules.first(), field.getImportId())
}
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
@Slf4j
public final class FieldFactory {

private static final String FILTER_FIELD_VALIDATION_RULE = "query";

@Value("${nae.storage.default-type:local}")
private String defaultStorageType;

Expand Down Expand Up @@ -559,18 +561,21 @@ private FileListField buildFileListField(Data data) {
private CaseFilterField buildCaseFilterField(Data data) {
CaseFilterField field = new CaseFilterField();
setDefaultValue(field, data, field::setDefaultValue);
field.setValidations(getFilterValidationAsList());
return field;
}

private TaskFilterField buildTaskFilterField(Data data) {
TaskFilterField field = new TaskFilterField();
setDefaultValue(field, data, field::setDefaultValue);
field.setValidations(getFilterValidationAsList());
return field;
}

private ProcessFilterField buildProcessFilterField(Data data) {
ProcessFilterField field = new ProcessFilterField();
setDefaultValue(field, data, field::setDefaultValue);
field.setValidations(getFilterValidationAsList());
return field;
}

Expand Down Expand Up @@ -863,4 +868,11 @@ private Map<String, I18nString> getFieldOptions(MapOptionsField<?, ?> field, Cas
private void resolveStorage(Data data, StorageField<?> field) {
field.setStorage(StorageFactory.createStorage(data, storageResolverService, defaultStorageType));
}

private List<com.netgrif.application.engine.petrinet.domain.dataset.logic.validation.Validation> getFilterValidationAsList() {
com.netgrif.application.engine.petrinet.domain.dataset.logic.validation.Validation defaultValidation = makeValidation(FILTER_FIELD_VALIDATION_RULE, null, false);
List<com.netgrif.application.engine.petrinet.domain.dataset.logic.validation.Validation> validations = new ArrayList<>();
validations.add(defaultValidation);
return validations;
}
}
51 changes: 0 additions & 51 deletions src/main/java/com/netgrif/application/engine/menu/domain/Menu.java

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading