# CustomResourceResolver.java

    package org.thewonderlemming.c4plantuml.graphml.validation;

    import java.util.Optional;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.w3c.dom.ls.LSInput;
    import org.w3c.dom.ls.LSResourceResolver;

    /**
     * A DOM {@link LSResourceResolver} implementation to avoid having external calls to retrieve GraphML related XSD files.
     *
     * @author thewonderlemming
     *
     */
    public class CustomResourceResolver implements LSResourceResolver {

        private static final Logger LOGGER = LoggerFactory.getLogger(CustomResourceResolver.class);

        /**
         * {@inheritDoc}
         * <p>
         * Returns a {@link CustomLSInput} with the managed {@link GraphMLXsd} if found, or null, else.
         */
        @Override
        public LSInput resolveResource(final String type, final String namespaceURI, final String publicId,
            final String systemId, final String baseURI) {

            final Optional<GraphMLXsd> resolvedXsd = GraphMLXsd.resolveXsd(systemId, namespaceURI);

            if (!resolvedXsd.isPresent()) {

                LOGGER
                    .warn(
                        "Could not resolve locally the resource matching the following arguments: "
                            + "type='{}', "
                            + "namespaceURI='{}', "
                            + "publicId='{}', "
                            + "systemId='{}', "
                            + "baseURI='{}'",
                        type,
                        namespaceURI,
                        publicId,
                        systemId,
                        baseURI);

                return null;
            }

            return CustomLSInput
                .newBuilder()
                    .withBaseURI(baseURI)
                    .withPublicId(publicId)
                    .withResourceFilename(resolvedXsd.get().getResourceFilename())
                    .withSystemId(systemId)
                    .build();
        }
    }