/// <summary>
 /// This is used by the supported file to inform the supporting file that it is, in fact, dependednt on it.
 /// </summary>
 /// <param name="R">a descriptor of the </param>
 public virtual void AddSupported(ElementRelationship R)
 {
     if (!this.Supports.ContainsKey(R.Dependent.name))
     {
         this.Supports.Add(R.Dependent.name, R);
     }
 }
 public virtual void ParseDepends()
 {
     foreach (ParseFeature p in Parsers)
     {
         // Apply all configured parsers and then resolve the references.
         string[] S = p.parse(this);
         foreach (string s in S)
         {
             if (s.IndexOfAny(forbiddenchars) > -1)
             {
                 Console.Out.WriteLine("forbidden char");
             }
             else
             {
                 ElementRelationship R = Resolver.ResolveReference(this.name, s, p.Type);
                 //this.Depends.AddLast(R);
                 if (!this.Depends.ContainsKey(s))
                 {
                     this.Depends.Add(s, R);
                     if (R.Supporter != null)
                     {
                         R.Supporter.AddSupported(R);
                     }
                 }
             }
         }
     }
 }
        /// <summary>
        /// Performs the basic check for the value in the existing hash tables, so we don't do it for every single type of element
        /// </summary>
        /// <param name="relObj">Existing relation object</param>
        /// <param name="a">Name of the resource</param>
        /// <returns>Returns whether the item was created or successfully added.</returns>
        private bool BasicResolve(ElementRelationship relObj, string a)
        {
            bool retval = false;

            if (this.Elements.ContainsKey(a))
            {
                relObj.Supporter = this.Elements[a];
            }
            else if (tmpElements.ContainsKey(a))
            {
                relObj.Supporter = tmpElements[a];
            }
            else
            {
                System.Console.Out.WriteLine("Unknown supporter: " + a);
                ProgramElement R = new RumpElement(a);
                tmpElements.Add(a, R);
                relObj.Supporter = R;
                retval           = true;
            }
            return(retval);
        }
        /// <summary>
        /// Constructs the relationobject and guarantees that the component objects exist in the hash table.
        /// </summary>
        /// <param name="CompleteFileName">Name of the Dependent Element (calling or including or Linking out to... )</param>
        /// <param name="ReferenceFileName">Name of the Required Element (called, created, loaded, or instantiated)</param>
        /// <param name="Type">The type of reference</param>
        /// <returns>Elementrelationship with object pointers to elements</returns>
        /// Note : Elements can include Absolute filenames (which must be unique) or ClassIDs (similarly unique) or URLS (similarly unique)
        /// While building the list of elements, Put new Elements into tmpElements to avoid issues with Iterator Disruption
        ElementRelationship IResolver.ResolveReference(string CompleteFileName, string ReferenceFileName, RelationShipType Type)
        {
            CompleteFileName  = CompleteFileName.ToLower();
            ReferenceFileName = ReferenceFileName.ToLower();
            ElementRelationship retval = new ElementRelationship();

            retval.Dependent = this.Elements[CompleteFileName];
            retval.Relation  = Type;

            if (Type == RelationShipType.RelationCOM)
            {
                if (BasicResolve(retval, ReferenceFileName))
                {
                    System.Console.Out.WriteLine("Unknown COM supporter: " + ReferenceFileName);
                }
                retval.Supporter.ElementType = ElementType.COMobject;

                return(retval);
            } // End COM relation

            if (Type == RelationShipType.RelationLink)
            { // Must handle Http:// , or relative files (my.css, my.html, /subdir/subsubdir/my.html, ~/Food/my.aspx.
                if (ReferenceFileName.IndexOf("://") >= 0)
                {
                    // it's an HTTP tag.
                    if (this.Elements.ContainsKey(ReferenceFileName))
                    {
                        retval.Supporter = Elements[ReferenceFileName];
                        return(retval);
                    }
                    else if (this.tmpElements.ContainsKey(ReferenceFileName))
                    {
                        retval.Supporter = tmpElements[ReferenceFileName];
                        return(retval);
                    }
                    else
                    {
                    }
                }
            }
            if (Type == RelationShipType.RelationInclude)
            {
                // have to make sure that paths are appropriately combined.
                // Given c:\p1\p2\p3\p4\source.txt and ..\..\inc\foo\myfile.txt give :

                if (ReferenceFileName.Contains("/"))
                {
                    ReferenceFileName = ReferenceFileName.Replace("/", "\\");
                }
                string b = CompleteFileName.Remove(CompleteFileName.Length - Path.GetFileName(CompleteFileName).Length);
                string c = Path.GetFullPath(RootFolderName + ReferenceFileName).ToLower();
                string a = Path.GetFullPath(b + ReferenceFileName).ToLower();

                if (this.Elements.ContainsKey(a))
                {
                    retval.Supporter = this.Elements[a];
                    return(retval);
                }
                else if (this.Elements.ContainsKey(c))
                {
                    retval.Supporter = this.Elements[c];
                    return(retval);
                }
                else if (this.tmpElements.ContainsKey(a))
                {
                    retval.Supporter = this.tmpElements[a];
                    return(retval);
                }
                System.Console.Out.WriteLine("Unknown File supporter: " + a);
                ProgramElement R = new RumpElement(a);
                R.ElementType = ElementType.BinaryFile;
                tmpElements.Add(a, R);
                retval.Supporter = R;
                return(retval);
            }

            return(retval);
        }