public static string getID(EObject eObject)
        {
            EClass     eClass       = eObject.eClass();
            EAttribute eIDAttribute = eClass.eIDAttribute;

            return(eIDAttribute == null || !eObject.eIsSet(eIDAttribute) ? null : convertToString(
                       eIDAttribute.eAttributeType,
                       eObject.eGet(eIDAttribute)));
        }
        protected bool validate_DataValueConforms(EObject eObject, EAttribute eAttribute, DiagnosticChain diagnostics, Dictionary <object, object> context)
        {
            if (!eObject.eIsSet(eAttribute))
            {
                return(true);
            }
            bool      result    = true;
            EDataType eDataType = eAttribute.eAttributeType;

            EValidator rootValidator = getRootEValidator(context);
            object     value         = eObject.eGet(eAttribute);

            /*
             * if (FeatureMapUtil.isFeatureMap(eAttribute))
             * {
             *  Collection<FeatureMap.Entry> featureMap = (Collection<FeatureMap.Entry>)value;
             *  EClass eClass = eObject.eClass();
             *  Dictionary<EStructuralFeature, DiagnosticChain> entryFeatureToDiagnosticChainMap = null;
             *  for (Iterator<FeatureMap.Entry> i = featureMap.iterator(); i.hasNext() && (result || diagnostics != null);)
             *  {
             *      FeatureMap.Entry entry = i.next();
             *      EStructuralFeature entryFeature = entry.getEStructuralFeature();
             *      if (entryFeature instanceof EAttribute &&
             *            ExtendedMetaData.INSTANCE.getAffiliation(eClass, entryFeature) == eAttribute)
             *      {
             *          EDataType entryType = (EDataType)entryFeature.getEType();
             *          Object entryValue = entry.getValue();
             *          bool entryIsValid = rootValidator.validate(entryType, entryValue, null, context);
             *          if (!entryIsValid)
             *          {
             *              result = false;
             *              if (diagnostics != null)
             *              {
             *                  if (entryFeatureToDiagnosticChainMap == null)
             *                  {
             *                      entryFeatureToDiagnosticChainMap = new HashMap<EStructuralFeature, DiagnosticChain>();
             *                  }
             *                  DiagnosticChain entryFeatureDiagnostic = entryFeatureToDiagnosticChainMap.get(entryFeature);
             *                  if (entryFeatureDiagnostic == null)
             *                  {
             *                      entryFeatureDiagnostic = createBadDataValueDiagnostic(eObject, (EAttribute)entryFeature, diagnostics, context);
             *                      entryFeatureToDiagnosticChainMap.put(entryFeature, entryFeatureDiagnostic);
             *                  }
             *                  rootValidator.validate(entryType, entryValue, entryFeatureDiagnostic, context);
             *              }
             *          }
             *      }
             *  }
             * }
             * else*/
            if (eAttribute.many)
            {
                foreach (object item in value as IList <object> )
                {
                    result &= rootValidator.validate(eDataType, item, null, context);
                }


                if (!result && diagnostics != null)
                {
                    DiagnosticChain diagnostic = createBadDataValueDiagnostic(eObject, eAttribute, diagnostics, context);

                    foreach (object item in value as IList <object> )
                    {
                        rootValidator.validate(eDataType, item, diagnostic, context);
                    }
                }
            }
            else if (value != null)
            {
                result = rootValidator.validate(eDataType, value, null, context);
                if (!result && diagnostics != null)
                {
                    DiagnosticChain diagnostic = createBadDataValueDiagnostic(eObject, eAttribute, diagnostics, context);
                    rootValidator.validate(eDataType, value, diagnostic, context);
                }
            }

            return(result);
        }
        public bool validate_EveryProxyResolves(EObject eObject, DiagnosticChain diagnostics, Dictionary <object, object> context)
        {
            bool result = true;

            foreach (EReference reference in eObject.eClass().eAllReferences)
            {
                if (eObject.eIsSet(reference))
                {
                    EObject eCrossReferenceObject = eObject.eGet(reference) as EObject;


                    if (eCrossReferenceObject.eIsProxy())
                    {
                        result = false;
                        if (diagnostics != null)
                        {
                            diagnostics.add
                                (createDiagnostic
                                    (BasicDiagnostic.ERROR,
                                    DIAGNOSTIC_SOURCE,
                                    EOBJECT__EVERY_PROXY_RESOLVES,
                                    "_UI_UnresolvedProxy_diagnostic",
                                    new Object[]
                            {
                                getFeatureLabel(reference, context),
                                getObjectLabel(eObject, context),
                                getObjectLabel(eCrossReferenceObject, context)
                            },
                                    new Object[] { eObject, reference, eCrossReferenceObject },
                                    context));
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }


            //for (EContentsEList.FeatureIterator<EObject> i = (EContentsEList.FeatureIterator<EObject>)eObject.eCrossReferences().iterator(); i.hasNext();)

            /*
             * foreach (EObject eCrossReferenceObject in eObject.eCrossReferences())
             * {
             *  //EObject eCrossReferenceObject = i.next();
             *  if (eCrossReferenceObject.eIsProxy())
             *  {
             *      result = false;
             *      if (diagnostics != null)
             *      {
             *          diagnostics.add
             *            (createDiagnostic
             *              (BasicDiagnostic.ERROR,
             *               DIAGNOSTIC_SOURCE,
             *               EOBJECT__EVERY_PROXY_RESOLVES,
             *               "_UI_UnresolvedProxy_diagnostic",
             *               new Object[]
             *               {
             *   getFeatureLabel(i.feature(), context),
             *   getObjectLabel(eObject, context),
             *   getObjectLabel(eCrossReferenceObject, context)
             *               },
             *               new Object[] { eObject, i.feature(), eCrossReferenceObject },
             *               context));
             *      }
             *      else
             *      {
             *          break;
             *      }
             *  }
             * }
             */
            return(result);
        }
        public bool validate_EveryReferenceIsContained(EObject eObject, DiagnosticChain diagnostics, Dictionary <object, object> context)
        {
            bool result = true;

            if (eObject.eResource() != null)
            {
                foreach (EReference reference in eObject.eClass().eAllReferences)
                {
                    if (eObject.eIsSet(reference))
                    {
                        EObject eCrossReferenceObject = eObject.eGet(reference) as EObject;

                        if (eCrossReferenceObject.eResource() == null && !eCrossReferenceObject.eIsProxy() && !reference.transient)
                        {
                            result = false;
                            if (diagnostics != null)
                            {
                                diagnostics.add
                                    (createDiagnostic
                                        (BasicDiagnostic.ERROR,
                                        DIAGNOSTIC_SOURCE,
                                        EOBJECT__EVERY_REFERENCE_IS_CONTAINED,
                                        "_UI_DanglingReference_diagnostic",
                                        new Object[]
                                {
                                    getFeatureLabel(reference, context),
                                    getObjectLabel(eObject, context),
                                    getObjectLabel(eCrossReferenceObject, context)
                                },
                                        new Object[] { eObject, reference, eCrossReferenceObject },
                                        context));
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }

                /*
                 * for (EContentsEList.FeatureIterator<EObject> i = (EContentsEList.FeatureIterator<EObject>)eObject.eCrossReferences().iterator(); i.hasNext();)
                 * {
                 *  EObject eCrossReferenceObject = i.next();
                 *  if (eCrossReferenceObject.eResource() == null && !eCrossReferenceObject.eIsProxy() && !i.feature().isTransient())
                 *  {
                 *      result = false;
                 *      if (diagnostics != null)
                 *      {
                 *          diagnostics.add
                 *            (createDiagnostic
                 *              (BasicDiagnostic.ERROR,
                 *               DIAGNOSTIC_SOURCE,
                 *               EOBJECT__EVERY_REFERENCE_IS_CONTAINED,
                 *               "_UI_DanglingReference_diagnostic",
                 *               new Object[]
                 *               {
                 * getFeatureLabel(i.feature(), context),
                 * getObjectLabel(eObject, context),
                 * getObjectLabel(eCrossReferenceObject, context)
                 *               },
                 *               new Object[] { eObject, i.feature(), eCrossReferenceObject },
                 *               context));
                 *      }
                 *      else
                 *      {
                 *          break;
                 *      }
                 *  }
                 * }
                 */
            }
            return(result);
        }
        protected bool validate_MultiplicityConforms
            (EObject eObject, EStructuralFeature eStructuralFeature, DiagnosticChain diagnostics, Dictionary <object, object> context)
        {
            bool result = true;

            if (eStructuralFeature.many)
            {
                if (false)
                {
                    /*
                     * if (FeatureMapUtil.isFeatureMap(eStructuralFeature) && ExtendedMetaData.INSTANCE.isDocumentRoot(eObject.eClass()))
                     * {
                     *  FeatureMap featureMap = (FeatureMap)eObject.eGet(eStructuralFeature);
                     *  int count = 0;
                     *  for (int i = 0, size = featureMap.size(); i < size; ++i)
                     *  {
                     *      EStructuralFeature feature = featureMap.getEStructuralFeature(i);
                     *      int kind = ExtendedMetaData.INSTANCE.getFeatureKind(feature);
                     *      if (kind == ExtendedMetaData.ELEMENT_FEATURE &&
                     *            feature != XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__CDATA &&
                     *            feature != XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__COMMENT &&
                     *            feature != XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__TEXT &&
                     *            feature != XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__PROCESSING_INSTRUCTION &&
                     ++count > 1)
                     *      {
                     *          result = false;
                     *          break;
                     *      }
                     *  }
                     *  if (count != 1)
                     *  {
                     *      result = false;
                     *      if (diagnostics != null)
                     *      {
                     *          diagnostics.add
                     *            (createDiagnostic
                     *              (Diagnostic.ERROR,
                     *               DIAGNOSTIC_SOURCE,
                     *               EOBJECT__EVERY_MULTIPCITY_CONFORMS,
                     *               "_UI_DocumentRootMustHaveOneElement_diagnostic",
                     *                new Object[]
                     *                {
                     *  getFeatureLabel(eStructuralFeature, context),
                     *  getObjectLabel(eObject, context),
                     *  count
                     *                },
                     *               new Object[] { eObject, eStructuralFeature },
                     *               context));
                     *      }
                     *  }
                     */
                }
                else
                {
                    int lowerBound = eStructuralFeature.lowerBound;
                    if (lowerBound > 0)
                    {
                        int size = ((List <object>)eObject.eGet(eStructuralFeature)).Count;
                        if (size < lowerBound)
                        {
                            result = false;
                            if (diagnostics != null)
                            {
                                diagnostics.add
                                    (createDiagnostic
                                        (BasicDiagnostic.ERROR,
                                        DIAGNOSTIC_SOURCE,
                                        EOBJECT__EVERY_MULTIPCITY_CONFORMS,
                                        "_UI_FeatureHasTooFewValues_diagnostic",
                                        new Object[]
                                {
                                    getFeatureLabel(eStructuralFeature, context),
                                    getObjectLabel(eObject, context),
                                    size,
                                    lowerBound
                                },
                                        new Object[] { eObject, eStructuralFeature },
                                        context));
                            }
                        }
                        int upperBound = eStructuralFeature.upperBound;
                        if (upperBound > 0 && size > upperBound)
                        {
                            result = false;
                            if (diagnostics != null)
                            {
                                diagnostics.add
                                    (createDiagnostic
                                        (BasicDiagnostic.ERROR,
                                        DIAGNOSTIC_SOURCE,
                                        EOBJECT__EVERY_MULTIPCITY_CONFORMS,
                                        "_UI_FeatureHasTooManyValues_diagnostic",
                                        new Object[]
                                {
                                    getFeatureLabel(eStructuralFeature, context),
                                    getObjectLabel(eObject, context),
                                    size,
                                    upperBound
                                },
                                        new Object[] { eObject, eStructuralFeature },
                                        context));
                            }
                        }
                    }
                    else
                    {
                        int upperBound = eStructuralFeature.upperBound;
                        if (upperBound > 0)
                        {
                            int size = ((List <object>)eObject.eGet(eStructuralFeature)).Count;
                            if (size > upperBound)
                            {
                                result = false;
                                if (diagnostics != null)
                                {
                                    diagnostics.add
                                        (createDiagnostic
                                            (BasicDiagnostic.ERROR,
                                            DIAGNOSTIC_SOURCE,
                                            EOBJECT__EVERY_MULTIPCITY_CONFORMS,
                                            "_UI_FeatureHasTooManyValues_diagnostic",
                                            new Object[]
                                    {
                                        getFeatureLabel(eStructuralFeature, context),
                                        getObjectLabel(eObject, context),
                                        size,
                                        upperBound
                                    },
                                            new Object[] { eObject, eStructuralFeature },
                                            context));
                                }
                            }
                        }
                    }
                }
            }
            else if (eStructuralFeature.required)
            {
                if (eStructuralFeature.unsettable ? !eObject.eIsSet(eStructuralFeature) : eObject.eGet(eStructuralFeature, false) == null)
                {
                    result = false;
                    if (diagnostics != null)
                    {
                        diagnostics.add
                            (createDiagnostic
                                (BasicDiagnostic.ERROR,
                                DIAGNOSTIC_SOURCE,
                                EOBJECT__EVERY_MULTIPCITY_CONFORMS,
                                "_UI_RequiredFeatureMustBeSet_diagnostic",
                                new Object[] { getFeatureLabel(eStructuralFeature, context), getObjectLabel(eObject, context) },
                                new Object[] { eObject, eStructuralFeature },
                                context));
                    }
                }
            }

            return(result);
        }