You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2018/03/23 18:59:13 UTC

[2/3] bval git commit: use MetadataSource interface for XML validation mappings

use MetadataSource interface for XML validation mappings


Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/62513079
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/62513079
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/62513079

Branch: refs/heads/bv2
Commit: 62513079829a4b57109691567a00c5e7831ee1bb
Parents: cb3ffb9
Author: Matt Benson <mb...@apache.org>
Authored: Fri Mar 23 11:26:22 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Fri Mar 23 11:26:22 2018 -0500

----------------------------------------------------------------------
 .../apache/bval/jsr/ApacheValidatorFactory.java | 13 +++--
 .../bval/jsr/metadata/MetadataSource.java       | 40 ++++++++++++++
 .../bval/jsr/xml/ValidationMappingParser.java   | 56 ++++++++------------
 .../org.apache.bval.jsr.metadata.MetadataSource | 17 ++++++
 4 files changed, 89 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/62513079/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
index 35b2919..67599f7 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.BiConsumer;
 
 import javax.validation.ClockProvider;
 import javax.validation.ConstraintValidatorFactory;
@@ -38,10 +39,12 @@ import javax.validation.spi.ConfigurationState;
 import javax.validation.valueextraction.ValueExtractor;
 
 import org.apache.bval.jsr.descriptor.DescriptorManager;
+import org.apache.bval.jsr.metadata.MetadataBuilder;
+import org.apache.bval.jsr.metadata.MetadataBuilder.ForBean;
 import org.apache.bval.jsr.metadata.MetadataBuilders;
+import org.apache.bval.jsr.metadata.MetadataSource;
 import org.apache.bval.jsr.util.AnnotationsManager;
 import org.apache.bval.jsr.valueextraction.ValueExtractors;
-import org.apache.bval.jsr.xml.ValidationMappingParser;
 import org.apache.bval.util.CloseableAble;
 import org.apache.bval.util.reflection.Reflection;
 import org.apache.commons.weaver.privilizer.Privilizing;
@@ -350,8 +353,12 @@ public class ApacheValidatorFactory implements ValidatorFactory, Cloneable {
     }
 
     private void loadAndVerifyUserCustomizations(ConfigurationState configuration) {
-        //TODO introduce service interface
-        new ValidationMappingParser(this).processMappingConfig(configuration.getMappingStreams());
+        @SuppressWarnings({ "unchecked", "rawtypes" })
+        final BiConsumer<Class<?>, ForBean<?>> addBuilder = (t, b) -> {
+            getMetadataBuilders().registerCustomBuilder((Class) t, (MetadataBuilder.ForBean) b);
+        };
+        participantFactory.loadServices(MetadataSource.class)
+            .forEach(ms -> ms.process(configuration, getConstraintsCache()::add, addBuilder));
 
         getMetadataBuilders().getCustomizedTypes().forEach(getDescriptorManager()::getBeanDescriptor);
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/62513079/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java
new file mode 100644
index 0000000..44cca43
--- /dev/null
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java
@@ -0,0 +1,40 @@
+/*
+ *  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.bval.jsr.metadata;
+
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.spi.ConfigurationState;
+
+/**
+ * Service interface for user metadata customizations.
+ */
+public interface MetadataSource {
+
+    /**
+     * Add {@link ConstraintValidator} mappings and/or metadata builders.
+     * 
+     * @param configurationState
+     *            may be read for environmental cues
+     * @param addMappingProvider
+     * @param addBuilder
+     */
+    void process(ConfigurationState configurationState, Consumer<ValidatorMappingProvider> addMappingProvider,
+        BiConsumer<Class<?>, MetadataBuilder.ForBean<?>> addBuilder);
+}

http://git-wip-us.apache.org/repos/asf/bval/blob/62513079/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
index c7e0f75..16ab75d 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
@@ -20,29 +20,29 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 
 import javax.validation.ValidationException;
+import javax.validation.spi.ConfigurationState;
 
-import org.apache.bval.jsr.ApacheValidatorFactory;
-import org.apache.bval.jsr.metadata.MetadataBuilder;
+import org.apache.bval.jsr.metadata.MetadataBuilder.ForBean;
+import org.apache.bval.jsr.metadata.MetadataSource;
+import org.apache.bval.jsr.metadata.ValidatorMappingProvider;
 import org.apache.bval.jsr.metadata.XmlBuilder;
 import org.apache.bval.jsr.metadata.XmlValidationMappingProvider;
 import org.apache.bval.util.Exceptions;
-import org.apache.bval.util.Validate;
 import org.apache.bval.util.reflection.Reflection;
 import org.apache.commons.weaver.privilizer.Privilizing;
 import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
 import org.xml.sax.InputSource;
 
 /**
- * Uses JAXB to parse constraints.xml based on the validation-mapping XML
- * schema.
+ * Uses JAXB to parse constraints.xml based on the validation-mapping XML schema.
  */
 @Privilizing(@CallTo(Reflection.class))
-public class ValidationMappingParser {
+public class ValidationMappingParser implements MetadataSource {
     private static final SchemaManager SCHEMA_MANAGER = new SchemaManager.Builder()
         .add(null, "http://jboss.org/xml/ns/javax/validation/mapping", "META-INF/validation-mapping-1.0.xsd")
         .add(XmlBuilder.Version.v11.getId(), "http://jboss.org/xml/ns/javax/validation/mapping",
@@ -51,26 +51,16 @@ public class ValidationMappingParser {
             "META-INF/validation-mapping-2.0.xsd")
         .build();
 
-    private final ApacheValidatorFactory factory;
-
-    public ValidationMappingParser(ApacheValidatorFactory factory) {
-        this.factory = Validate.notNull(factory, "factory");
-    }
-
-    /**
-     * Parse files with constraint mappings and collect information in the
-     * factory.
-     * 
-     * @param xmlStreams
-     *            - one or more contraints.xml file streams to parse
-     */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public void processMappingConfig(Set<InputStream> xmlStreams) throws ValidationException {
-        for (final InputStream xmlStream : xmlStreams) {
+    @Override
+    public void process(ConfigurationState configurationState,
+        Consumer<ValidatorMappingProvider> addValidatorMappingProvider, BiConsumer<Class<?>, ForBean<?>> addBuilder) {
+        if (configurationState.isIgnoreXmlConfiguration()) {
+            return;
+        }
+        for (final InputStream xmlStream : configurationState.getMappingStreams()) {
             final ConstraintMappingsType mapping = parseXmlMappings(xmlStream);
-            processConstraintDefinitions(mapping.getConstraintDefinition(), mapping.getDefaultPackage());
-            new XmlBuilder(mapping).forBeans().forEach(
-                (k, v) -> factory.getMetadataBuilders().registerCustomBuilder((Class) k, (MetadataBuilder.ForBean) v));
+            addValidatorMappingProvider.accept(toMappingProvider(mapping));
+            new XmlBuilder(mapping).forBeans().forEach(addBuilder::accept);
         }
     }
 
@@ -93,15 +83,13 @@ public class ValidationMappingParser {
         }
     }
 
-    private void processConstraintDefinitions(List<ConstraintDefinitionType> constraintDefinitionList,
-        String defaultPackage) {
-
+    private ValidatorMappingProvider toMappingProvider(ConstraintMappingsType mapping) {
         final Map<Class<? extends Annotation>, ValidatedByType> validatorMappings = new HashMap<>();
 
-        for (ConstraintDefinitionType constraintDefinition : constraintDefinitionList) {
+        for (ConstraintDefinitionType constraintDefinition : mapping.getConstraintDefinition()) {
             final String annotationClassName = constraintDefinition.getAnnotation();
 
-            final Class<?> clazz = loadClass(annotationClassName, defaultPackage);
+            final Class<?> clazz = loadClass(annotationClassName, mapping.getDefaultPackage());
 
             Exceptions.raiseUnless(clazz.isAnnotation(), ValidationException::new, "%s is not an annotation",
                 annotationClassName);
@@ -113,8 +101,8 @@ public class ValidationMappingParser {
 
             validatorMappings.put(annotationClass, constraintDefinition.getValidatedBy());
         }
-        factory.getConstraintsCache()
-            .add(new XmlValidationMappingProvider(validatorMappings, cn -> toQualifiedClassName(cn, defaultPackage)));
+        return new XmlValidationMappingProvider(validatorMappings,
+            cn -> toQualifiedClassName(cn, mapping.getDefaultPackage()));
     }
 
     private Class<?> loadClass(String className, String defaultPackage) {

http://git-wip-us.apache.org/repos/asf/bval/blob/62513079/bval-jsr/src/main/resources/META-INF/services/org.apache.bval.jsr.metadata.MetadataSource
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/resources/META-INF/services/org.apache.bval.jsr.metadata.MetadataSource b/bval-jsr/src/main/resources/META-INF/services/org.apache.bval.jsr.metadata.MetadataSource
new file mode 100644
index 0000000..b394312
--- /dev/null
+++ b/bval-jsr/src/main/resources/META-INF/services/org.apache.bval.jsr.metadata.MetadataSource
@@ -0,0 +1,17 @@
+# 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.
+org.apache.bval.jsr.xml.ValidationMappingParser
\ No newline at end of file