Refactor ShadowValueValidator (#20161)

diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/column/AbstractColumnMatchShadowAlgorithm.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/column/AbstractColumnMatchShadowAlgorithm.java
index afa4ec6..ae30b44 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/column/AbstractColumnMatchShadowAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/column/AbstractColumnMatchShadowAlgorithm.java
@@ -20,14 +20,10 @@
 import com.google.common.base.Preconditions;
 import lombok.Getter;
 import org.apache.shardingsphere.shadow.algorithm.shadow.validator.ShadowValueValidator;
-import org.apache.shardingsphere.shadow.algorithm.shadow.validator.column.ShadowDateValueValidator;
-import org.apache.shardingsphere.shadow.algorithm.shadow.validator.column.ShadowEnumValueValidator;
 import org.apache.shardingsphere.shadow.api.shadow.ShadowOperationType;
 import org.apache.shardingsphere.shadow.api.shadow.column.ColumnShadowAlgorithm;
 import org.apache.shardingsphere.shadow.api.shadow.column.PreciseColumnShadowValue;
 
-import java.util.Collection;
-import java.util.LinkedList;
 import java.util.Optional;
 import java.util.Properties;
 
@@ -40,8 +36,6 @@
     
     private static final String OPERATION_PROPS_KEY = "operation";
     
-    private static final Collection<ShadowValueValidator> SHADOW_VALUE_VALIDATORS = new LinkedList<>();
-    
     @Getter
     private Properties props;
     
@@ -54,7 +48,6 @@
         this.props = props;
         shadowColumn = getShadowColumn(props);
         shadowOperationType = getShadowOperationType(props);
-        initShadowValueValidator();
     }
     
     private String getShadowColumn(final Properties props) {
@@ -71,18 +64,13 @@
         return result.get();
     }
     
-    private void initShadowValueValidator() {
-        SHADOW_VALUE_VALIDATORS.add(new ShadowDateValueValidator());
-        SHADOW_VALUE_VALIDATORS.add(new ShadowEnumValueValidator());
-    }
-    
     @Override
     public boolean isShadow(final PreciseColumnShadowValue<Comparable<?>> shadowValue) {
         String table = shadowValue.getLogicTableName();
         String column = shadowValue.getColumnName();
         Comparable<?> value = shadowValue.getValue();
         if (shadowOperationType == shadowValue.getShadowOperationType() && shadowColumn.equals(column)) {
-            SHADOW_VALUE_VALIDATORS.forEach(each -> each.preValidate(table, column, value));
+            ShadowValueValidator.validate(table, column, value);
             return isMatchValue(value);
         }
         return false;
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidator.java
index 6688e8b..a59cb3a 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidator.java
@@ -17,10 +17,26 @@
 
 package org.apache.shardingsphere.shadow.algorithm.shadow.validator;
 
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.shadow.algorithm.shadow.ShadowAlgorithmException;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * Shadow value validator.
  */
-public interface ShadowValueValidator {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ShadowValueValidator {
+    
+    private final static Set<Class<?>> UNSUPPORTED_TYPES = new HashSet<>();
+    
+    static {
+        UNSUPPORTED_TYPES.add(Date.class);
+        UNSUPPORTED_TYPES.add(Enum.class);
+    }
     
     /**
      * Validate shadow value.
@@ -29,5 +45,11 @@
      * @param column column name
      * @param shadowValue shadow value
      */
-    void preValidate(String table, String column, Comparable<?> shadowValue);
+    public static void validate(String table, String column, Comparable<?> shadowValue) {
+        for (Class<?> each : UNSUPPORTED_TYPES) {
+            if (each.isAssignableFrom(shadowValue.getClass())) {
+                throw new ShadowAlgorithmException("Shadow column `%s` of table `%s` does not support `%s` type", column, table, each);
+            }
+        }
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/column/ShadowEnumValueValidator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/column/ShadowEnumValueValidator.java
deleted file mode 100644
index 6241c06..0000000
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/column/ShadowEnumValueValidator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.shadow.algorithm.shadow.validator.column;
-
-import org.apache.shardingsphere.shadow.algorithm.shadow.ShadowAlgorithmException;
-import org.apache.shardingsphere.shadow.algorithm.shadow.validator.ShadowValueValidator;
-
-/**
- * Shadow value validator of enum.
- */
-public final class ShadowEnumValueValidator implements ShadowValueValidator {
-    
-    @Override
-    public void preValidate(final String table, final String column, final Comparable<?> shadowValue) {
-        if (shadowValue instanceof Enum) {
-            throw new ShadowAlgorithmException("Shadow column `%s` data of shadow table `%s` matching does not support type: `%s`.", column, table, Enum.class);
-        }
-    }
-}
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/column/ShadowDateValueValidator.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidatorTest.java
similarity index 62%
rename from shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/column/ShadowDateValueValidator.java
rename to shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidatorTest.java
index 7a2a1e8..c48ed7d 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/column/ShadowDateValueValidator.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/algorithm/shadow/validator/ShadowValueValidatorTest.java
@@ -15,22 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.shadow.algorithm.shadow.validator.column;
+package org.apache.shardingsphere.shadow.algorithm.shadow.validator;
 
 import org.apache.shardingsphere.shadow.algorithm.shadow.ShadowAlgorithmException;
-import org.apache.shardingsphere.shadow.algorithm.shadow.validator.ShadowValueValidator;
+import org.junit.Test;
 
 import java.util.Date;
 
-/**
- * Shadow value validator of date type.
- */
-public final class ShadowDateValueValidator implements ShadowValueValidator {
+import static org.mockito.Mockito.mock;
+
+public final class ShadowValueValidatorTest {
     
-    @Override
-    public void preValidate(final String table, final String column, final Comparable<?> shadowValue) {
-        if (shadowValue instanceof Date) {
-            throw new ShadowAlgorithmException("Shadow column `%s` data of shadow table `%s` matching does not support type: `%s`.", column, table, Date.class);
-        }
+    @Test(expected = ShadowAlgorithmException.class)
+    public void assertValidateDateType() {
+        ShadowValueValidator.validate("tbl", "col", new Date());
+    }
+    
+    @Test(expected = ShadowAlgorithmException.class)
+    public void assertValidateEnumType() {
+        ShadowValueValidator.validate("tbl", "col", mock(Enum.class));
+    }
+    
+    @Test
+    public void assertValidateAcceptedType() {
+        ShadowValueValidator.validate("tbl", "col", "");
     }
 }