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