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 <[email protected]> Authored: Fri Mar 23 11:26:22 2018 -0500 Committer: Matt Benson <[email protected]> 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
