Esempio n. 1
0
        internal NamespaceBuilder CreateNamespace(Importer.XmlReader reader, string uri, string prefix, string qualifiedName)
        {
            if (qualifiedName == null)
            {
                qualifiedName = "Ns" + (++this.namespaceCounter);
            }
            NamespaceBuilder result = this.GetNamespace(uri);

            if (result != null)
            {
                if (result.Uri != uri)
                {
                    this.AddWarning("Namespace '" + result.FullName + "' has conflicting URIs: '" + result.FullName + "' and '" + uri + "'", reader.Uri, LinePositionSpan.Zero);
                }
                return(result);
            }
            string[]         names     = qualifiedName.Split('.');
            int              i         = 0;
            NamespaceBuilder currentNs = null;

            while (i < names.Length)
            {
                if (i == 0)
                {
                    NamespaceBuilder rootNs = this.Model.Symbols.OfType <NamespaceBuilder>().FirstOrDefault(ns => ns.Name == names[0] && ns.Namespace == null);
                    currentNs = rootNs;
                }
                else
                {
                    currentNs = currentNs.Declarations.OfType <NamespaceBuilder>().FirstOrDefault(ns => ns.Name == names[i]);
                }
                if (currentNs != null)
                {
                    ++i;
                }
                else
                {
                    NamespaceBuilder parentNs = currentNs;
                    while (i < names.Length)
                    {
                        NamespaceBuilder ns = this.Factory.Namespace();
                        ns.Name      = names[i];
                        ns.Namespace = parentNs;
                        ++i;
                        if (i == names.Length)
                        {
                            ns.Prefix = prefix;
                            ns.Uri    = uri;
                            result    = ns;
                            this.namespaces.Add(uri, ns);
                        }
                        parentNs = ns;
                    }
                }
            }
            return(result);
        }
Esempio n. 2
0
        private void RegisterReader(string uri, Importer.XmlReader reader)
        {
            HashSet <Importer.XmlReader> rs;

            if (!this.readers.TryGetValue(uri, out rs))
            {
                rs = new HashSet <Importer.XmlReader>();
                this.readers.Add(uri, rs);
            }
            rs.Add(reader);
        }
Esempio n. 3
0
        internal TObject Register(Importer.XmlReader reader, XName xname, TXObject xobj, TObject obj, bool allowReverse = true)
        {
            TObject oldObject = null;

            if (this.objectsByName.TryGetValue(xname, out oldObject))
            {
                TXObject oldElem = this.elementsByObject[oldObject];
                this.importer.AddError("The " + this.name + " '" + xname + "' is already imported from '" + oldElem.BaseUri + "' at '" + SoalImporter.GetLinePositionSpan(oldElem) + "'.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj));
                return(null);
            }
            if (this.objectsByElement.TryGetValue(xobj, out oldObject))
            {
                TXObject oldElem = this.elementsByObject[oldObject];
                this.importer.AddError("The " + this.name + " '" + xname + "' has already an object assigned to it.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj));
                return(null);
            }
            TXObject oldXObject = null;

            if (this.elementsByName.TryGetValue(xname, out oldXObject))
            {
                this.importer.AddError("The " + this.name + " '" + xname + "' is already registered to '" + oldXObject.BaseUri + "' at '" + SoalImporter.GetLinePositionSpan(oldXObject) + "'.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj));
                return(null);
            }
            this.objectsByName.Add(xname, obj);
            this.objectsByElement.Add(xobj, obj);
            this.elementsByName.Add(xname, xobj);
            if (allowReverse)
            {
                if (this.elementsByObject.TryGetValue(obj, out oldXObject))
                {
                    this.importer.AddError("The object is alredy registered to " + this.name + " in '" + oldXObject.BaseUri + "' at '" + SoalImporter.GetLinePositionSpan(oldXObject) + "'.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj));
                    return(null);
                }
                if (!this.elementsByObject.ContainsKey(obj))
                {
                    this.elementsByObject.Add(obj, xobj);
                }
            }
            return(obj);
        }