private void storeSchemaLocations(final String uri, final Attributes atts) throws SAXException {
        if (schemaValidation && schemaLocations == null && xmlSchemaCache != null) {
            schemaLocations = new TreeMap<>();

            String schemaLocation = atts.getValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, SCHEMA_LOCATION);
            if (schemaLocation != null) {
                schemaLocation = MULTI_SPACE_PATTERN.matcher(schemaLocation).replaceAll(SPACE);
                schemaLocation = schemaLocation.trim();
                final String[] locations = schemaLocation.split(SPACE);
                for (int i = 0; i < locations.length; i += 2) {
                    if (i + 1 < locations.length) {
                        final String namespace = locations[i];
                        final String schema = locations[i + 1];
                        schemaLocations.put(namespace, schema);
                    }
                }
            }

            // Make sure all of the schema locations are valid.
            if (validateSchemaLocations(uri, schemaLocations, schemaConstraint)) {
                // Locations are valid so get a validator.
                validator = getValidator();
            }
        }
    }
Sends characters to the current validator handler.

@param ch     Characters.
@param start  Start of char buffer.
@param length Number of chars to send.
@throws SAXException Not thrown.
@see stroom.pipeline.filter.AbstractXMLFilter#characters(char[],
int, int)
stroom-pipeline/src/main/java/stroom/pipeline/filter/SchemaFilter.java