AbstractValidatoreXSD.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */



package org.openspcoop2.utils.xml;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.slf4j.Logger;
import org.w3c.dom.Node;
import org.w3c.dom.ls.LSResourceResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;


/**
 * Classe utilizzata per effettuare una validazione con schema xsd di un messaggio.
 *
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public abstract class AbstractValidatoreXSD {


	/** StreamSource */
	private Schema schema;
	public Schema getSchema() {
		return this.schema;
	}
	
	
	
	/** ----------------- COSTRUTTORE SCHEMA -----------------
	
	/** 
	 * Costruttore
	 * 
	 * @param schema
	 */
	public AbstractValidatoreXSD(Schema schema)throws Exception{
		try{
			if(schema == null)
				throw new Exception("Schema is null?");
			this.schema = schema;
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (InputStream): "+e.getMessage(),e);
		}
	}
	
	
	
	
	/** ----------------- COSTRUTTORE INPUT STREAM ----------------- */
	
	private static final String FACTORY_DEFAULT = "FactoryDefault";
	
	/** 
	 * Costruttore InputStream
	 * 
	 * @param inputStream
	 */
	public AbstractValidatoreXSD(Logger log,InputStream inputStream)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,inputStream);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,InputStream inputStream)throws Exception{
		try{
			StreamSource streamSource = new StreamSource(inputStream);	
			this.initializeSchema(log,schemaFactory,null,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (InputStream): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,InputStream inputStream)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,inputStream);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,InputStream inputStream)throws Exception{
		try{
			StreamSource streamSource = new StreamSource(inputStream);	
			this.initializeSchema(log,schemaFactory,lsResourceResolver,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (InputStream): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,InputStream... inputStream)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,inputStream);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,InputStream... inputStream)throws Exception{
		try{
			StreamSource [] ss = new StreamSource[inputStream.length];
			for(int i=0; i<inputStream.length; i++){
				ss[i] = new StreamSource(inputStream[i]);
			}
			this.initializeSchema(log,schemaFactory,null,ss);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (InputStream): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,InputStream... inputStream)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,inputStream);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,InputStream... inputStream)throws Exception{
		try{
			StreamSource [] ss = new StreamSource[inputStream.length];
			for(int i=0; i<inputStream.length; i++){
				ss[i] = new StreamSource(inputStream[i]);
			}
			this.initializeSchema(log,schemaFactory,lsResourceResolver,ss);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (InputStream): "+e.getMessage(),e);
		}
	}
	
	
	
	/** ----------------- COSTRUTTORE FILE -----------------
	
	/**
	 * Costruttore File
	 * 
	 * @param file
	 */
	public AbstractValidatoreXSD(Logger log,File file)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,file);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,File file)throws Exception{
		try{
			StreamSource streamSource = new StreamSource(file);	
			this.initializeSchema(log,schemaFactory,null,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (File:"+file.getName()+"): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,File file)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,file);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,File file)throws Exception{
		try{
			StreamSource streamSource = new StreamSource(file);	
			this.initializeSchema(log,schemaFactory,lsResourceResolver,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (File:"+file.getName()+"): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,File... file)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,file);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,File... file)throws Exception{
		try{
			StreamSource [] ss = new StreamSource[file.length];
			for(int i=0; i<file.length; i++){
				ss[i] = new StreamSource(file[i]);
			}
			this.initializeSchema(log,schemaFactory,null,ss);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Files): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,File... file)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,file);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,File... file)throws Exception{
		try{
			StreamSource [] ss = new StreamSource[file.length];
			for(int i=0; i<file.length; i++){
				ss[i] = new StreamSource(file[i]);
			}
			this.initializeSchema(log,schemaFactory,lsResourceResolver,ss);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Files): "+e.getMessage(),e);
		}
	}
	
	
	
	/** ----------------- COSTRUTTORE URL -----------------
	
	/**
	 * Costruttore url
	 * 
	 * @param url
	 */
	public AbstractValidatoreXSD(Logger log,String url)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,url);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,String url)throws Exception{
		try{
			StreamSource streamSource = new StreamSource(url);	
			this.initializeSchema(log,schemaFactory,null,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (URL:"+url+"): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,String url)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,url);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,String url)throws Exception{
		try{
			StreamSource streamSource = new StreamSource(url);	
			this.initializeSchema(log,schemaFactory,lsResourceResolver,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (URL:"+url+"): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,String... url)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,url);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,String... url)throws Exception{
		try{
			StreamSource [] ss = new StreamSource[url.length];
			for(int i=0; i<url.length; i++){
				ss[i] = new StreamSource(url[i]);
			}
			this.initializeSchema(log,schemaFactory,null,ss);
		}catch(Exception e){
			StringBuilder sb = new StringBuilder();
			if(url!=null) {
				for (String u : url) {
					if(sb.length()>0) {
						sb.append(", ");
					}
					sb.append(u);
				}
			}
			throw new Exception("Riscontrato errore durante la costruzione dello schema (URL:"+sb.toString()+"): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,String... url)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,url);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,String... url)throws Exception{
		try{
			StreamSource [] ss = new StreamSource[url.length];
			for(int i=0; i<url.length; i++){
				ss[i] = new StreamSource(url[i]);
			}
			this.initializeSchema(log,schemaFactory,lsResourceResolver,ss);
		}catch(Exception e){
			StringBuilder sb = new StringBuilder();
			if(url!=null) {
				for (String u : url) {
					if(sb.length()>0) {
						sb.append(", ");
					}
					sb.append(u);
				}
			}
			throw new Exception("Riscontrato errore durante la costruzione dello schema (URL:"+sb.toString()+"): "+e.getMessage(),e);
		}
	}
	
	
	
	
	
	
	
	
	/** ----------------- COSTRUTTORE NODE -----------------
	
	/**
	 * Costruttore node
	 * 
	 * @param schema
	 */
	public AbstractValidatoreXSD(Logger log,Node schema)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,schema);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,Node schema)throws Exception{
		try{
			DOMSource streamSource = new DOMSource(schema);	
			this.initializeSchema(log,schemaFactory,null,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Node): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,Node schema)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,schema);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,Node schema)throws Exception{
		try{
			DOMSource streamSource = new DOMSource(schema);	
			this.initializeSchema(log,schemaFactory,lsResourceResolver,streamSource);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Node): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,Node... schema)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,schema);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,Node... schema)throws Exception{
		try{
			DOMSource [] ss = new DOMSource[schema.length];
			for(int i=0; i<schema.length; i++){
				ss[i] = new DOMSource(schema[i]);
			}
			this.initializeSchema(log,schemaFactory,null,ss);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Node): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,Node... schema)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,schema);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,Node... schema)throws Exception{
		try{
			DOMSource [] ss = new DOMSource[schema.length];
			for(int i=0; i<schema.length; i++){
				ss[i] = new DOMSource(schema[i]);
			}
			this.initializeSchema(log,schemaFactory,lsResourceResolver,ss);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Node): "+e.getMessage(),e);
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/** ----------------- COSTRUTTORE SOURCE GENERICO -----------------
	
	/**
	 * Costruttore source
	 * 
	 * @param source
	 */
	public AbstractValidatoreXSD(Logger log,Source source)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,source);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,Source source)throws Exception{
		try{
			this.initializeSchema(log,schemaFactory,null,source);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Source): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,Source source)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,source);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,Source source)throws Exception{
		try{
			this.initializeSchema(log,schemaFactory,lsResourceResolver,source);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Source): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,Source... source)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,source);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,Source... source)throws Exception{
		try{
			this.initializeSchema(log,schemaFactory,null,source);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Source): "+e.getMessage(),e);
		}
	}
	
	public AbstractValidatoreXSD(Logger log,LSResourceResolver lsResourceResolver,Source... source)throws Exception{
		this(log,AbstractValidatoreXSD.FACTORY_DEFAULT,lsResourceResolver,source);
	}
	public AbstractValidatoreXSD(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,Source... source)throws Exception{
		try{
			this.initializeSchema(log,schemaFactory,lsResourceResolver,source);
		}catch(Exception e){
			throw new Exception("Riscontrato errore durante la costruzione dello schema (Source): "+e.getMessage(),e);
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/** ----------------- INIT SCHEMA ----------------- **/
	
	public abstract AbstractXMLUtils getXMLUtils();
	
	/**
	 * Metodo che si occupa di inizializzare lo schema per la validazione.
	 *
	 * 
	 */
	private void initializeSchema(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,Source streamSource) throws Exception{
		try{
			
			// La gestione dello schemaFactory e' servito per il seguente motivo:
			// UndeclaredPrefix: Cannot resolve 'messaggioSII:xxxxMessaggioSIIType' as a QName: the prefix 'messaggioSII' is not declared.
			// After some debugging, I've found out that this is a bug of the JAXP api's built in to the JDK.
			// You can fix it by making sure that you use the Xerces version of the SchemaFactory, and not the JDK internal one. 
			// The algorithm for choosing a SchemaFactory is explained at http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newInstance(java.lang.String).
			// It comes down to setting the System property "javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema" to the value "org.apache.xerces.jaxp.validation.XMLSchemaFactory".
			// Note that just adding Xerces to your classpath won't fix this, for reasons explained at http://xerces.apache.org/xerces2-j/faq-general.html#faq-4
			
			SchemaFactory factory = null;
			if(schemaFactory!=null && !AbstractValidatoreXSD.FACTORY_DEFAULT.equals(schemaFactory)){
				factory =  SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI,
						schemaFactory, this.getClass().getClassLoader());
				if(this.getXMLUtils().isDisabledDTDs()) {
					factory.setFeature(this.getXMLUtils().getFeatures_disallow_doctype_decl(), true);
				}
			}
			else{
				factory = this.getXMLUtils().getSchemaFactory();
			}
			
//			String oldSchemaFactorySetup = null;
//			String propertySystem = "javax.xml.validation.SchemaFactory:"+XMLConstants.W3C_XML_SCHEMA_NS_URI;
//			if(schemaFactory!=null && !AbstractValidatoreXSD.FACTORY_DEFAULT.equals(schemaFactory)){
//				oldSchemaFactorySetup = System.getenv(propertySystem);
//				if(oldSchemaFactorySetup==null){
//					oldSchemaFactorySetup = System.getProperty(propertySystem);
//					if(oldSchemaFactorySetup==null){
//						oldSchemaFactorySetup = "";
//					}
//				}
//				System.setProperty(propertySystem, schemaFactory);
//			}
//			SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
//			if(this.getXMLUtils().isDisabledDTDs()) {
//				factory.setFeature(this.getXMLUtils().getFeatures_disallow_doctype_decl(), true);
//			}
			log.info("SchemaFactory["+factory.getClass().getName()+"]");
			if(lsResourceResolver!=null){
				factory.setResourceResolver(lsResourceResolver);
			}
			this.schema = factory.newSchema(streamSource);
//			if(schemaFactory!=null && !AbstractValidatoreXSD.FACTORY_DEFAULT.equals(schemaFactory) && oldSchemaFactorySetup!=null){
//				log.debug("Ripristino oldSchemaFactory ["+oldSchemaFactorySetup+"]");
//				System.setProperty(propertySystem, oldSchemaFactorySetup);
//			}
		}catch (Exception e) {
			throw new Exception("Riscontrato errore durante l'inizializzazione dello schema: "+e.getMessage(),e);
		}
	}
	private void initializeSchema(Logger log,String schemaFactory,LSResourceResolver lsResourceResolver,Source[] streamSource) throws Exception{
		try{
			
			// La gestione dello schemaFactory e' servito per il seguente motivo:
			// UndeclaredPrefix: Cannot resolve 'messaggioSII:xxxxMessaggioSIIType' as a QName: the prefix 'messaggioSII' is not declared.
			// After some debugging, I've found out that this is a bug of the JAXP api's built in to the JDK.
			// You can fix it by making sure that you use the Xerces version of the SchemaFactory, and not the JDK internal one. 
			// The algorithm for choosing a SchemaFactory is explained at http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newInstance(java.lang.String).
			// It comes down to setting the System property "javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema" to the value "org.apache.xerces.jaxp.validation.XMLSchemaFactory".
			// Note that just adding Xerces to your classpath won't fix this, for reasons explained at http://xerces.apache.org/xerces2-j/faq-general.html#faq-4
			
			SchemaFactory factory = null;
			if(schemaFactory!=null && !AbstractValidatoreXSD.FACTORY_DEFAULT.equals(schemaFactory)){
				factory =  SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI,
						schemaFactory, this.getClass().getClassLoader());
				if(this.getXMLUtils().isDisabledDTDs()) {
					factory.setFeature(this.getXMLUtils().getFeatures_disallow_doctype_decl(), true);
				}
			}
			else{
				factory = this.getXMLUtils().getSchemaFactory();
			}
			
//			String oldSchemaFactorySetup = null;
//			String propertySystem = "javax.xml.validation.SchemaFactory:"+XMLConstants.W3C_XML_SCHEMA_NS_URI;
//			if(schemaFactory!=null && !AbstractValidatoreXSD.FACTORY_DEFAULT.equals(schemaFactory)){
//				oldSchemaFactorySetup = System.getenv(propertySystem);
//				if(oldSchemaFactorySetup==null){
//					oldSchemaFactorySetup = System.getProperty(propertySystem);
//					if(oldSchemaFactorySetup==null){
//						oldSchemaFactorySetup = "";
//					}
//				}
//				System.setProperty(propertySystem, schemaFactory);
//			}
//			SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
//			if(this.getXMLUtils().isDisabledDTDs()) {
//				factory.setFeature(this.getXMLUtils().getFeatures_disallow_doctype_decl(), true);
//			}
			log.info("SchemaFactory["+factory.getClass().getName()+"]");
			if(lsResourceResolver!=null){
				factory.setResourceResolver(lsResourceResolver);
			}
			this.schema = factory.newSchema(streamSource);
//			if(schemaFactory!=null && !AbstractValidatoreXSD.FACTORY_DEFAULT.equals(schemaFactory) && oldSchemaFactorySetup!=null){
//				log.debug("Ripristino oldSchemaFactory ["+oldSchemaFactorySetup+"]");
//				System.setProperty(propertySystem, oldSchemaFactorySetup);
//			}
		}catch (Exception e) {
			throw new Exception("Riscontrato errore durante l'inizializzazione dello schema: "+e.getMessage(),e);
		}
	}
	
	
	
	
	
	/** ----------------- VALIDAZIONI -----------------
	
	
	/**
	 * Metodo che effettua la validazione xsd. 
	 *
	 * @param nodeXML Node
	 */
	public void valida(Node nodeXML) throws Exception{
		valida(new DOMSourceFix(nodeXML));
	}
	public void valida(Node nodeXML,ErrorHandler errorHandler) throws Exception{
		valida(new DOMSourceFix(nodeXML),errorHandler);
	}
	
	/**
	 * Metodo che effettua la validazione xsd. 
	 *
	 * @param nodeXML Node
	 */
	public void valida(Node nodeXML,boolean streamSource) throws Exception{
		this.valida(nodeXML,streamSource,null);
	}
	public abstract byte[] getAsByte(Node nodeXML) throws XMLException;
	public void valida(Node nodeXML,boolean streamSource,ErrorHandler errorHandler) throws Exception{
		if(streamSource){
			// Risolve il problema di validare gli attributi
			ByteArrayInputStream bin = new ByteArrayInputStream(this.getAsByte(nodeXML));
			valida(new StreamSource(bin),errorHandler);
		}else{
			valida(nodeXML,errorHandler);
		}
	}
	
	/**
	 * Metodo che effettua la validazione xsd. 
	 *
	 * @param inputStreamXML Input Stream di un contenuto xml
	 */
	public void valida(InputStream inputStreamXML) throws Exception{
		valida(new StreamSource(inputStreamXML));
	}
	public void valida(InputStream inputStreamXML,ErrorHandler errorHandler) throws Exception{
		valida(new StreamSource(inputStreamXML),errorHandler);
	}
	
	/**
	 * Metodo che effettua la validazione xsd. 
	 *
	 * @param fileXML File xml
	 */
	public void valida(File fileXML) throws Exception{
		valida(new StreamSource(fileXML));
	}
	public void valida(File fileXML,ErrorHandler errorHandler) throws Exception{
		valida(new StreamSource(fileXML),errorHandler);
	}
	
	/**
	 * Metodo che effettua la validazione xsd. 
	 *
	 * @param urlXML URL di un file xml
	 */
	public void valida(String urlXML) throws Exception{
		valida(new StreamSource(urlXML));
	}
	public void valida(String urlXML,ErrorHandler errorHandler) throws Exception{
		valida(new StreamSource(urlXML),errorHandler);
	}
	
	/**
	 * Metodo che effettua la validazione xsd. 
	 *
	 * @param source Sorgente da validare
	 */
	public void valida(Source source) throws Exception{
		this.valida(source, null);
	}
	public void valida(Source source,ErrorHandler errorHandler) throws Exception{
		Validator validator  = this.schema.newValidator();
		try {
			if(errorHandler!=null){
				validator.setErrorHandler(errorHandler);
			}
			validator.validate(source);
		} catch (SAXException e) {
			// instance document is invalid!
			throw e;
		}
	}
	
	
}