diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java index 58e5153b3..47f48bdae 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java @@ -245,27 +245,7 @@ public class AdminSearchlistAction extends FessAdminAction { public HtmlResponse create(final CreateForm form) { verifyCrudMode(form.crudMode, CrudMode.CREATE); validate(form, messages -> {}, () -> asEditHtml()); - if (!fessConfig.validateIndexRequiredFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } - if (!fessConfig.validateIndexArrayFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } - if (!fessConfig.validateIndexDateFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } - if (!fessConfig.validateIndexIntegerFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } - if (!fessConfig.validateIndexLongFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } - if (!fessConfig.validateIndexFloatFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } - if (!fessConfig.validateIndexDoubleFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml()); - } + validateCreateFields(form); verifyToken(() -> asEditHtml()); getDoc(form).ifPresent( entity -> { @@ -294,27 +274,8 @@ public class AdminSearchlistAction extends FessAdminAction { public HtmlResponse update(final EditForm form) { verifyCrudMode(form.crudMode, CrudMode.EDIT); validate(form, messages -> {}, () -> asEditHtml()); - if (!fessConfig.validateIndexRequiredFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } - if (!fessConfig.validateIndexArrayFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } - if (!fessConfig.validateIndexDateFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } - if (!fessConfig.validateIndexIntegerFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } - if (!fessConfig.validateIndexLongFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } - if (!fessConfig.validateIndexFloatFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } - if (!fessConfig.validateIndexDoubleFields(form.doc)) { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); - } + validateUpdateFields(form); + logger.debug("DEBUUG:::role" + form.doc.get("role")); verifyToken(() -> asEditHtml()); getDoc(form).ifPresent( entity -> { @@ -350,6 +311,104 @@ public class AdminSearchlistAction extends FessAdminAction { return redirectWith(getClass(), moreUrl("search").params("q", form.q)); } + // =================================================================================== + // Validation + // ========= + protected void validateCreateFields(final CreateForm form) { + + if (!fessConfig.validateIndexRequiredFields(form.doc)) { + List invalidRequiredFields = fessConfig.invalidIndexRequiredFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidRequiredFields.get(0)); + // TODO messages.addConstraintsRequiredMessage("doc." + invalidRequiredFields.get(0), invalidRequiredFields.get(0)); + }, () -> asEditHtml()); + } + + if (!fessConfig.validateIndexArrayFields(form.doc)) { + List invalidArrayFields = fessConfig.invalidIndexArrayFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidArrayFields.get(0)); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexDateFields(form.doc)) { + List invalidDateFields = fessConfig.invalidIndexDateFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidDateFields.get(0)); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexIntegerFields(form.doc)) { + List invalidIntegerFields = fessConfig.invalidIndexIntegerFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidIntegerFields.get(0)); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexLongFields(form.doc)) { + List invalidLongFields = fessConfig.invalidIndexLongFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidLongFields.get(0)); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexFloatFields(form.doc)) { + List invalidFloatFields = fessConfig.invalidIndexFloatFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidFloatFields.get(0)); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexDoubleFields(form.doc)) { + List invalidDoubleFields = fessConfig.invalidIndexDoubleFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudFailedToCreateInstance("doc." + invalidDoubleFields.get(0)); + }, () -> asEditHtml()); + } + } + + protected void validateUpdateFields(final EditForm form) { + + if (!fessConfig.validateIndexRequiredFields(form.doc)) { + List invalidRequiredFields = fessConfig.invalidIndexRequiredFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidRequiredFields.get(0), form.docId); + }, () -> asEditHtml()); + } + + if (!fessConfig.validateIndexArrayFields(form.doc)) { + List invalidArrayFields = fessConfig.invalidIndexArrayFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidArrayFields.get(0), form.docId); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexDateFields(form.doc)) { + List invalidDateFields = fessConfig.invalidIndexDateFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidDateFields.get(0), form.docId); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexIntegerFields(form.doc)) { + List invalidIntegerFields = fessConfig.invalidIndexIntegerFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidIntegerFields.get(0), form.docId); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexLongFields(form.doc)) { + List invalidLongFields = fessConfig.invalidIndexLongFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidLongFields.get(0), form.docId); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexFloatFields(form.doc)) { + List invalidFloatFields = fessConfig.invalidIndexFloatFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidFloatFields.get(0), form.docId); + }, () -> asEditHtml()); + } + if (!fessConfig.validateIndexDoubleFields(form.doc)) { + List invalidDoubleFields = fessConfig.invalidIndexDoubleFields(form.doc); + throwValidationError(messages -> { + messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidDoubleFields.get(0), form.docId); + }, () -> asEditHtml()); + } + } + // =================================================================================== // JSP // ========= diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java index 3d9b71898..47edb8981 100644 --- a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java +++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java @@ -51,7 +51,6 @@ import org.lastaflute.web.validation.RequiredValidator; import org.lastaflute.web.validation.theme.typed.DoubleTypeValidator; import org.lastaflute.web.validation.theme.typed.FloatTypeValidator; import org.lastaflute.web.validation.theme.typed.IntegerTypeValidator; -import org.lastaflute.web.validation.theme.typed.LocalDateTimeTypeValidator; import org.lastaflute.web.validation.theme.typed.LongTypeValidator; public interface FessProp { @@ -1070,9 +1069,15 @@ public interface FessProp { } public default boolean validateIndexArrayFields(final Map source) { + return invalidIndexArrayFields(source).isEmpty(); + } + + public default List invalidIndexArrayFields(final Map source) { + // TODO always returns empty list return stream(getIndexAdminArrayFields().split(",")).get( - stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> source.get(s) instanceof String[] || source.get(s) instanceof List)); + stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s))) + .filter(s -> false) // TODO + .collect(Collectors.toList())); } String getIndexAdminDateFields(); @@ -1090,10 +1095,22 @@ public interface FessProp { } public default boolean validateIndexDateFields(final Map source) { - final LocalDateTimeTypeValidator dateValidator = new LocalDateTimeTypeValidator(); + return invalidIndexDateFields(source).isEmpty(); + } + + public default List invalidIndexDateFields(final Map source) { return stream(getIndexAdminDateFields().split(",")).get( - stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> dateValidator.isValid((String) source.get(s), null))); + stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s))) + .filter(s -> !validateDateTimeString((String) source.get(s))).collect(Collectors.toList())); + } + + public default boolean validateDateTimeString(final String str) { + try { + FessFunctions.parseDate(str); + return true; + } catch (Exception e) { + return false; + } } String getIndexAdminIntegerFields(); @@ -1111,10 +1128,14 @@ public interface FessProp { } public default boolean validateIndexIntegerFields(final Map source) { + return invalidIndexIntegerFields(source).isEmpty(); + } + + public default List invalidIndexIntegerFields(final Map source) { final IntegerTypeValidator integerValidator = new IntegerTypeValidator(); return stream(getIndexAdminIntegerFields().split(",")).get( - stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> integerValidator.isValid((String) source.get(s), null))); + stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s))) + .filter(s -> !integerValidator.isValid((String) source.get(s), null)).collect(Collectors.toList())); } String getIndexAdminLongFields(); @@ -1132,10 +1153,14 @@ public interface FessProp { } public default boolean validateIndexLongFields(final Map source) { + return invalidIndexLongFields(source).isEmpty(); + } + + public default List invalidIndexLongFields(final Map source) { final LongTypeValidator longValidator = new LongTypeValidator(); return stream(getIndexAdminLongFields().split(",")).get( - stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> longValidator.isValid((String) source.get(s), null))); + stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s))) + .filter(s -> !longValidator.isValid((String) source.get(s), null)).collect(Collectors.toList())); } String getIndexAdminFloatFields(); @@ -1153,10 +1178,14 @@ public interface FessProp { } public default boolean validateIndexFloatFields(final Map source) { + return invalidIndexFloatFields(source).isEmpty(); + } + + public default List invalidIndexFloatFields(final Map source) { final FloatTypeValidator floatValidator = new FloatTypeValidator(); return stream(getIndexAdminFloatFields().split(",")).get( - stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> floatValidator.isValid((String) source.get(s), null))); + stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s))) + .filter(s -> !floatValidator.isValid((String) source.get(s), null)).collect(Collectors.toList())); } String getIndexAdminDoubleFields(); @@ -1174,10 +1203,14 @@ public interface FessProp { } public default boolean validateIndexDoubleFields(final Map source) { + return invalidIndexDoubleFields(source).isEmpty(); + } + + public default List invalidIndexDoubleFields(final Map source) { final DoubleTypeValidator doubleValidator = new DoubleTypeValidator(); return stream(getIndexAdminDoubleFields().split(",")).get( - stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> doubleValidator.isValid((String) source.get(s), null))); + stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s))) + .filter(s -> !doubleValidator.isValid((String) source.get(s), null)).collect(Collectors.toList())); } public default Map convertToEditableDoc(final Map source) { @@ -1220,7 +1253,6 @@ public interface FessProp { public default Map convertToStorableDoc(final Map source) { - final RequiredValidator requiredValidator = new RequiredValidator(); final Set arrayFieldSet = getIndexAdminArrayFieldSet(); final Set dateFieldSet = getIndexAdminDateFieldSet(); final Set integerFieldSet = getIndexAdminIntegerFieldSet(); @@ -1231,7 +1263,7 @@ public interface FessProp { return source .entrySet() .stream() - .filter(e -> requiredValidator.isValid(e.getValue(), null)) + .filter(e -> isNonEmptyValue(e.getValue())) .map(e -> { final String key = e.getKey(); Object value = e.getValue(); @@ -1254,14 +1286,23 @@ public interface FessProp { return new Pair(key, value); }).collect(Collectors.toMap(Pair::getFirst, Pair::getSecond)); } - + String getIndexAdminRequiredFields(); public default boolean validateIndexRequiredFields(final Map source) { + return invalidIndexRequiredFields(source).isEmpty(); + } + + public default List invalidIndexRequiredFields(final Map source) { final RequiredValidator requiredValidator = new RequiredValidator(); return stream(getIndexAdminRequiredFields().split(",")).get( stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()) - .allMatch(s -> requiredValidator.isValid(source.get(s), null))); + .filter(s -> !requiredValidator.isValid(source.get(s), null)).collect(Collectors.toList())); + } + + public default boolean isNonEmptyValue(final Object value) { + final RequiredValidator requiredValidator = new RequiredValidator(); + return requiredValidator.isValid(value, null); } } diff --git a/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp b/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp index 2e14a0950..9f433c2c7 100644 --- a/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp +++ b/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp @@ -82,35 +82,40 @@
- +
- +
- +
- +
- +