javaxmldatabasexsd-validationxmlcatalog

How to match catalog.xml entities with database?


I have to validate some xml files with .xsd files, which are listed in catalog.xml, but they are in database. So i need resolver, which will match systemId from catalog.xml with .xsd file stored as blob in database. I found that XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) method doing this, but I can't find how parser uses this method, so I'm not sure how to override it to do it propertly. I thought that it returns XMLInputStram which contains .xsd file in Stream, but it's not true because of "leaving resolution of the entity and opening of the input stream up to the caller", according to XMLInputSource documentation.

So my question is - how to map entities from catalog.xml with .xsd files stored in database?

I really hope that I explained problem clearly, but I know that my english is really poor - so feel free to ask for more details or better explaation.

Greetings, Rzysia


Solution

  • Ok, i found solution - as I thought, method XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) shoud return XMLInputSource with setted my own InputStream containing speciefied xsd schema. My version of this overrided class:

    public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)
            throws XNIException, IOException {
    
        String resolvedId = resolveIdentifier(resourceIdentifier);
    
        if (resolvedId != null) {
            XMLInputSource xmlis = new XMLInputSource(resourceIdentifier.getPublicId(),
                    resolvedId,
                    resourceIdentifier.getBaseSystemId());
    
            try {
                InputStream is = getXSDFromDb(resourceIdentifier.getLiteralSystemId());                
                xmlis.setByteStream(is);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
    
            return xmlis;
        }
        return null;