protected int featureKind()

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 [2270:2395]


        protected int featureKind(EStructuralFeature f) {
            if (f.isTransient()) {
                return TRANSIENT;
            }

            boolean isMany = f.isMany();
            boolean isUnsettable = f.isUnsettable();

            if (f instanceof EReference) {
                EReference r = (EReference) f;
                if (r.isContainment()) {
                    return
                            isMany ?
                                    isUnsettable ? OBJECT_CONTAIN_MANY_UNSETTABLE : OBJECT_CONTAIN_MANY :
                                    isUnsettable ? OBJECT_CONTAIN_SINGLE_UNSETTABLE : OBJECT_CONTAIN_SINGLE;
                }
                EReference opposite = r.getEOpposite();
                if (opposite != null && opposite.isContainment()) {
                    return TRANSIENT;
                }

                if (map != null) {
                    XMLInfo info = map.getInfo(f);
                    if (info != null && info.getXMLRepresentation() == XMLInfo.ELEMENT) {
                        return
                                isMany ?
                                        OBJECT_ELEMENT_MANY :
                                        r.isUnsettable() ?
                                                OBJECT_ELEMENT_SINGLE_UNSETTABLE :
                                                OBJECT_ELEMENT_SINGLE;
                    }
                }

                if (extendedMetaData != null) {
                    switch (extendedMetaData.getFeatureKind(f)) {
                        case ExtendedMetaData.ATTRIBUTE_FEATURE: {
                            return
                                    r.isResolveProxies() ?
                                            isMany ?
                                                    OBJECT_ATTRIBUTE_MANY :
                                                    OBJECT_ATTRIBUTE_SINGLE :
                                            isMany ?
                                                    OBJECT_ATTRIBUTE_IDREF_MANY :
                                                    OBJECT_ATTRIBUTE_IDREF_SINGLE;
                        }
                        case ExtendedMetaData.SIMPLE_FEATURE: {
                            if (f == XMLTypePackage.Literals.SIMPLE_ANY_TYPE__INSTANCE_TYPE) {
                                return TRANSIENT;
                            }
                        }
                        case ExtendedMetaData.ELEMENT_FEATURE: {
                            return
                                    r.isResolveProxies() ?
                                            isMany ?
                                                    OBJECT_ELEMENT_MANY :
                                                    r.isUnsettable() ?
                                                            OBJECT_ELEMENT_SINGLE_UNSETTABLE :
                                                            OBJECT_ELEMENT_SINGLE :
                                            isMany ?
                                                    OBJECT_ELEMENT_IDREF_MANY :
                                                    r.isUnsettable() ?
                                                            OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE :
                                                            OBJECT_ELEMENT_IDREF_SINGLE;
                        }
                    }
                }

                return
                        isMany ?
                                isUnsettable ? OBJECT_HREF_MANY_UNSETTABLE : OBJECT_HREF_MANY :
                                isUnsettable ? OBJECT_HREF_SINGLE_UNSETTABLE : OBJECT_HREF_SINGLE;
            } else {
                // Attribute
                EDataType d = (EDataType) f.getEType();
                if (!d.isSerializable() && d != EcorePackage.Literals.EFEATURE_MAP_ENTRY) {
                    return TRANSIENT;
                }

                if (d.getInstanceClass() == FeatureMap.Entry.class) {
                    return
                            extendedMetaData != null && extendedMetaData.getFeatureKind(f) == ExtendedMetaData.ATTRIBUTE_WILDCARD_FEATURE ?
                                    ATTRIBUTE_FEATURE_MAP :
                                    ELEMENT_FEATURE_MAP;
                }

                if (extendedMetaData != null) {
                    switch (extendedMetaData.getFeatureKind(f)) {
                        case ExtendedMetaData.SIMPLE_FEATURE: {
                            return DATATYPE_ELEMENT_SINGLE;
                        }
                        case ExtendedMetaData.ELEMENT_FEATURE: {
                            return f.isMany() ? DATATYPE_MANY : DATATYPE_ELEMENT_SINGLE;
                        }
                        case ExtendedMetaData.ATTRIBUTE_FEATURE: {
                            return f.isMany() ? DATATYPE_ATTRIBUTE_MANY : DATATYPE_SINGLE;
                        }
                    }
                }

                if (isMany) {
                    return DATATYPE_MANY;
                }

                if (isUnsettable && map == null) {
                    return DATATYPE_SINGLE_NILLABLE;
                }

                if (map == null) {
                    return DATATYPE_SINGLE;
                } else {
                    XMLInfo info = map.getInfo(f);

                    if (info != null && info.getXMLRepresentation() == XMLInfo.ELEMENT) {
                        return DATATYPE_ELEMENT_SINGLE;
                    } else if (info != null && info.getXMLRepresentation() == XMLInfo.CONTENT) {
                        return DATATYPE_CONTENT_SINGLE;
                    } else {
                        if (isUnsettable) {
                            return DATATYPE_SINGLE_NILLABLE;
                        } else {
                            return DATATYPE_SINGLE;
                        }
                    }
                }
            }
        }