001    package com.thaiopensource.relaxng.impl;
002    
003    import java.io.IOException;
004    
005    import org.relaxng.datatype.DatatypeLibraryFactory;
006    import org.relaxng.datatype.helpers.DatatypeLibraryLoader;
007    import org.xml.sax.ErrorHandler;
008    import org.xml.sax.SAXException;
009    import org.xml.sax.XMLReader;
010    
011    import com.oxygenxml.validate.nvdl.NvdlProperty;
012    import com.thaiopensource.relaxng.parse.BuildException;
013    import com.thaiopensource.relaxng.parse.ParseReceiver;
014    import com.thaiopensource.util.PropertyMap;
015    import com.thaiopensource.validate.IncorrectSchemaException;
016    import com.thaiopensource.validate.Schema;
017    import com.thaiopensource.validate.ValidateProperty;
018    import com.thaiopensource.validate.auto.SchemaFuture;
019    import com.thaiopensource.validate.auto.SchemaReceiver;
020    import com.thaiopensource.validate.nrl.NrlProperty;
021    import com.thaiopensource.validate.rng.RngProperty;
022    
023    public class SchemaReceiverImpl implements SchemaReceiver {
024      private final ParseReceiver parser;
025      private final PropertyMap properties;
026    
027      public SchemaReceiverImpl(ParseReceiver parser, PropertyMap properties) {
028        this.parser = parser;
029        this.properties = properties;
030      }
031    
032      public SchemaFuture installHandlers(XMLReader xr) throws SAXException {
033        final SchemaPatternBuilder pb = new SchemaPatternBuilder();
034        ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties);
035        DatatypeLibraryFactory dlf = RngProperty.DATATYPE_LIBRARY_FACTORY.get(properties);
036        if (dlf == null)
037          dlf = new DatatypeLibraryLoader();
038        final PatternFuture pf = SchemaBuilderImpl.installHandlers(parser, xr, eh, dlf, pb);
039        return new SchemaFuture() {
040          public Schema getSchema() throws IncorrectSchemaException, SAXException, IOException {
041            return SchemaReaderImpl.wrapPattern(pf.getPattern(
042                            properties.contains(NrlProperty.ATTRIBUTES_SCHEMA) ||
043                            properties.contains(NvdlProperty.ATTRIBUTES_SCHEMA)),
044                                                pb, properties);
045          }
046          public RuntimeException unwrapException(RuntimeException e) throws SAXException, IOException, IncorrectSchemaException {
047            if (e instanceof BuildException)
048              return SchemaBuilderImpl.unwrapBuildException((BuildException)e);
049            return e;
050          }
051        };
052      }
053    }