in packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-emf/src/main/java/org/eclipse/emf/ecore/xmi/resource/xml/XMLSave.java [594:749]
protected void addNamespaceDeclarations() {
EPackage noNamespacePackage = helper.getNoNamespacePackage();
EPackage[] packages = helper.packages();
buffer.setLength(0);
StringBuffer xsiSchemaLocation = buffer;
String xsiNoNamespaceSchemaLocation = null;
if (declareSchemaLocation) {
Map<String, String> handledBySchemaLocationMap = Collections.emptyMap();
if (extendedMetaData != null) {
Resource resource = helper.getResource();
if (resource != null && resource.getContents().size() >= 1) {
EObject root = getSchemaLocationRoot(resource.getContents().get(0));
EClass eClass = root.eClass();
EReference xsiSchemaLocationMapFeature = extendedMetaData.getXSISchemaLocationMapFeature(eClass);
if (xsiSchemaLocationMapFeature != null) {
@SuppressWarnings("unchecked")
EMap<String, String> xsiSchemaLocationMap = (EMap<String, String>) root.eGet(xsiSchemaLocationMapFeature);
if (!xsiSchemaLocationMap.isEmpty()) {
handledBySchemaLocationMap = xsiSchemaLocationMap.map();
declareXSI = true;
for (Map.Entry<String, String> entry : xsiSchemaLocationMap.entrySet()) {
String namespace = entry.getKey();
URI location = URI.createURI(entry.getValue());
if (namespace == null) {
xsiNoNamespaceSchemaLocation = helper.deresolve(location).toString();
} else {
if (xsiSchemaLocation.length() > 0) {
xsiSchemaLocation.append(' ');
}
xsiSchemaLocation.append(namespace);
xsiSchemaLocation.append(' ');
xsiSchemaLocation.append(helper.deresolve(location).toString());
}
}
}
}
}
}
for (int i = 0; i < packages.length; i++) {
EPackage ePackage = packages[i];
String javaImplementationLocation = null;
if (declareSchemaLocationImplementation) {
// First try to see if this package's implementation class has an eInstance.
//
try {
// Field field = ePackage.getClass().getField("eINSTANCE");
// javaImplementationLocation = "java://" + field.getDeclaringClass().getName();
} catch (Exception exception) {
// If there is no field, then we can't do this.
}
}
if (noNamespacePackage == ePackage) {
if (ePackage.eResource() != null && !handledBySchemaLocationMap.containsKey(null)) {
declareXSI = true;
if (javaImplementationLocation != null) {
xsiNoNamespaceSchemaLocation = javaImplementationLocation;
} else {
xsiNoNamespaceSchemaLocation = helper.getHREF(ePackage);
if (xsiNoNamespaceSchemaLocation != null && xsiNoNamespaceSchemaLocation.endsWith("#/")) {
xsiNoNamespaceSchemaLocation = xsiNoNamespaceSchemaLocation.substring(0, xsiNoNamespaceSchemaLocation.length() - 2);
}
}
}
} else {
Resource resource = ePackage.eResource();
if (resource != null) {
String nsURI = extendedMetaData == null ? ePackage.getNsURI() : extendedMetaData.getNamespace(ePackage);
if (!handledBySchemaLocationMap.containsKey(nsURI)) {
URI uri = resource.getURI();
if (javaImplementationLocation != null || (uri == null ? nsURI != null : !uri.toString().equals(nsURI))) {
declareXSI = true;
if (xsiSchemaLocation.length() > 0) {
xsiSchemaLocation.append(' ');
}
xsiSchemaLocation.append(nsURI);
xsiSchemaLocation.append(' ');
String location = javaImplementationLocation == null ? helper.getHREF(ePackage) : javaImplementationLocation;
location = convertURI(location);
if (location.endsWith("#/")) {
location = location.substring(0, location.length() - 2);
if (uri != null && uri.hasFragment()) {
location += "#" + uri.fragment();
}
}
xsiSchemaLocation.append(location);
}
}
}
}
}
}
if (declareXSI) {
if (!toDOM) {
doc.addAttribute(XSI_XMLNS, XMLResource.XSI_URI);
} else {
getGwtDOMHandler().setAttributeNS(currentNode, ExtendedMetaData.XMLNS_URI, XSI_XMLNS, XMLResource.XSI_URI);
}
}
for (int i = 0; i < packages.length; i++) {
EPackage ePackage = packages[i];
if (ePackage != noNamespacePackage &&
ePackage != XMLNamespacePackage.eINSTANCE &&
!ExtendedMetaData.XMLNS_URI.equals(ePackage.getNsURI())) {
String nsURI = extendedMetaData == null ? ePackage.getNsURI() : extendedMetaData.getNamespace(ePackage);
if (ePackage == xmlSchemaTypePackage) {
nsURI = XMLResource.XML_SCHEMA_URI;
}
if (nsURI != null && !isDuplicateURI(nsURI)) {
List<String> nsPrefixes = helper.getPrefixes(ePackage);
for (String nsPrefix : nsPrefixes) {
if (!toDOM) {
if (nsPrefix != null && nsPrefix.length() > 0) {
if (!declareXSI || !"xsi".equals(nsPrefix)) {
doc.addAttributeNS(XMLResource.XML_NS, nsPrefix, nsURI);
}
} else {
doc.addAttribute(XMLResource.XML_NS, nsURI);
}
} else {
if (nsPrefix != null && nsPrefix.length() > 0) {
if (!declareXSI || !"xsi".equals(nsPrefix)) {
getGwtDOMHandler().setAttributeNS(currentNode, ExtendedMetaData.XMLNS_URI, XMLResource.XML_NS + ":" + nsPrefix, nsURI);
}
} else {
getGwtDOMHandler().setAttributeNS(currentNode, ExtendedMetaData.XMLNS_URI, XMLResource.XML_NS, nsURI);
}
}
}
}
}
}
if (xsiSchemaLocation.length() > 0) {
if (!toDOM) {
doc.addAttribute(XSI_SCHEMA_LOCATION, xsiSchemaLocation.toString());
} else {
getGwtDOMHandler().setAttributeNS(currentNode, XMLResource.XSI_URI, XSI_SCHEMA_LOCATION, xsiSchemaLocation.toString());
}
}
if (xsiNoNamespaceSchemaLocation != null) {
if (!toDOM) {
doc.addAttribute(XSI_NO_NAMESPACE_SCHEMA_LOCATION, xsiNoNamespaceSchemaLocation);
} else {
getGwtDOMHandler().setAttributeNS(currentNode, XMLResource.XSI_URI, XSI_NO_NAMESPACE_SCHEMA_LOCATION, xsiNoNamespaceSchemaLocation);
}
}
}