Ignore:
Timestamp:
2010-06-08T21:56:38+02:00 (14 years ago)
Author:
jttt
Message:

Validate tagging presets when they're added in Preferences dialog

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java

    r2676 r3321  
    1616import java.util.concurrent.BlockingQueue;
    1717
     18import javax.xml.parsers.SAXParser;
    1819import javax.xml.parsers.SAXParserFactory;
     20import javax.xml.transform.Source;
     21import javax.xml.validation.Schema;
     22import javax.xml.validation.SchemaFactory;
     23import javax.xml.validation.ValidatorHandler;
    1924
    2025import org.xml.sax.Attributes;
     26import org.xml.sax.ContentHandler;
    2127import org.xml.sax.InputSource;
    2228import org.xml.sax.Locator;
    2329import org.xml.sax.SAXException;
    2430import org.xml.sax.SAXParseException;
     31import org.xml.sax.XMLReader;
    2532import org.xml.sax.helpers.DefaultHandler;
     33import org.xml.sax.helpers.XMLFilterImpl;
    2634
    2735/**
     
    101109    }
    102110
     111    private class AddNamespaceFilter extends XMLFilterImpl {
     112
     113        private final String namespace;
     114
     115        public AddNamespaceFilter(String namespace) {
     116            this.namespace = namespace;
     117        }
     118
     119        @Override
     120        public void startElement (String uri, String localName, String qName, Attributes atts) throws SAXException {
     121            if ("".equals(uri)) {
     122                super.startElement(namespace, localName, qName, atts);
     123            } else {
     124                super.startElement(uri, localName, qName, atts);
     125            }
     126
     127        }
     128
     129    }
     130
    103131    private class Parser extends DefaultHandler {
    104132        Stack<Object> current = new Stack<Object>();
     
    271299    }
    272300
    273     public Iterable<Object> start(final Reader in) {
     301    private Iterable<Object> start(final Reader in, final ContentHandler contentHandler) {
    274302        new Thread("XML Reader"){
    275303            @Override public void run() {
    276304                try {
    277                     SAXParserFactory.newInstance().newSAXParser().parse(new InputSource(in), parser);
     305                    SAXParserFactory parserFactory = SAXParserFactory.newInstance();
     306                    parserFactory.setNamespaceAware(true);
     307                    SAXParser parser = parserFactory.newSAXParser();
     308                    XMLReader reader = parser.getXMLReader();
     309                    reader.setContentHandler(contentHandler);
     310                    reader.parse(new InputSource(in));
    278311                } catch (Exception e) {
    279312                    try {
     
    282315                    }
    283316                }
    284                 parser = null;
    285317                try {
    286318                    queue.put(EOS);
     
    290322        }.start();
    291323        return this;
     324    }
     325
     326    public Iterable<Object> start(final Reader in) {
     327        return start(in, parser);
     328    }
     329
     330    public Iterable<Object> startWithValidation(final Reader in, String namespace, Source schemaSource) throws SAXException {
     331        SchemaFactory factory =  SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
     332        Schema schema = factory.newSchema(schemaSource);
     333        ValidatorHandler validator = schema.newValidatorHandler();
     334        validator.setContentHandler(parser);
     335        validator.setErrorHandler(parser);
     336
     337        AddNamespaceFilter filter = new AddNamespaceFilter(namespace);
     338        filter.setContentHandler(validator);
     339
     340        return start(in, filter);
    292341    }
    293342
Note: See TracChangeset for help on using the changeset viewer.