protected boolean saveFeatures()

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 [925:1224]


    protected boolean saveFeatures(EObject o) {
        EClass eClass = o.eClass();
        int contentKind = extendedMetaData == null ? ExtendedMetaData.UNSPECIFIED_CONTENT : extendedMetaData.getContentKind(eClass);
        if (!toDOM) {
            switch (contentKind) {
                case ExtendedMetaData.MIXED_CONTENT:
                case ExtendedMetaData.SIMPLE_CONTENT: {
                    doc.setMixed(true);
                    break;
                }
            }
        }

        if (o == root) {
            writeTopAttributes(root);
        }

        EStructuralFeature[] features = featureTable.getFeatures(eClass);
        int[] featureKinds = featureTable.getKinds(eClass, features);
        int[] elementFeatures = null;
        int elementCount = 0;

        String content = null;

        // Process XML attributes
        LOOP:
        for (int i = 0; i < features.length; i++) {
            int kind = featureKinds[i];
            EStructuralFeature f = features[i];
            if (kind != TRANSIENT && shouldSaveFeature(o, f)) {
                switch (kind) {
                    case DATATYPE_ELEMENT_SINGLE: {
                        if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
                            content = getDataTypeElementSingleSimple(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case DATATYPE_SINGLE: {
                        saveDataTypeSingle(o, f);
                        continue LOOP;
                    }
                    case DATATYPE_SINGLE_NILLABLE: {
                        if (!isNil(o, f)) {
                            saveDataTypeSingle(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case OBJECT_ATTRIBUTE_SINGLE: {
                        saveEObjectSingle(o, f);
                        continue LOOP;
                    }
                    case OBJECT_ATTRIBUTE_MANY: {
                        saveEObjectMany(o, f);
                        continue LOOP;
                    }
                    case OBJECT_ATTRIBUTE_IDREF_SINGLE: {
                        saveIDRefSingle(o, f);
                        continue LOOP;
                    }
                    case OBJECT_ATTRIBUTE_IDREF_MANY: {
                        saveIDRefMany(o, f);
                        continue LOOP;
                    }
                    case OBJECT_HREF_SINGLE_UNSETTABLE: {
                        if (isNil(o, f)) {
                            break;
                        }
                        // it's intentional to keep going
                    }
                    case OBJECT_HREF_SINGLE: {
                        if (useEncodedAttributeStyle) {
                            saveEObjectSingle(o, f);
                            continue LOOP;
                        } else {
                            switch (sameDocSingle(o, f)) {
                                case SAME_DOC: {
                                    saveIDRefSingle(o, f);
                                    continue LOOP;
                                }
                                case CROSS_DOC: {
                                    break;
                                }
                                default: {
                                    continue LOOP;
                                }
                            }
                        }
                        break;
                    }
                    case OBJECT_HREF_MANY_UNSETTABLE: {
                        if (isEmpty(o, f)) {
                            saveManyEmpty(o, f);
                            continue LOOP;
                        }
                        // It's intentional to keep going.
                    }
                    case OBJECT_HREF_MANY: {
                        if (useEncodedAttributeStyle) {
                            saveEObjectMany(o, f);
                            continue LOOP;
                        } else {
                            switch (sameDocMany(o, f)) {
                                case SAME_DOC: {
                                    saveIDRefMany(o, f);
                                    continue LOOP;
                                }
                                case CROSS_DOC: {
                                    break;
                                }
                                default: {
                                    continue LOOP;
                                }
                            }
                        }
                        break;
                    }
                    case OBJECT_ELEMENT_SINGLE_UNSETTABLE:
                    case OBJECT_ELEMENT_SINGLE: {
                        if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
                            content = getElementReferenceSingleSimple(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case OBJECT_ELEMENT_MANY: {
                        if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
                            content = getElementReferenceManySimple(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE:
                    case OBJECT_ELEMENT_IDREF_SINGLE: {
                        if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
                            content = getElementIDRefSingleSimple(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case OBJECT_ELEMENT_IDREF_MANY: {
                        if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
                            content = getElementIDRefManySimple(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case DATATYPE_ATTRIBUTE_MANY: {
                        break;
                    }
                    case OBJECT_CONTAIN_MANY_UNSETTABLE:
                    case DATATYPE_MANY: {
                        if (isEmpty(o, f)) {
                            saveManyEmpty(o, f);
                            continue LOOP;
                        }
                        break;
                    }
                    case OBJECT_CONTAIN_SINGLE_UNSETTABLE:
                    case OBJECT_CONTAIN_SINGLE:
                    case OBJECT_CONTAIN_MANY:
                    case ELEMENT_FEATURE_MAP: {
                        break;
                    }
                    case ATTRIBUTE_FEATURE_MAP: {
                        saveAttributeFeatureMap(o, f);
                        continue LOOP;
                    }
                    default: {
                        continue LOOP;
                    }
                }

                // We only get here if we should do this.
                //
                if (elementFeatures == null) {
                    elementFeatures = new int[features.length];
                }
                elementFeatures[elementCount++] = i;
            }
        }

        processAttributeExtensions(o);

        if (elementFeatures == null) {
            if (content == null) {
                content = getContent(o, features);
            }

            if (content == null) {
                if (o == root && writeTopElements(root)) {
                    endSaveFeatures(o, 0, null);
                    return true;
                } else {
                    endSaveFeatures(o, EMPTY_ELEMENT, null);
                    return false;
                }
            } else {
                endSaveFeatures(o, CONTENT_ELEMENT, content);
                return true;
            }
        }

        if (o == root) {
            writeTopElements(root);
        }

        // Process XML elements
        for (int i = 0; i < elementCount; i++) {
            int kind = featureKinds[elementFeatures[i]];
            EStructuralFeature f = features[elementFeatures[i]];
            switch (kind) {
                case DATATYPE_SINGLE_NILLABLE: {
                    saveNil(o, f);
                    break;
                }
                case ELEMENT_FEATURE_MAP: {
                    saveElementFeatureMap(o, f);
                    break;
                }
                case DATATYPE_MANY: {
                    saveDataTypeMany(o, f);
                    break;
                }
                case DATATYPE_ATTRIBUTE_MANY: {
                    saveDataTypeAttributeMany(o, f);
                    break;
                }
                case DATATYPE_ELEMENT_SINGLE: {
                    saveDataTypeElementSingle(o, f);
                    break;
                }
                case OBJECT_CONTAIN_SINGLE_UNSETTABLE: {
                    if (isNil(o, f)) {
                        saveNil(o, f);
                        break;
                    }
                    // it's intentional to keep going
                }
                case OBJECT_CONTAIN_SINGLE: {
                    saveContainedSingle(o, f);
                    break;
                }
                case OBJECT_CONTAIN_MANY_UNSETTABLE:
                case OBJECT_CONTAIN_MANY: {
                    saveContainedMany(o, f);
                    break;
                }
                case OBJECT_HREF_SINGLE_UNSETTABLE: {
                    if (isNil(o, f)) {
                        saveNil(o, f);
                        break;
                    }
                    // it's intentional to keep going
                }
                case OBJECT_HREF_SINGLE: {
                    saveHRefSingle(o, f);
                    break;
                }
                case OBJECT_HREF_MANY_UNSETTABLE:
                case OBJECT_HREF_MANY: {
                    saveHRefMany(o, f);
                    break;
                }
                case OBJECT_ELEMENT_SINGLE_UNSETTABLE: {
                    if (isNil(o, f)) {
                        saveNil(o, f);
                        break;
                    }
                    // it's intentional to keep going
                }
                case OBJECT_ELEMENT_SINGLE: {
                    saveElementReferenceSingle(o, f);
                    break;
                }
                case OBJECT_ELEMENT_MANY: {
                    saveElementReferenceMany(o, f);
                    break;
                }
                case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE: {
                    if (isNil(o, f)) {
                        saveNil(o, f);
                        break;
                    }
                    // it's intentional to keep going
                }
                case OBJECT_ELEMENT_IDREF_SINGLE: {
                    saveElementIDRefSingle(o, f);
                    break;
                }
                case OBJECT_ELEMENT_IDREF_MANY: {
                    saveElementIDRefMany(o, f);
                    break;
                }
            }
        }
        endSaveFeatures(o, 0, null);
        return true;
    }