/******************************************************************************* * Copyright (c) 2009-2015 CWI * 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: * * Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI * * Arnold Lankamp - Arnold.Lankamp@cwi.nl *******************************************************************************/ package org.rascalmpl.uri; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; import org.eclipse.core.runtime.FileLocator; import io.usethesource.vallang.ISourceLocation; import org.rascalmpl.values.ValueFactoryFactory; public class BundleURIResolver implements ISourceLocationInputOutput { @Override public OutputStream getOutputStream(ISourceLocation uri, boolean append) throws IOException { ISourceLocation parent = resolve(URIUtil.getParentLocation(uri)); parent = resolve(parent); return URIResolverRegistry.getInstance().getOutputStream(URIUtil.getChildLocation(parent, URIUtil.getLocationName(uri)), append); } @Override public void mkDirectory(ISourceLocation uri) throws IOException { ISourceLocation parent = resolve(URIUtil.getParentLocation(uri)); parent = resolve(parent); URIResolverRegistry.getInstance().mkDirectory(URIUtil.getChildLocation(parent, URIUtil.getLocationName(uri))); } @Override public void remove(ISourceLocation uri) throws IOException { URIResolverRegistry.getInstance().remove(resolve(uri)); } @Override public String scheme() { return "bundleresource"; } @Override public boolean exists(ISourceLocation uri) { try { return URIResolverRegistry.getInstance().exists(resolve(uri)); } catch (IOException e) { return false; } } @Override public InputStream getInputStream(ISourceLocation uri) throws IOException { return URIResolverRegistry.getInstance().getInputStream(resolve(uri)); } protected ISourceLocation resolve(ISourceLocation uri) throws IOException { try { URL url = uri.getURI().toURL(); URL resolved = FileLocator.resolve(url); if (resolved == url) { throw new IOException("could not resolve " + uri); } if (resolved.getProtocol().equals("jar")) { String path = resolved.getPath(); if (path.startsWith("file:")) { path = path.substring(5); } // TODO: this does not respect offsets return ValueFactoryFactory.getValueFactory().sourceLocation(resolved.getProtocol(), resolved.getAuthority(), path); } else { return ValueFactoryFactory.getValueFactory().sourceLocation(resolved.toURI()); } } catch (URISyntaxException e) { throw new IOException("unexpected URI syntax exception: " + e.getMessage(), e); } } @Override public boolean isDirectory(ISourceLocation uri) { try { return URIResolverRegistry.getInstance().isDirectory(resolve(uri)); } catch (IOException e) { return false; } } @Override public boolean isFile(ISourceLocation uri) { try { return URIResolverRegistry.getInstance().isFile(resolve(uri)); } catch (IOException e) { return false; } } @Override public long lastModified(ISourceLocation uri) throws IOException { return URIResolverRegistry.getInstance().lastModified(resolve(uri)); } @Override public String[] list(ISourceLocation uri) throws IOException { return URIResolverRegistry.getInstance().listEntries(resolve(uri)); } @Override public boolean supportsHost() { return false; } @Override public Charset getCharset(ISourceLocation uri) { return Charset.defaultCharset(); // TODO } }