protected void addNamespaceDeclarations()

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);
            }
        }
    }