/**
 * Copyright (c) 2002-2011 IBM Corporation, CEA, and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *   IBM - Initial API and implementation
 *   Kenn Hussey (CEA) - 351783
 */
package org.eclipse.emf.ecore.xmi;

import org.eclipse.emf.ecore.util.ExtendedMetaData;



/**
 * A resource that serializes to XMI. The serialization format is based
 * on the XMI 2.0 specification from the OMG. The various save and load
 * options in this interface enable you to tailor the XMI files that are
 * produced.
 * <p>
 * You may specify the XML encoding to be used when saving the resource
 * by using the {@link XMLResource#setEncoding setEncoding} method.
 * </p>
 * <p>
 * An XMIResource is capable of handling XMI files that contain IDs as
 * well as XMI files that use URI fragments rather than IDs. The IDs from
 * an XMI file are stored in the XMIResource in the {@link XMLResource#getIDToEObjectMap
 * idToEObjectMap} and the {@link XMLResource#getEObjectToIDMap eObjectToIDMap}.
 * </p>
 * <p>
 * When saving an XMIResource, the ID of an object is saved if an object has
 * one. If a referenced object has an ID, it is used rather than a URI fragment.
 * You may clear the Maps that contain IDs if you wish to use URI fragments
 * rather than IDs.
 * </p>
 * <p>
 * An XMIResource does not create IDs for you automatically; you can set IDs
 * for objects yourself. However, we recommend that you use URI fragments
 * instead because their use reduces the size of XMI files and memory
 * consumption as well.
 * </p>
 * @see org.eclipse.emf.ecore.resource.Resource
 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl
 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl
 */
public interface XMIResource extends XMLResource
{
  /**
   * Write the type of an element as "xmi:type" instead of "xsi:type"
   * which is useful for models with multiple inheritance that may
   * conflict with XML schema types
   */
  String OPTION_USE_XMI_TYPE = "USE_XMI_TYPE";

  /**
   * A save or load option that when set to true, instructs the resource to produce regular XML, not XMI, or to consume, regular XML, not XMI.
   * @since 2.7
   */
  String OPTION_SUPPRESS_XMI = "SUPPRESS_XMI";

  String VERSION_NAME = "version";

  String VERSION_VALUE = "2.0";

  String VERSION_2_1_VALUE = "2.1";

  String XMI_NAMESPACE_PREFIX = "http://schema.omg.org/spec/XMI/";

  String XMI_2_4_NAMESPACE_PREFIX = "http://www.omg.org/spec/XMI/";

  String XMI_NS = "xmi";

  String XMI_ID = "id";

  String XMI_TAG_NAME = "XMI";

  String XMI_URI = ExtendedMetaData.XMI_URI;

  String XMI_2_1_URI = XMI_NAMESPACE_PREFIX + VERSION_2_1_VALUE;

  /**
   * @return XMI version
   */
  String getXMIVersion();

  /**
   * Sets XMI version and automatically assigns corresponding namespace
   * @param version
   */
  void setXMIVersion(String version);

  /**
   * @return XMI namespace
   */ 
  String getXMINamespace();

  /**
   * Sets XMI namespace and automatically assigns corresponding version
   * @param namespace
   */
  void setXMINamespace(String namespace);
}
