/** * 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.util.HashMap; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.ContentHandler; /** * An implementation of a content handler. */ public class ContentHandlerImpl implements ContentHandler { /** * Creates a map with a single entry from {@link ContentHandler#VALIDITY_PROPERTY} to the given validity value. * @param validity the value of the validity property. * @return a map with a single entry from {@link ContentHandler#VALIDITY_PROPERTY} to the given validity value. */ public static Map<String, Object> createContentDescription(Validity validity) { Map<String, Object> result = new HashMap<String, Object>(); result.put(VALIDITY_PROPERTY, validity); return result; } /** * Creates an instance. */ public ContentHandlerImpl() { super(); } /** * Returns the value of {@link ContentHandler#OPTION_REQUESTED_PROPERTIES} in the options map. * @param options the options in which to look up the property. * @return value of {@link ContentHandler#OPTION_REQUESTED_PROPERTIES} in the options map. */ @SuppressWarnings("unchecked") protected Set<String> getRequestedProperties(Map<?, ?> options) { return (Set<String>)options.get(OPTION_REQUESTED_PROPERTIES); } /** * Returns whether the named property is one requested in the options. * @param property the property in question. * @param options the options in which to look for the requested property. * @return whether the named property is one requested in the options. * @see #getRequestedProperties(Map) */ protected boolean isRequestedProperty(String property, Map<?, ?> options) { if (ContentHandler.VALIDITY_PROPERTY.equals(property) || ContentHandler.CONTENT_TYPE_PROPERTY.equals(property)) { return true; } else { Set<String> requestedProperties = getRequestedProperties(options); if (requestedProperties == null) { return true; } else { return requestedProperties.contains(property); } } } /** * This implementations always return true; clients are generally expected to override this. * @param uri the URI in questions. * @return true; */ public boolean canHandle(URI uri) { return true; } /** * This base implementation handles looking up the {@link ContentHandler#BYTE_ORDER_MARK_PROPERTY} if that's a {@link #isRequestedProperty(String, Map) requested property}. */ public Map<String, Object> contentDescription(URI uri, InputStream inputStream, Map<?, ?> options, Map<Object, Object> context) throws IOException { Map<String, Object> result = createContentDescription(ContentHandler.Validity.INDETERMINATE); if (isRequestedProperty(ContentHandler.BYTE_ORDER_MARK_PROPERTY, options)) { result.put(ContentHandler.BYTE_ORDER_MARK_PROPERTY, getByteOrderMark(uri, inputStream, options, context)); } return result; } /** * Returns the byte order marker at the start of the input stream. * @param uri the URI of the input stream. * @param inputStream the input stream to scan. * @param options any options to influence the behavior; this base implementation ignores this. * @param context the cache for fetching and storing a previous computation of the byte order marker; this base implementation caches {@link ContentHandler#BYTE_ORDER_MARK_PROPERTY}. * @return the byte order marker at the start of the input stream. * @throws IOException */ protected ByteOrderMark getByteOrderMark(URI uri, InputStream inputStream, Map<?, ?> options, Map<Object, Object> context) throws IOException { ByteOrderMark result = (ByteOrderMark)context.get(ContentHandler.BYTE_ORDER_MARK_PROPERTY); if (result == null) { result = ByteOrderMark.read(inputStream); inputStream.reset(); context.put(ContentHandler.BYTE_ORDER_MARK_PROPERTY, result); } return result; } }