/**
 * Copyright (c) 2013 itemis AG 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:
 *   itemis AG - initial API and implementation
 */
package org.eclipse.rmf.reqif10.serialization;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.xmi.XMLLoad;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.XMLSave;
import org.eclipse.emf.ecore.xmi.impl.XMLMapImpl;
import org.eclipse.sphinx.emf.serialization.internal.XMLPersistenceMappingLoadImpl;
import org.eclipse.sphinx.emf.serialization.internal.XMLPersistenceMappingSaveImpl;
import org.eclipse.rmf.reqif10.Identifiable;
import org.eclipse.rmf.reqif10.ReqIF10Package;
import org.eclipse.rmf.reqif10.xhtml.XhtmlPackage;
import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaData;
import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceImpl;

public class ReqIF10ResourceImpl extends XMLPersistenceMappingResourceImpl {

	public ReqIF10ResourceImpl() {
		super();
	}

	public ReqIF10ResourceImpl(URI uri) {
		super(uri);
	}

	
	/**
	 * the resource expects all relevant EPackages to be registered before loading the resource.
	 * This avoids delays and errors by network lookups for EPackages by their namespace URI
	 */
	@Override
	public void initDefaultOptions() {
		super.initDefaultOptions();
				
		// ========= create options map===================
		final XMLResource.XMLMap optionsMap = new XMLMapImpl();
		optionsMap
				.setIDAttributeName(ReqIF10Package.Literals.IDENTIFIABLE__IDENTIFIER
						.getName().toUpperCase());
				
		// ========= default save options ===================
		Map<Object, Object> saveOptions = getDefaultSaveOptions();
		Map<String, String> namespaceToPrefixMap = new HashMap<String, String>();
		namespaceToPrefixMap.put(ReqIF10Package.eNS_URI, ""); //$NON-NLS-1$ 
		namespaceToPrefixMap.put(XhtmlPackage.eNS_URI, "xhtml"); //$NON-NLS-1$ 
		saveOptions.put(OPTION_NAMEPSACE_TO_PREFIX_MAP, namespaceToPrefixMap);

		// ========= default load options ===================
		Map<Object, Object> loadOptions = getDefaultLoadOptions();
		loadOptions.put(XMLResource.OPTION_XML_MAP, optionsMap);
		
	}

	/**
	 * Return <code>true</code>.
	 * 
	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#useUUIDs()
	 */
	@Override
	protected boolean useUUIDs() {
		return true;
	}

	/**
	 * Return <code>false</code>.
	 * 
	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#assignIDsWhileLoading()
	 */
	@Override
	protected boolean assignIDsWhileLoading() {
		return false;
	}

	/**
	 * Sets the ID of the object. The default implementation will update the
	 * {@link #eObjectToIDMap}. This behavior is override to set the ID in a
	 * object's specific attribute to set the id in the
	 * {@link Identifiable#setIdentifier(String)} and call the super method.
	 *
	 * @param eObject
	 *            : The object where the Id must be set.
	 * @param id
	 *            : The object's Id.
	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#setID(org.eclipse.emf.ecore.EObject,
	 *      java.lang.String)
	 */
	@Override
	public void setID(final EObject eObject, final String id) {
		final EAttribute idAttribute = eObject.eClass().getEIDAttribute();
		if ((idAttribute != null) && (id != null)) {
			
			// Only do this for ReqIF IDs (and not for XHTML, etc.)			
			if (idAttribute.getEType().eContainer() instanceof ReqIF10Package) {
				eObject.eSet(idAttribute, id);
			}
		}
		super.setID(eObject, id);
	}

	/**
	 * Create a new XMLSave implementation, with our specific implementation to
	 * avoid the save of the id of an {@link EObject} twice via the
	 * {@link Identifiable#getIdentifier()} and the #idToEObjectMap.
	 * 
	 * @return The XMLSave created
	 * 
	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#createXMLSave()
	 */
	@Override
	protected XMLSave createXMLSave() {
		return new XMLPersistenceMappingSaveImpl(createXMLHelper()) {

			@Override
			protected void saveElementID(final EObject o) {
				// As the identifier is an EStructuralFeture of the Identifiable
				// class, so we ignore the save of the element id from the map.
				this.saveFeatures(o);
			}
		};
	}
	
	public void setIsLoading(boolean isLoading) {
		this.isLoading = isLoading;
	}
	
	@Override
	protected XMLLoad createXMLLoad() {
		return new ReqIF10LoadImpl(createXMLHelper());
	}
}
