/** * Copyright (c) 2007-2011 IBM Corporation and others. * 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: * IBM - Initial API and implementation */ package org.eclipse.emf.ecore.resource.impl; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Collections; import java.util.Map; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.plugin.EcorePlugin; import org.eclipse.emf.ecore.resource.URIConverter; public class PlatformResourceURIHandlerImpl extends URIHandlerImpl { /** * Creates an instance. */ public PlatformResourceURIHandlerImpl() { super(); } @Override public boolean canHandle(URI uri) { return uri.isPlatformResource(); } /** * Creates an output stream for the platform resource path and returns it. * <p> * This implementation does one of two things, depending on the runtime environment. * If there is an Eclipse workspace, it delegates to * {@link WorkbenchHelper#createPlatformResourceOutputStream WorkbenchHelper.createPlatformResourceOutputStream}, * which gives the expected Eclipse behaviour. * Otherwise, the {@link EcorePlugin#resolvePlatformResourcePath resolved} URI * is delegated to {@link #createOutputStream createOutputStream} * for recursive processing. * @return an open output stream. * @exception IOException if there is a problem obtaining an open output stream or a valid interpretation of the path. * @see EcorePlugin#resolvePlatformResourcePath(String) */ @Override public OutputStream createOutputStream(URI uri, Map<?, ?> options) throws IOException { String platformResourcePath = uri.toPlatformString(true); URI resolvedLocation = EcorePlugin.resolvePlatformResourcePath(platformResourcePath); if (resolvedLocation != null) { return ((URIConverter)options.get(URIConverter.OPTION_URI_CONVERTER)).createOutputStream(resolvedLocation, options); } throw new IOException("The path '" + platformResourcePath + "' is unmapped"); } /** * Creates an input stream for the platform resource path and returns it. * <p> * This implementation does one of two things, depending on the runtime environment. * If there is an Eclipse workspace, it delegates to * {@link WorkbenchHelper#createPlatformResourceInputStream WorkbenchHelper.createPlatformResourceInputStream}, * which gives the expected Eclipse behaviour. * Otherwise, the {@link EcorePlugin#resolvePlatformResourcePath resolved} URI * is delegated to {@link #createInputStream createInputStream} * for recursive processing. * @return an open input stream. * @exception IOException if there is a problem obtaining an open input stream or a valid interpretation of the path. * @see EcorePlugin#resolvePlatformResourcePath(String) */ @Override public InputStream createInputStream(URI uri, Map<?, ?> options) throws IOException { String platformResourcePath = uri.toPlatformString(true); URI resolvedLocation = EcorePlugin.resolvePlatformResourcePath(platformResourcePath); if (resolvedLocation != null) { return getURIConverter(options).createInputStream(resolvedLocation, options); } throw new IOException("The path '" + platformResourcePath + "' is unmapped"); } @Override public void delete(URI uri, Map<?, ?> options) throws IOException { String platformResourcePath = uri.toPlatformString(true); URI resolvedLocation = EcorePlugin.resolvePlatformResourcePath(platformResourcePath); if (resolvedLocation != null) { getURIConverter(options).delete(resolvedLocation, options); } else { throw new IOException("The path '" + platformResourcePath + "' is unmapped"); } } @Override public boolean exists(URI uri, Map<?, ?> options) { String platformResourcePath = uri.toPlatformString(true); URI resolvedLocation = EcorePlugin.resolvePlatformResourcePath(platformResourcePath); return resolvedLocation != null && getURIConverter(options).exists(resolvedLocation, options); } @Override public Map<String, ?> getAttributes(URI uri, Map<?, ?> options) { String platformResourcePath = uri.toPlatformString(true); URI resolvedLocation = EcorePlugin.resolvePlatformResourcePath(platformResourcePath); return resolvedLocation == null ? Collections.<String, Object>emptyMap() : getURIConverter(options).getAttributes(resolvedLocation, options); } @Override public void setAttributes(URI uri, Map<String, ?> attributes, Map<?, ?> options) throws IOException { String platformResourcePath = uri.toPlatformString(true); URI resolvedLocation = EcorePlugin.resolvePlatformResourcePath(platformResourcePath); if (resolvedLocation != null) { getURIConverter(options).setAttributes(resolvedLocation, attributes, options); } else { throw new IOException("The platform resource path '" + platformResourcePath + "' does not resolve"); } } }