Невозможно найти XSD с помощью include - PullRequest
0 голосов
/ 27 февраля 2019

Мой проект работал нормально на Java 6, пока мы не обновили его до Java 8. Когда я пытаюсь загрузить ресурс, я получаю ошибку "Неожиданная проблема: java.lang.RuntimeException: java.io.FileNotFoundException: dynamicFeature.xsd ". Это структура моих XSD.

-- /saa/schemas
   - ISO_191_Schmemas
       -- gml.xsd
       -- dynamicFeature.xsd
SAA-Features.xsd
SAA-Message.xsd

Вот мой gml.xsd с включенным dynamicFeature.xsd.

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.0.0">
  <xsd:annotation>
    <xsd:appinfo source="urn:opengis:specification:gml:schema-xsd:gml:v3.0.0">gml.xsd</xsd:appinfo>
    <xsd:documentation>
            Top level GML schema
        </xsd:documentation>
  </xsd:annotation>
  <!-- ====================================================================== -->
  <xsd:include schemaLocation="dynamicFeature.xsd"/>
  <xsd:include schemaLocation="topology.xsd"/>
  <xsd:include schemaLocation="coverage.xsd"/>
  <xsd:include schemaLocation="coordinateReferenceSystems.xsd"/>
  <xsd:include schemaLocation="observation.xsd"/>
  <xsd:include schemaLocation="defaultStyle.xsd"/>
  <!-- ====================================================================== -->
</xsd:schema

Этомой код ResourceResolver, который работал нормально с Java 6, но после того, как мы обновились до Java 8, мы получаем ошибку, из-за которой не удается найти dynamicFeature.xsd, включенный в gml.xsd.Также найдите список Schemalocations с определенной только схемой верхнего уровня.Каждый раз код терпит неудачу в операторе if *** if (schemaName.equals (андидат.getSchema ())) ****, поскольку в местоположениях схемы определены только имена схем верхнего уровня, и поэтому он никогда не достигает точки findResource, которой я являюсьне удалось выяснить, как это работало ранее.

public static final String ROOT = "saa/schemas/";

    public static final SchemaLocation SCHEMA_SAA_MESSAGE = new SchemaLocation("urn:us:gov:dot:faa:aim:saa", "SAA-Message.xsd");
    public static final SchemaLocation SCHEMA_SAA_FEATURE = new SchemaLocation("", "SAA-Features.xsd");
    public static final List<SchemaLocation> SAA_SCHEMAS;

        static {
            List<SchemaLocation> schemas = new ArrayList<SchemaLocation>();

            schemas.add(SCHEMA_SAA_FEATURES);
            schemas.add(SCHEMA_SAA_MESSAGE);




            SAA_SCHEMAS = schemas;
        }

Код EntityResolver:

import org.xml.sax.ext.EntityResolver2;

    public class SAAEntityResolver implements EntityResolver2 {

        private static final Log LOG = LogFactory.getLog(SAAEntityResolver.class);

        private EntityResolver2 delegate;

        private List<SchemaLocation> schemaLocations;

        /**
         * Constructs a new xml entity resolver specifying a search path within the classpath.
         * <p>

        public SAAEntityResolver(List<SchemaLocation> searchPath, EntityResolver2 delegate) {
            this.delegate = delegate;
            this.schemaLocations = searchPath;
        }

        /* (non-Javadoc)
         * 
         * Created on Feb 9, 2010 by rcracel
         * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String)
         */
        @Override
        public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {

            InputSource result = null;
            String schemaName = systemId;

            if (systemId == null && publicId == null) {
                LOG.error("Cannot resolve schema, both system and public ids are null");
            } else {
                if (schemaName != null) {
                    if (schemaName.contains("/")) {
                        schemaName = schemaName.substring(schemaName.lastIndexOf("/") + 1);
                    }

                    for (int index = 0; index < **schemaLocations**.size() && result == null; index++) {
                        SchemaLocation candidate = schemaLocations.get(index);
                        if (schemaName.equals(candidate.getSchema())) {
                            URL resource = ResourceUtils.findResource(candidate.getAbsolutePath());
                            InputStream stream = resource.openStream();
                            if (stream != null) {
                                result = new InputSource(stream);
                                result.setPublicId(publicId);
                                result.setSystemId(resource.toString());
                            }
                        }
                    }
                } else if (publicId != null) {
                    for (int index = 0; index < schemaLocations.size() && result == null; index++) {
                        SchemaLocation candidate = schemaLocations.get(index);
                        if (publicId.equals(candidate.getPublicId())) {
                            URL resource = ResourceUtils.findResource(candidate.getAbsolutePath());
                            InputStream stream = resource.openStream();
                            if (stream != null) {
                                result = new InputSource(stream);
                                result.setPublicId(publicId);
                                result.setSystemId(resource.toString());
                            }
                        }
                    }
                }
            }

            if (result == null && delegate != null) {
                result = delegate.resolveEntity(publicId, systemId);
            }
            return result;
        }


     * @see org.xml.sax.ext.EntityResolver2#resolveEntity(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
     */
    @Override
    public InputSource resolveEntity(String name, String publicId, String baseURI, String systemId) throws SAXException, IOException {
        LOG.error("name" + name);
        LOG.error("publicId"+ publicId);
        LOG.error("baseURI" + baseURI);
        LOG.error("systemID" + systemId);
        if (LOG.isDebugEnabled())
            LOG.debug(String.format("*************** resolveEntity(\"%s\", \"%s\", \"%s\", \"%s\");", name, publicId, baseURI, systemId));
        return resolveEntity(publicId, systemId);
    }

Вот код ResouceUtils с методом findResource:

public static URL findResource(String path) {
    LOG.info("inside ResourceUtils -> findResource method path value"+ path);
   URL resource = ClassLoader.getSystemResource(path);
    LOG.info("ResourceUtils URL1" + resource);

    if (resource == null) {
        LOG.info("resource null");
        resource = ResourceUtils.class.getResource(path);
        LOG.info("ResourceUtils URL2" + resource);
    }

    return resource;
}

Я на некоторое время застрял с этой ошибкой и был бы очень признателен, если бы кто-нибудь мог помочь мне разобраться с этой ошибкой.Я могу предоставить любую другую информацию, которая отсутствует в посте.

Спасибо

...