blob: c50dfb592de575d24d5d273a681a814fdb0f5b5d [file] [log] [blame]
/**
* Copyright (c) 2009 Borland Software Corp.
*
* All rights reserved. This program and the accompanying materials
* are 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.xpand;
import java.io.IOException;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class EPackageRegistryBasedURIResourceMap extends HashMap<URI, Resource> {
private static final long serialVersionUID = -3716798352459745813L;
private URIConverter uriConverter;
private SAXParser parser;
public EPackageRegistryBasedURIResourceMap(URIConverter uriConverter) {
this.uriConverter = uriConverter;
}
@Override
public Resource get(Object key) {
if (containsKey(key)) {
return super.get(key);
}
if (key instanceof URI) {
initializePlatformPluginToRegistryMapEntry((URI) key);
}
return super.get(key);
}
private void initializePlatformPluginToRegistryMapEntry(URI uri) {
if (!uri.isPlatformPlugin()) {
return;
}
try {
Handler handler = new Handler();
try {
getParser().parse(new InputSource(uriConverter.createInputStream(uri)), handler);
} catch (SAXException e) {
if (handler.getNsURI() != null && EPackage.Registry.INSTANCE.getEPackage(handler.getNsURI()) != null) {
put(uri, EPackage.Registry.INSTANCE.getEPackage(handler.getNsURI()).eResource());
}
}
} catch (IOException e) {
/* Skipping */
} catch (ParserConfigurationException e) {
Activator.logError(e);
}
}
private SAXParser getParser() throws ParserConfigurationException, SAXException {
if (parser == null) {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
parser = parserFactory.newSAXParser();
}
return this.parser;
}
private class Handler extends DefaultHandler {
private String nsURI;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("EPackage".equals(localName) && "http://www.eclipse.org/emf/2002/Ecore".equals(uri)) {
nsURI = attributes.getValue("nsURI");
}
throw new SAXException("Done");
}
public String getNsURI() {
return nsURI;
}
}
}