package org.infernus.idea.checkstyle.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jetbrains.annotations.NotNull; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; /** * Entity resolver for CheckStyle DTDs. */ public class CheckStyleEntityResolver implements EntityResolver { /** * Logger for this class. */ private static final Log LOG = LogFactory.getLog( CheckStyleEntityResolver.class); private static final Map<DTDKey, String> DTD_MAP = new HashMap<>(); static { DTD_MAP.put(new DTDKey( "-//Puppy Crawl//DTD Check Configuration 1.0//EN", "http://www.puppycrawl.com/dtds/configuration_1_0.dtd"), "/dtd/configuration_1_0.dtd"); DTD_MAP.put(new DTDKey( "-//Puppy Crawl//DTD Check Configuration 1.1//EN", "http://www.puppycrawl.com/dtds/configuration_1_1.dtd"), "/dtd/configuration_1_1.dtd"); DTD_MAP.put(new DTDKey( "-//Puppy Crawl//DTD Check Configuration 1.2//EN", "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"), "/dtd/configuration_1_2.dtd"); DTD_MAP.put(new DTDKey( "-//Puppy Crawl//DTD Check Configuration 1.3//EN", "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"), "/dtd/configuration_1_3.dtd"); DTD_MAP.put(new DTDKey("-//Puppy Crawl//DTD Import Control 1.0//EN", "http://www.puppycrawl.com/dtds/import_control_1_0.dtd"), "/dtd/import_control_1_0.dtd"); DTD_MAP.put(new DTDKey("-//Puppy Crawl//DTD Import Control 1.1//EN", "http://www.puppycrawl.com/dtds/import_control_1_1.dtd"), "/dtd/import_control_1_1.dtd"); DTD_MAP.put(new DTDKey("-//Puppy Crawl//DTD Suppressions 1.0//EN", "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd"), "/dtd/suppressions_1_0.dtd"); DTD_MAP.put(new DTDKey("-//Puppy Crawl//DTD Suppressions 1.1//EN", "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd"), "/dtd/suppressions_1_0.dtd"); DTD_MAP.put(new DTDKey("-//Puppy Crawl//DTD Package Names 1.0//EN", "http://www.puppycrawl.com/dtds/packages_1_0.dtd"), "/dtd/packages_1_0.dtd"); } @Override public InputSource resolveEntity(final String publicId, final String systemId) throws SAXException, IOException { final String resource = DTD_MAP.get(new DTDKey(publicId, systemId)); if (resource != null) { final URL resourceUrl = getClass().getResource(resource); if (resourceUrl != null) { return new InputSource(resourceUrl.openStream()); } else { LOG.warn("Configured DTD cannot be found: " + resource); } } return null; } /** * A key class for a DTD. */ static class DTDKey { private final String publicId; private final String systemId; /** * Create a new key for the given public and system IDs. * * @param publicId the public ID. * @param systemId the system ID. */ DTDKey(@NotNull final String publicId, @NotNull final String systemId) { this.publicId = publicId; this.systemId = systemId; } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final DTDKey that = (DTDKey) o; if (!publicId.equals(that.publicId)) { return false; } if (!systemId.equals(that.systemId)) { return false; } return true; } @Override public int hashCode() { return 31 * publicId.hashCode() + systemId.hashCode(); } } }