/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.xml; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Platform; import org.eclipse.wst.xml.core.internal.XMLCorePlugin; import org.jboss.tools.common.core.CommonCorePlugin; import org.jboss.tools.common.util.HttpUtil; import org.osgi.framework.Bundle; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * @author igels */ public class DtdResolver implements EntityResolver { static Set unfound = new HashSet(); public InputStream getInputStream(String publicId, String systemId) throws SAXException, IOException { String location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolvePublic(publicId, systemId); if(location == null) { location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolveSystem(systemId); } if(location == null) { location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolveURI(systemId); } if(location == null) { if(systemId != null && systemId.startsWith("file:") && systemId.endsWith(".xsd")) { //$NON-NLS-1$ //$NON-NLS-2$ int i = systemId.replace('\\', '/').lastIndexOf('/'); String systemId2 = systemId.substring(i + 1); location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolveURI(systemId2); } } if((location == null || location.startsWith("http:")) && systemId != null) { //$NON-NLS-1$ Bundle b = Platform.getBundle("org.eclipse.jst.standard.schemas"); //$NON-NLS-1$ if(b != null) { int q = systemId.lastIndexOf("/"); //$NON-NLS-1$ String s = systemId.substring(q + 1); URL u = b.getEntry("/dtdsAndSchemas/" + s); //$NON-NLS-1$ try { if(u != null) { u = FileLocator.resolve(u); } } catch (IOException ee) { u = null; } if(u != null) { location = u.toString(); } } } if(location == null) { if(systemId != null && !unfound.contains(systemId)) { unfound.add(systemId); // CommonCorePlugin.getPluginLog().logInfo("Cannot find locally: " //$NON-NLS-1$ // + "Public ID " + publicId //$NON-NLS-1$ // + " System ID " + systemId); //$NON-NLS-1$ } } if(location!=null) { try { URL url = new URL(location); File file = new File(url.getFile()); if(file.isFile()) { return new FileInputStream(file); } else if("jar".equals(url.getProtocol())) { //$NON-NLS-1$ return url.openStream(); } } catch(FileNotFoundException e) { CommonCorePlugin.getPluginLog().logError(e); } } String resourceType = null; if(systemId!=null) { if(systemId.toLowerCase().endsWith(".dtd")) { //$NON-NLS-1$ resourceType = "DTD"; //$NON-NLS-1$ } else if(systemId.toLowerCase().endsWith(".xsd")) { //$NON-NLS-1$ resourceType = "XSD"; //$NON-NLS-1$ } else if(systemId.toLowerCase().endsWith(".ent")) { //$NON-NLS-1$ resourceType = "ENT"; //$NON-NLS-1$ } } InputStream is = null; if(resourceType!=null) { // this deactivates DTD and XSD try { URL url = new URL(systemId); if("http".equals(url.getProtocol())) { //$NON-NLS-1$ is = HttpUtil.getInputStreamFromUrlByGetMethod(systemId); } } catch (MalformedURLException e) { CommonCorePlugin.getPluginLog().logError(e); } catch (IOException e) { CommonCorePlugin.getPluginLog().logError(e); } } return is; } public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { InputStream is = getInputStream(publicId, systemId); if(is!=null) { return new InputSource(is); } return null; } }