Prechádzať zdrojové kódy

Merge pull request #608 from kw-udon/issue-592

#592 Validation
Shinsuke Sugaya 9 rokov pred
rodič
commit
080fc486d6

+ 101 - 6
src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java

@@ -245,9 +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());
-        }
+        validateCreateFields(form);
         verifyToken(() -> asEditHtml());
         getDoc(form).ifPresent(
                 entity -> {
@@ -276,9 +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());
-        }
+        validateUpdateFields(form);
+        logger.debug("DEBUUG:::role" + form.doc.get("role"));
         verifyToken(() -> asEditHtml());
         getDoc(form).ifPresent(
                 entity -> {
@@ -314,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<String> 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<String> invalidArrayFields = fessConfig.invalidIndexArrayFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudFailedToCreateInstance("doc." + invalidArrayFields.get(0));
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexDateFields(form.doc)) {
+            List<String> invalidDateFields = fessConfig.invalidIndexDateFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudFailedToCreateInstance("doc." + invalidDateFields.get(0));
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexIntegerFields(form.doc)) {
+            List<String> invalidIntegerFields = fessConfig.invalidIndexIntegerFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudFailedToCreateInstance("doc." + invalidIntegerFields.get(0));
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexLongFields(form.doc)) {
+            List<String> invalidLongFields = fessConfig.invalidIndexLongFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudFailedToCreateInstance("doc." + invalidLongFields.get(0));
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexFloatFields(form.doc)) {
+            List<String> invalidFloatFields = fessConfig.invalidIndexFloatFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudFailedToCreateInstance("doc." + invalidFloatFields.get(0));
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexDoubleFields(form.doc)) {
+            List<String> 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<String> invalidRequiredFields = fessConfig.invalidIndexRequiredFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidRequiredFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+
+        if (!fessConfig.validateIndexArrayFields(form.doc)) {
+            List<String> invalidArrayFields = fessConfig.invalidIndexArrayFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidArrayFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexDateFields(form.doc)) {
+            List<String> invalidDateFields = fessConfig.invalidIndexDateFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidDateFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexIntegerFields(form.doc)) {
+            List<String> invalidIntegerFields = fessConfig.invalidIndexIntegerFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidIntegerFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexLongFields(form.doc)) {
+            List<String> invalidLongFields = fessConfig.invalidIndexLongFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidLongFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexFloatFields(form.doc)) {
+            List<String> invalidFloatFields = fessConfig.invalidIndexFloatFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidFloatFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+        if (!fessConfig.validateIndexDoubleFields(form.doc)) {
+            List<String> invalidDoubleFields = fessConfig.invalidIndexDoubleFields(form.doc);
+            throwValidationError(messages -> {
+                messages.addErrorsCrudCouldNotFindCrudTable("doc." + invalidDoubleFields.get(0), form.docId);
+            }, () -> asEditHtml());
+        }
+    }
+
     // ===================================================================================
     //                                                                              JSP
     //                                                                           =========

+ 88 - 9
src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java

@@ -48,6 +48,10 @@ import org.lastaflute.job.LaJob;
 import org.lastaflute.job.subsidiary.ConcurrentExec;
 import org.lastaflute.web.util.LaRequestUtil;
 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.LongTypeValidator;
 
 public interface FessProp {
 
@@ -1064,6 +1068,18 @@ public interface FessProp {
         return fieldSet;
     }
 
+    public default boolean validateIndexArrayFields(final Map<String, Object> source) {
+        return invalidIndexArrayFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexArrayFields(final Map<String, Object> source) {
+        // TODO always returns empty list
+        return stream(getIndexAdminArrayFields().split(",")).get(
+                stream -> stream.filter(StringUtil::isNotBlank).map(s -> s.trim()).filter(s -> isNonEmptyValue(source.get(s)))
+                        .filter(s -> false) // TODO
+                        .collect(Collectors.toList()));
+    }
+
     String getIndexAdminDateFields();
 
     public default Set<String> getIndexAdminDateFieldSet() {
@@ -1078,6 +1094,25 @@ public interface FessProp {
         return fieldSet;
     }
 
+    public default boolean validateIndexDateFields(final Map<String, Object> source) {
+        return invalidIndexDateFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexDateFields(final Map<String, Object> source) {
+        return stream(getIndexAdminDateFields().split(",")).get(
+                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();
 
     public default Set<String> getIndexAdminIntegerFieldSet() {
@@ -1092,6 +1127,17 @@ public interface FessProp {
         return fieldSet;
     }
 
+    public default boolean validateIndexIntegerFields(final Map<String, Object> source) {
+        return invalidIndexIntegerFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexIntegerFields(final Map<String, Object> source) {
+        final IntegerTypeValidator integerValidator = new IntegerTypeValidator();
+        return stream(getIndexAdminIntegerFields().split(",")).get(
+                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();
 
     public default Set<String> getIndexAdminLongFieldSet() {
@@ -1106,6 +1152,17 @@ public interface FessProp {
         return fieldSet;
     }
 
+    public default boolean validateIndexLongFields(final Map<String, Object> source) {
+        return invalidIndexLongFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexLongFields(final Map<String, Object> source) {
+        final LongTypeValidator longValidator = new LongTypeValidator();
+        return stream(getIndexAdminLongFields().split(",")).get(
+                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();
 
     public default Set<String> getIndexAdminFloatFieldSet() {
@@ -1120,6 +1177,17 @@ public interface FessProp {
         return fieldSet;
     }
 
+    public default boolean validateIndexFloatFields(final Map<String, Object> source) {
+        return invalidIndexFloatFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexFloatFields(final Map<String, Object> source) {
+        final FloatTypeValidator floatValidator = new FloatTypeValidator();
+        return stream(getIndexAdminFloatFields().split(",")).get(
+                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();
 
     public default Set<String> getIndexAdminDoubleFieldSet() {
@@ -1134,6 +1202,17 @@ public interface FessProp {
         return fieldSet;
     }
 
+    public default boolean validateIndexDoubleFields(final Map<String, Object> source) {
+        return invalidIndexDoubleFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexDoubleFields(final Map<String, Object> source) {
+        final DoubleTypeValidator doubleValidator = new DoubleTypeValidator();
+        return stream(getIndexAdminDoubleFields().split(",")).get(
+                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<String, Object> convertToEditableDoc(final Map<String, Object> source) {
 
         final Set<String> arrayFieldSet = getIndexAdminArrayFieldSet();
@@ -1211,19 +1290,19 @@ public interface FessProp {
     String getIndexAdminRequiredFields();
 
     public default boolean validateIndexRequiredFields(final Map<String, Object> source) {
+        return invalidIndexRequiredFields(source).isEmpty();
+    }
+
+    public default List<String> invalidIndexRequiredFields(final Map<String, Object> 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 static boolean isNonEmptyValue(final Object value) {
-        if (value == null) {
-            return false;
-        }
-        if (value instanceof String && StringUtil.isEmpty((String) value)) {
-            return false;
-        }
-        return true;
+    public default boolean isNonEmptyValue(final Object value) {
+        final RequiredValidator requiredValidator = new RequiredValidator();
+        return requiredValidator.isValid(value, null);
     }
+
 }

+ 10 - 5
src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp

@@ -82,35 +82,40 @@
 										<label for="doc_id" class="col-sm-3 control-label">doc_id</label>
 										<div class="col-sm-9">
 											<la:errors property="doc.doc_id" />
-											<la:text property="doc.doc_id" styleClass="form-control" />
+											<la:text property="doc.doc_id" styleClass="form-control"
+												required="required" />
 										</div>
 									</div>
 									<div class="form-group">
 										<label for="url" class="col-sm-3 control-label">url</label>
 										<div class="col-sm-9">
 											<la:errors property="doc.url" />
-											<la:text property="doc.url" styleClass="form-control" />
+											<la:text property="doc.url" styleClass="form-control"
+												required="required" />
 										</div>
 									</div>
 									<div class="form-group">
 										<label for="title" class="col-sm-3 control-label">title</label>
 										<div class="col-sm-9">
 											<la:errors property="doc.title" />
-											<la:text property="doc.title" styleClass="form-control" />
+											<la:text property="doc.title" styleClass="form-control"
+												required="required" />
 										</div>
 									</div>
 									<div class="form-group">
 										<label for="role" class="col-sm-3 control-label">role</label>
 										<div class="col-sm-9">
 											<la:errors property="doc.role" />
-											<la:textarea property="doc.role" styleClass="form-control" />
+											<la:textarea property="doc.role" styleClass="form-control"
+												required="required" />
 										</div>
 									</div>
 									<div class="form-group">
 										<label for="boost" class="col-sm-3 control-label">boost</label>
 										<div class="col-sm-9">
 											<la:errors property="doc.boost" />
-											<la:text property="doc.boost" styleClass="form-control" />
+											<la:text property="doc.boost" styleClass="form-control"
+												required="required" />
 										</div>
 									</div>
 									<div class="form-group">