/**
* 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.HashMap;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.Callback;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ContentHandler;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.URIHandler;
/**
* An implementation of a {@link URIHandler URI handler}.
*
*/
public class URIHandlerImpl implements URIHandler
{
/**
* Creates an instance.
*/
public URIHandlerImpl()
{
super();
}
/**
* This implementation always returns true; clients are generally expected to override this.
*/
public boolean canHandle(URI uri)
{
return true;
}
/**
* Returns the value of the {@link URIConverter#OPTION_URI_CONVERTER URI converter option}.
* @param options the options in which to look for the URI converter.
* @return the value of the URI converter option.
*/
protected URIConverter getURIConverter(Map<?, ?> options)
{
return (URIConverter)options.get(URIConverter.OPTION_URI_CONVERTER);
}
/**
* Returns the value of the {@link URIConverter#OPTION_RESPONSE response option}.
* @param options the options in which to look for the response option.
* @return the value of the response option.
*/
@SuppressWarnings("unchecked")
protected Map<Object, Object> getResponse(Map<?, ?> options)
{
return (Map<Object, Object>)options.get(URIConverter.OPTION_RESPONSE);
}
/**
* Returns the value of the {@link URIConverter#OPTION_REQUESTED_ATTRIBUTES requested attributes option}.
* @param options the options in which to look for the requested attributes option.
* @return the value of the requested attributes option.
*/
@SuppressWarnings("unchecked")
protected Set<String> getRequestedAttributes(Map<?, ?> options)
{
return (Set<String>)options.get(URIConverter.OPTION_REQUESTED_ATTRIBUTES);
}
/**
* Creates an output stream for the URI, assuming it's a URL, and returns it.
* Specialized support is provided for HTTP URLs.
* @return an open output stream.
* @exception IOException if there is a problem obtaining an open output stream.
*/
public OutputStream createOutputStream(URI uri, Map<?, ?> options) throws IOException
{
return null;
}
public void store(URI uri, byte[] bytes, Map<?, ?> options, Callback<Map<?, ?>> callback)
{
callback.onSuccess(null);
}
/**
* Creates an input stream for the URI, assuming it's a URL, and returns it.
* @return an open input stream.
* @exception IOException if there is a problem obtaining an open input stream.
*/
public InputStream createInputStream(URI uri, Map<?, ?> options) throws IOException
{
return null;
}
public void createInputStream(URI uri, Map<?, ?> options, Callback<Map<?, ?>> callback)
{
callback.onSuccess(null);
}
/**
* Only HTTP connections support delete.
*/
public void delete(URI uri, Map<?, ?> options) throws IOException
{
//
}
public void delete(URI uri, Map<?, ?> options, Callback<Map<?, ?>> callback)
{
callback.onSuccess(null);
}
/**
* This implementation delegates to the {@link #getURIConverter(Map) URI converter}'s {@link URIConverter#getContentHandlers() content handlers}.
*/
public Map<String, ?> contentDescription(URI uri, Map<?, ?> options) throws IOException
{
URIConverter uriConverter = (URIConverter)options.get(URIConverter.OPTION_URI_CONVERTER);
InputStream inputStream = null;
Map<String, ?> result = null;
Map<Object, Object> context = new HashMap<Object, Object>();
try
{
for (ContentHandler contentHandler : uriConverter.getContentHandlers())
{
if (contentHandler.canHandle(uri))
{
if (inputStream == null)
{
try
{
inputStream = createInputStream(uri, options);
}
catch (IOException exception)
{
throw exception;
}
if (!inputStream.markSupported())
{
// inputStream = new BufferedInputStream(inputStream);
}
inputStream.mark(Integer.MAX_VALUE);
}
else
{
inputStream.reset();
}
Map<String, ?> contentDescription = contentHandler.contentDescription(uri, inputStream, options, context);
switch ((ContentHandler.Validity)contentDescription.get(ContentHandler.VALIDITY_PROPERTY))
{
case VALID:
{
return contentDescription;
}
case INDETERMINATE:
{
if (result == null)
{
result = contentDescription;
}
break;
}
case INVALID:
{
break;
}
}
}
}
}
finally
{
if (inputStream != null)
{
inputStream.close();
}
}
return result == null ? ContentHandler.INVALID_CONTENT_DESCRIPTION : result;
}
/**
* If a stream can be created the file exists.
* Specialized support is provided for HTTP connections to avoid fetching the whole stream in that case.
*/
public boolean exists(URI uri, Map<?, ?> options)
{
return false;
}
public void exists(URI uri, Map<?, ?> options, Callback<Boolean> callback)
{
callback.onSuccess(false);
}
public Map<String, ?> getAttributes(URI uri, Map<?, ?> options)
{
return null;
}
public void setAttributes(URI uri, Map<String, ?> attributes, Map<?, ?> options) throws IOException
{
// We can't update any properties via just a URL connection.
}
}