001    package com.thaiopensource.validate;
002    
003    import java.util.Enumeration;
004    
005    import javax.xml.transform.sax.SAXTransformerFactory;
006    
007    import org.apache.xalan.processor.TransformerFactoryImpl;
008    
009    import com.thaiopensource.util.Service;
010    /**
011     * A SchemaReaderFactory that automatically discovers SchemaReader implementations.
012     * For a SchemeaReader implementation to be discoverable by this class, it must have
013     * a factory class with a no-argument constructor implementing SchemaReaderFactory,
014     * and the fully-qualified name of this factory class must be listed in the file
015     * <code>META-INF/services/com.thaiopensource.validate.SchemaReaderFactory</code>.
016     */
017    public class SchemaReaderLoader implements SchemaReaderFactory {
018      private final Service service = new Service(SchemaReaderFactory.class);
019      public SchemaReader createSchemaReader(String namespaceUri) {
020        for (Enumeration en = service.getProviders(); en.hasMoreElements();) {
021          SchemaReaderFactory srf = (SchemaReaderFactory)en.nextElement();
022          SchemaReader sr = srf.createSchemaReader(namespaceUri);
023          if (sr != null)
024            return sr;
025        }
026        return null;
027      }
028    
029      public Option getOption(String uri) {
030        for (Enumeration en = service.getProviders(); en.hasMoreElements();) {
031          SchemaReaderFactory srf = (SchemaReaderFactory)en.nextElement();
032          Option option = srf.getOption(uri);
033          if (option != null)
034            return option;
035        }
036        return null;
037      }
038      
039      // XXX this does not do proper discovery
040      public SAXTransformerFactory createSAXTransformerFactory() {
041        return new TransformerFactoryImpl();
042      }
043    }