1 /* 2 * Copyright 2005-2011 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.springframework.xml.validation; 18 19 import java.io.IOException; 20 import javax.xml.validation.Validator; 21 22 import org.springframework.core.io.Resource; 23 import org.springframework.util.Assert; 24 import org.springframework.xml.JaxpVersion; 25 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 29 /** 30 * Factory for {@link XmlValidator} objects, being aware of JAXP 1.3 {@link Validator}s, and JAXP 1.0 parsing 31 * capababilities. Mainly for internal use within the framework. 32 * <p/> 33 * The goal of this class is to avoid runtime dependencies on JAXP 1.3 by using the best validation implementation that 34 * is available. Prefers JAXP 1.3 {@link XmlValidator} implementations to a custom, SAX-based implementation. 35 * 36 * @author Arjen Poutsma 37 * @see XmlValidator 38 * @since 1.0.0 39 */ 40 public abstract class XmlValidatorFactory { 41 42 private static final Log logger = LogFactory.getLog(XmlValidatorFactory.class); 43 44 /** Constant that defines a W3C XML Schema. */ 45 public static final String SCHEMA_W3C_XML = "http://www.w3.org/2001/XMLSchema"; 46 47 /** Constant that defines a RELAX NG Schema. */ 48 public static final String SCHEMA_RELAX_NG = "http://relaxng.org/ns/structure/1.0"; 49 50 /** 51 * Create a {@link XmlValidator} with the given schema resource and schema language type. The schema language must 52 * be one of the <code>SCHEMA_XXX</code> constants. 53 * 54 * @param schemaResource a resource that locates the schema to validate against 55 * @param schemaLanguage the language of the schema 56 * @return a validator 57 * @throws IOException if the schema resource cannot be read 58 * @throws IllegalArgumentException if the schema language is not supported 59 * @throws IllegalStateException if JAXP 1.0 cannot be located 60 * @throws XmlValidationException if a <code>XmlValidator</code> cannot be created 61 * @see #SCHEMA_RELAX_NG 62 * @see #SCHEMA_W3C_XML 63 */ 64 public static XmlValidator createValidator(Resource schemaResource, String schemaLanguage) throws IOException { 65 return createValidator(new Resource[]{schemaResource}, schemaLanguage); 66 } 67 68 /** 69 * Create a {@link XmlValidator} with the given schema resources and schema language type. The schema language must 70 * be one of the <code>SCHEMA_XXX</code> constants. 71 * 72 * @param schemaResources an array of resource that locate the schemas to validate against 73 * @param schemaLanguage the language of the schemas 74 * @return a validator 75 * @throws IOException if the schema resource cannot be read 76 * @throws IllegalArgumentException if the schema language is not supported 77 * @throws IllegalStateException if JAXP 1.0 cannot be located 78 * @throws XmlValidationException if a <code>XmlValidator</code> cannot be created 79 * @see #SCHEMA_RELAX_NG 80 * @see #SCHEMA_W3C_XML 81 */ 82 public static XmlValidator createValidator(Resource[] schemaResources, String schemaLanguage) throws IOException { 83 Assert.notEmpty(schemaResources, "No resources given"); 84 Assert.hasLength(schemaLanguage, "No schema language provided"); 85 Assert.isTrue(SCHEMA_W3C_XML.equals(schemaLanguage) || SCHEMA_RELAX_NG.equals(schemaLanguage), 86 "Invalid schema language: " + schemaLanguage); 87 for (Resource schemaResource : schemaResources) { 88 Assert.isTrue(schemaResource.exists(), "schema [" + schemaResource + "] does not exist"); 89 } 90 if (JaxpVersion.getJaxpVersion() >= JaxpVersion.JAXP_13) { 91 logger.trace("Creating JAXP 1.3 XmlValidator"); 92 return Jaxp13ValidatorFactory.createValidator(schemaResources, schemaLanguage); 93 } 94 else { 95 throw new IllegalStateException("Could not locate JAXP 1.3."); 96 } 97 } 98 99 }