/*******************************************************************************
* Copyright (c) 2007-2012 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.test.util;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;
import org.eclipse.core.runtime.FileLocator;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* @author valera
*/
public class XMLEntityResolver implements EntityResolver {
private static final Properties publicEntities = new Properties();
private static final Properties systemEntities = new Properties();
public static void registerPublicEntity(String publicId, String url) {
publicEntities.setProperty(publicId, url);
}
public static void registerPublicEntity(String publicId, Class<?> loader, String resourceName) throws IOException {
URL url = resolve(loader, resourceName);
if(url != null) {
registerPublicEntity(publicId, url.toString());
}
}
public static void registerSystemEntity(String systemId, String url) {
systemEntities.setProperty(systemId, url);
}
public static void registerSystemEntity(String systemId, Class<?> loader, String resourceName) throws IOException {
URL url = resolve(loader, resourceName);
if(url != null) {
registerSystemEntity(systemId, url.toString());
}
}
static URL resolve(Class<?> loader, String resourceName) throws IOException {
URL url = loader.getResource(resourceName);
return (url == null) ? null : FileLocator.resolve(url);
}
public static XMLEntityResolver getInstance() {
return new XMLEntityResolver();
}
boolean deactivate = true;
private XMLEntityResolver() {}
public void setDeactivate(boolean b) {
deactivate = b;
}
public boolean isResolved(String publicId, String systemId) {
if (publicId != null) {
String url = publicEntities.getProperty(publicId);
if (url != null) {
return true;
}
} else if (systemId != null) {
String url = systemEntities.getProperty(systemId);
if (url != null) {
return true;
}
}
return false;
}
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, java.io.IOException {
InputSource source = null;
boolean ok = false;
if (publicId != null) {
String url = publicEntities.getProperty(publicId);
if (url != null) {
source = new InputSource(url);
source.setPublicId(publicId);
ok = true;
}
}
if (!ok && systemId != null) {
String url = systemEntities.getProperty(systemId);
if (url != null) {
source = new InputSource(url);
source.setSystemId(systemId);
}
}
if(deactivate && (systemId != null) && (source == null) && (systemId.toLowerCase().endsWith(".dtd"))) { // this deactivates DTD //$NON-NLS-1$
source = new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes())); //$NON-NLS-1$
}
return source;
}
}