Esempio n. 1
0
        private void Merge(String baseFolder, IEnumerable <FrameworkEntity> list, TextWriter writer)
        {
            if (list.Count() < 2)
            {
                this.Log(Level.Error, "Cannot merge less than 2 entities");
            }

            IEnumerable <FrameworkEntityType> types = list.Select(e => e.type).Distinct();

            if (types.Count() > 1)
            {
                this.Log(Level.Error, "Cannot merge different type of entities");
            }

            IEnumerable <String> files = list.Select(e => e.GetPath(baseFolder, DocumentType.Model));

            if (files.Count() < list.Count())
            {
                this.Log(Level.Error, "Cannot merge because some entities have no path.");
            }

            Action <TypedEntity, TypedEntity> mergeFunctions  = (t1, t2) => Merge <FunctionEntity>(t1.Functions, t2.Functions, new FunctionComparer());
            Action <ClassEntity, ClassEntity> mergeMethods    = (c1, c2) => Merge <MethodEntity>(c1.Methods, c2.Methods, new MethodComparer());
            Action <ClassEntity, ClassEntity> mergeProperties = (c1, c2) => Merge <PropertyEntity>(c1.Properties, c2.Properties, new PropertyComparer());

            if (writer != null)
            {
                foreach (var e in list)
                {
                    writer.WriteLine("    Merging {0}", e.name);
                }
            }

            FrameworkEntityType type = types.First();

            switch (type)
            {
            case FrameworkEntityType.T:
                LoadAndMerge <TypedEntity>(files, writer, mergeFunctions);
                break;

            case FrameworkEntityType.C:
                LoadAndMerge <ClassEntity>(files, writer, mergeFunctions, mergeMethods, mergeProperties);
                break;

            case FrameworkEntityType.P:
                LoadAndMerge <ProtocolEntity>(files, writer, mergeFunctions, mergeMethods, mergeProperties);
                break;
            }
        }
Esempio n. 2
0
        protected T FindAndLoad <T>(String baseFolder, IList <FrameworkEntity> entities, FrameworkEntityType type, String name, bool useCache = true) where T : BaseEntity
        {
            if (String.IsNullOrEmpty(name))
            {
                return(null);
            }

            // Try the cache first
            String     key    = type + ":" + name;
            BaseEntity result = null;

            if (useCache && !cache.TryGetValue(key, out result))
            {
                //this.Log (Level.Verbose, "Cache miss for '" + type + "' and name '" + name + "'");

                var             candidates = entities.Where(e => e.type == type && e.name == name).ToList();
                FrameworkEntity candidate  = candidates.FirstOrDefault();

                // Print a warning if multiple
                if (candidates.Count > 1)
                {
                    this.Log(Level.Warning, "Found several entities with the type '" + type + "' and name '" + name + "'");
                }

                if (candidate != null)
                {
                    String file = candidate.GetPath(baseFolder, DocumentType.Model);
                    result = BaseEntity.LoadFrom <T> (file);
                }
            }
            else
            {
                //this.Log (Level.Verbose, "Cache hit for '" + type + "' and name '" + name + "'");
            }

            // Add to MRU
            if (useCache && result != null)
            {
                cache.Add(key, result);
            }

            return(result as T);
        }