internal static NormalizedName DefaultNameNormalizerForEDM(EFElement parent, string refName)
        {
            var            model          = ModelHelper.GetBaseModelRoot(parent);
            NormalizedName normalizedName = null;

            if (model != null)
            {
                string potentialAliasOrNamespacePart = null;
                string nonAliasOrNamespacePart       = null;
                SeparateRefNameIntoParts(refName, out potentialAliasOrNamespacePart, out nonAliasOrNamespacePart);

                // does the name start with the schema's namespace or alias?
                if (!string.IsNullOrEmpty(potentialAliasOrNamespacePart))
                {
                    refName = nonAliasOrNamespacePart;
                    var symbol = new Symbol(model.NamespaceValue, refName);

                    if (potentialAliasOrNamespacePart.Equals(model.NamespaceValue, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // it starts with the namespace
                        normalizedName = new NormalizedName(symbol, null, model.NamespaceValue, refName);
                    }
                    else if (potentialAliasOrNamespacePart.Equals(model.AliasValue, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // it starts with the alias
                        normalizedName = new NormalizedName(symbol, model.AliasValue, null, refName);
                    }
                }
                else
                {
                    // now, the name doesn't start with the alias or the namespace, so tack on the namespace
                    var symbol = new Symbol(model.NamespaceValue, refName);
                    normalizedName = new NormalizedName(symbol, null, null, refName);
                }
            }
            else
            {
                var symbol = new Symbol(refName);
                normalizedName = new NormalizedName(symbol, null, null, refName);
            }
            return(normalizedName);
        }
        internal static NormalizedName DefaultNameNormalizerForEDM(EFElement parent, string refName)
        {
            var model = ModelHelper.GetBaseModelRoot(parent);
            NormalizedName normalizedName = null;
            if (model != null)
            {
                string potentialAliasOrNamespacePart = null;
                string nonAliasOrNamespacePart = null;
                SeparateRefNameIntoParts(refName, out potentialAliasOrNamespacePart, out nonAliasOrNamespacePart);

                // does the name start with the schema's namespace or alias?
                if (!string.IsNullOrEmpty(potentialAliasOrNamespacePart))
                {
                    refName = nonAliasOrNamespacePart;
                    var symbol = new Symbol(model.NamespaceValue, refName);

                    if (potentialAliasOrNamespacePart.Equals(model.NamespaceValue, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // it starts with the namespace
                        normalizedName = new NormalizedName(symbol, null, model.NamespaceValue, refName);
                    }
                    else if (potentialAliasOrNamespacePart.Equals(model.AliasValue, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // it starts with the alias
                        normalizedName = new NormalizedName(symbol, model.AliasValue, null, refName);
                    }
                }
                else
                {
                    // now, the name doesn't start with the alias or the namespace, so tack on the namespace
                    var symbol = new Symbol(model.NamespaceValue, refName);
                    normalizedName = new NormalizedName(symbol, null, null, refName);
                }
            }
            else
            {
                var symbol = new Symbol(refName);
                normalizedName = new NormalizedName(symbol, null, null, refName);
            }
            return normalizedName;
        }
        internal static NormalizedName DefaultNameNormalizerForMSL(EFElement parent, string refName)
        {
            var model = MappingModel.GetMappingRoot(parent);

            string potentialAliasOrNamespacePart = null;
            string nonAliasOrNamespacePart = null;
            SeparateRefNameIntoParts(refName, out potentialAliasOrNamespacePart, out nonAliasOrNamespacePart);

            Symbol symbol = null;
            NormalizedName normalizedName = null;

            if (!string.IsNullOrEmpty(potentialAliasOrNamespacePart))
            {
                // see if our type name starts with any of the defined aliases
                var startsWithAlias = false;

                foreach (var a in model.Aliases())
                {
                    if (potentialAliasOrNamespacePart.Equals(a.Key.Value, StringComparison.CurrentCultureIgnoreCase))
                    {
                        if (a.State == EFElementState.Parsed)
                        {
                            // alias is only in a parsed state, skip for now and don't add an error
                            // we'll end up looping around again later once its been resolved
                            return new NormalizedName(new Symbol(refName), null, null, refName);
                        }

                        if (a.State != EFElementState.Resolved
                            || a.Value.Status != BindingStatus.Known)
                        {
                            var msg = string.Format(CultureInfo.CurrentCulture, Resources.RESOLVE_UNRESOLVED_ALIAS, refName);
                            var artifactSet = parent.Artifact.ModelManager.GetArtifactSet(parent.Artifact.Uri);
                            var errorInfo = new ErrorInfo(
                                ErrorInfo.Severity.ERROR, msg, parent, ErrorCodes.RESOLVE_UNRESOLVED_ALIAS, ErrorClass.ResolveError);
                            artifactSet.AddError(errorInfo);
                            return new NormalizedName(new Symbol(String.Empty), null, null, refName);
                        }

                        // in the symbol replace alias with the full namespace
                        symbol = new Symbol(a.Value.Target.Namespace.Value, nonAliasOrNamespacePart);
                        normalizedName = new NormalizedName(symbol, a.Key.Value, null, nonAliasOrNamespacePart);

                        startsWithAlias = true;
                        break;
                    }
                }

                if (startsWithAlias == false
                    && model.Artifact.ConceptualModel() != null
                    && model.Artifact.StorageModel() != null)
                {
                    var conceptualNamespace = model.Artifact.ConceptualModel().Namespace.Value;
                    var storageNamespace = model.Artifact.StorageModel().Namespace.Value;
                    var currentNamespace = string.Empty;

                    var convertIt = false;

                    var startsWithConceptualNamespace = false;
                    var startsWithStorageNamespace = false;

                    if (potentialAliasOrNamespacePart.Equals(conceptualNamespace, StringComparison.CurrentCultureIgnoreCase))
                    {
                        startsWithConceptualNamespace = true;
                    }

                    if (potentialAliasOrNamespacePart.Equals(storageNamespace, StringComparison.CurrentCultureIgnoreCase))
                    {
                        startsWithStorageNamespace = true;
                    }

                    if (startsWithConceptualNamespace && startsWithStorageNamespace)
                    {
                        // in this case, the two namespaces start with the same thing and we got a match
                        // on both; for example if there is pubsModel & pubsModel.Store and we are checking
                        // on a string 'pubsModel.Store.Customer'; whichever is longer is the real one
                        if (conceptualNamespace.Length > storageNamespace.Length)
                        {
                            currentNamespace = conceptualNamespace;
                            convertIt = true;
                        }
                        else
                        {
                            currentNamespace = storageNamespace;
                            convertIt = true;
                        }
                    }
                    else if (startsWithConceptualNamespace)
                    {
                        currentNamespace = conceptualNamespace;
                        convertIt = true;
                    }
                    else if (startsWithStorageNamespace)
                    {
                        currentNamespace = storageNamespace;
                        convertIt = true;
                    }

                    if (convertIt)
                    {
                        // convert to our normalized name format
                        symbol = new Symbol(currentNamespace, nonAliasOrNamespacePart);
                        normalizedName = new NormalizedName(symbol, null, currentNamespace, nonAliasOrNamespacePart);
                    }
                }
            }

            if (symbol == null)
            {
                // either there was no Alias or Namespace part or it didn't
                // match any of the known Aliases or Namespaces
                symbol = new Symbol(refName);
                normalizedName = new NormalizedName(symbol, null, null, refName);
            }

            return normalizedName;
        }
        internal static NormalizedName DefaultNameNormalizerForMSL(EFElement parent, string refName)
        {
            var model = MappingModel.GetMappingRoot(parent);

            string potentialAliasOrNamespacePart = null;
            string nonAliasOrNamespacePart       = null;

            SeparateRefNameIntoParts(refName, out potentialAliasOrNamespacePart, out nonAliasOrNamespacePart);

            Symbol         symbol         = null;
            NormalizedName normalizedName = null;

            if (!string.IsNullOrEmpty(potentialAliasOrNamespacePart))
            {
                // see if our type name starts with any of the defined aliases
                var startsWithAlias = false;

                foreach (var a in model.Aliases())
                {
                    if (potentialAliasOrNamespacePart.Equals(a.Key.Value, StringComparison.CurrentCultureIgnoreCase))
                    {
                        if (a.State == EFElementState.Parsed)
                        {
                            // alias is only in a parsed state, skip for now and don't add an error
                            // we'll end up looping around again later once its been resolved
                            return(new NormalizedName(new Symbol(refName), null, null, refName));
                        }

                        if (a.State != EFElementState.Resolved ||
                            a.Value.Status != BindingStatus.Known)
                        {
                            var msg         = string.Format(CultureInfo.CurrentCulture, Resources.RESOLVE_UNRESOLVED_ALIAS, refName);
                            var artifactSet = parent.Artifact.ModelManager.GetArtifactSet(parent.Artifact.Uri);
                            var errorInfo   = new ErrorInfo(
                                ErrorInfo.Severity.ERROR, msg, parent, ErrorCodes.RESOLVE_UNRESOLVED_ALIAS, ErrorClass.ResolveError);
                            artifactSet.AddError(errorInfo);
                            return(new NormalizedName(new Symbol(String.Empty), null, null, refName));
                        }

                        // in the symbol replace alias with the full namespace
                        symbol         = new Symbol(a.Value.Target.Namespace.Value, nonAliasOrNamespacePart);
                        normalizedName = new NormalizedName(symbol, a.Key.Value, null, nonAliasOrNamespacePart);

                        startsWithAlias = true;
                        break;
                    }
                }

                if (startsWithAlias == false &&
                    model.Artifact.ConceptualModel() != null &&
                    model.Artifact.StorageModel() != null)
                {
                    var conceptualNamespace = model.Artifact.ConceptualModel().Namespace.Value;
                    var storageNamespace    = model.Artifact.StorageModel().Namespace.Value;
                    var currentNamespace    = string.Empty;

                    var convertIt = false;

                    var startsWithConceptualNamespace = false;
                    var startsWithStorageNamespace    = false;

                    if (potentialAliasOrNamespacePart.Equals(conceptualNamespace, StringComparison.CurrentCultureIgnoreCase))
                    {
                        startsWithConceptualNamespace = true;
                    }

                    if (potentialAliasOrNamespacePart.Equals(storageNamespace, StringComparison.CurrentCultureIgnoreCase))
                    {
                        startsWithStorageNamespace = true;
                    }

                    if (startsWithConceptualNamespace && startsWithStorageNamespace)
                    {
                        // in this case, the two namespaces start with the same thing and we got a match
                        // on both; for example if there is pubsModel & pubsModel.Store and we are checking
                        // on a string 'pubsModel.Store.Customer'; whichever is longer is the real one
                        if (conceptualNamespace.Length > storageNamespace.Length)
                        {
                            currentNamespace = conceptualNamespace;
                            convertIt        = true;
                        }
                        else
                        {
                            currentNamespace = storageNamespace;
                            convertIt        = true;
                        }
                    }
                    else if (startsWithConceptualNamespace)
                    {
                        currentNamespace = conceptualNamespace;
                        convertIt        = true;
                    }
                    else if (startsWithStorageNamespace)
                    {
                        currentNamespace = storageNamespace;
                        convertIt        = true;
                    }

                    if (convertIt)
                    {
                        // convert to our normalized name format
                        symbol         = new Symbol(currentNamespace, nonAliasOrNamespacePart);
                        normalizedName = new NormalizedName(symbol, null, currentNamespace, nonAliasOrNamespacePart);
                    }
                }
            }

            if (symbol == null)
            {
                // either there was no Alias or Namespace part or it didn't
                // match any of the known Aliases or Namespaces
                symbol         = new Symbol(refName);
                normalizedName = new NormalizedName(symbol, null, null, refName);
            }

            return(normalizedName);
        }