package com.google.eclipse.protobuf.resource; import static org.eclipse.xtext.resource.ClasspathUriUtil.isClasspathUri; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl; import org.eclipse.xtext.resource.ClasspathUriResolutionException; import org.eclipse.xtext.resource.SynchronizedXtextResourceSet; import com.google.eclipse.protobuf.util.Uris; import com.google.inject.Inject; public class FastXtextResourceSet extends SynchronizedXtextResourceSet { @Inject private Uris uris; @Override public URIConverter getURIConverter() { if (uriConverter == null) { uriConverter = new ExtensibleURIConverterImpl() { @Override public URI normalize(URI uri) { if (isClasspathUri(uri)) { URI result = resolveClasspathURI(uri); if (isClasspathUri(result)) { throw new ClasspathUriResolutionException(result); } result = super.normalize(result); return result; } return super.normalize(uri); } @Override public InputStream createInputStream(URI uri) throws IOException { InputStream in = doCreateInputStream(uri); return in != null ? in : super.createInputStream(uri); } @Override public InputStream createInputStream(URI uri, Map<?, ?> options) throws IOException { InputStream in = doCreateInputStream(uri); return in != null ? in : super.createInputStream(uri, options); } private InputStream doCreateInputStream(URI uri) throws IOException { if (isClasspathUri(uri)) { return getClass().getResourceAsStream(uri.path()); } if (uris.hasProtoExtension(uri)) { if (uri.isPlatformResource()) { IFile file = uris.referredFile(uri); if (file != null && file.exists()) { IPath location = file.getLocation(); return new FileInputStream(location.toFile()); } } if (uri.isFile()) { return new FileInputStream(uri.path()); } } return null; } }; } return uriConverter; } private URI resolveClasspathURI(URI uri) { return getClasspathUriResolver().resolve(getClasspathURIContext(), uri); } }