blob: c1a7bf2911602679ee5cb32bada71afc7a10faa1 [file] [log] [blame]
/***************************************************************************************************
* Copyright (c) 2003, 2004 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 Corporation - initial API and implementation
**************************************************************************************************/
package org.eclipse.wst.common.internal.emf.resource;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMISaveImpl;
public class CompatibilityXMISaveImpl extends XMISaveImpl {
/**
* Constructor for CompatibilityXMISaveImpl.
*
* @param helper
*/
public CompatibilityXMISaveImpl(XMLHelper helper) {
super(helper);
}
/**
* Constructor for CompatibilityXMISaveImpl.
*
* @param options
* @param helper
* @param encoding
*/
public CompatibilityXMISaveImpl(Map options, XMLHelper helper, String encoding) {
super(options, helper, encoding);
}
/**
* @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#init(XMLResource, Map)
*/
protected void init(XMLResource resource, Map options) {
super.init(resource, options);
xmiType = true;
}
/**
* @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#addNamespaceDeclarations()
*/
public void addNamespaceDeclarations() {
doc.addAttribute(XMI_VER_NS, XMIResource.VERSION_VALUE);
doc.addAttribute(XMI_XMLNS, XMIResource.XMI_URI);
EPackage[] packages = helper.packages();
StringBuffer xsiSchemaLocation = null;
if (declareSchemaLocation) {
for (int i = 0; i < packages.length; i++) {
EPackage ePackage = packages[i];
EObject root = EcoreUtil.getRootContainer(ePackage);
if (root instanceof EPackage) {
EPackage rootEPackage = (EPackage) root;
Resource resource = rootEPackage.eResource();
if (resource != null) {
URI uri = resource.getURI();
String rootNsURI = rootEPackage.getNsURI();
if (uri == null ? rootNsURI != null : !uri.toString().equals(rootNsURI)) {
declareXSI = true;
if (xsiSchemaLocation == null) {
xsiSchemaLocation = new StringBuffer();
} else {
xsiSchemaLocation.append(' ');
}
xsiSchemaLocation.append(rootNsURI);
xsiSchemaLocation.append(' ');
xsiSchemaLocation.append(helper.getHREF(rootEPackage));
}
}
}
}
}
if (declareXSI) {
doc.addAttribute(XSI_XMLNS, XMLResource.XSI_URI);
}
for (int i = 0; i < packages.length; i++) {
EPackage ePackage = packages[i];
//Modified from superclass - dispatch back to helper for compatibility
//String nsURI = ePackage.getNsURI();
//String nsPrefix = ePackage.getNsPrefix();
String[] nsInfo = ((MappedXMIHelper) helper).getNSInfo(ePackage);
doc.addAttributeNS(XMLResource.XML_NS, nsInfo[0], nsInfo[1]);
}
if (xsiSchemaLocation != null) {
doc.addAttribute(XSI_SCHEMA_LOCATION, xsiSchemaLocation.toString());
}
}
protected void saveHref(EObject remote, EStructuralFeature f) {
String name = helper.getQName(f);
String href = helper.getHREF(remote);
if (href != null) {
doc.startElement(name);
EClass eClass = remote.eClass();
EClass expectedType = (EClass) f.getEType();
//Changed next line to always write type if expectedType
//is different from eClass
if (eClass != expectedType) {
saveTypeAttribute(eClass);
}
doc.addAttribute(XMLResource.HREF, href);
doc.endEmptyElement();
}
}
}