yambroskin

Пример переопределения

Oct 18th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.84 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using EleWise.ELMA.Actions;
  5. using EleWise.ELMA.ComponentModel;
  6. using EleWise.ELMA.Extensions;
  7. using EleWise.ELMA.Model.Mappings;
  8. using EleWise.ELMA.Model.Metadata;
  9. using EleWise.ELMA.Model.Services;
  10. using EleWise.ELMA.Model.Types;
  11. using EleWise.ELMA.Model.Types.Settings;
  12. using EleWise.ELMA.Helpers;
  13. using EleWise.ELMA.Services.Public;
  14. using Yambr.ELMA.MindMap.Models;
  15.  
  16. namespace Yambr.ELMA.MindMap.Services.Impl
  17. {
  18.     [Service]
  19.     public class MindMupMetadataService : IMindMupMetadataService
  20.     {
  21.         public static readonly Dictionary<Guid,int> MetadataMap = new Dictionary<Guid,int>();
  22.  
  23.         private readonly IMetadataRuntimeService _metadataRuntimeService;
  24.         private readonly PublicMetadataService _publicMetadataService;
  25.         public MindMupMetadataService(IMetadataRuntimeService metadataRuntimeService, PublicMetadataService publicMetadataService)
  26.         {
  27.             _metadataRuntimeService = metadataRuntimeService;
  28.             _publicMetadataService = publicMetadataService;
  29.         }
  30.         public MindMup FullMindMup()
  31.         {
  32.             return null;
  33.         }
  34.  
  35.         public MindMup MindMup(ICollection<Guid> typeGuids)
  36.         {
  37.             var mindmup = new MindMup();
  38.             var mupName = "394c.0b22360a-f10d.56446fa45";
  39.             var links = new List<LinkElement>();
  40.             var types = Types().Where(c => typeGuids.Contains(c.Uid)).ToArray();
  41.             for (var i = 0; i < types.Length; i++)
  42.             {
  43.                 const int size = 10;
  44.                 var y = i / size;
  45.                 var x = i < 10 ? i : (i % size);
  46.                 var metadata = types[i].GetMetadata();
  47.                 var mindMupIdea = new MindMupIdea()
  48.                 {                
  49.                     Attr = new IdeaAttrs(x * 100, y * 100)
  50.                 };
  51.                
  52.                 if (metadata is EntityMetadata)
  53.                 {
  54.                     var entityMetadata = (EntityMetadata) metadata;
  55.                     mindMupIdea.Title = entityMetadata.DisplayName;
  56.                     mindMupIdea.Id = Id(entityMetadata, mupName);
  57.                     mindMupIdea.Ideas = GetProperties(mupName, entityMetadata, links, typeGuids);
  58.  
  59.                     if (entityMetadata.BaseClassUid != Guid.Empty)
  60.                     {
  61.                         AddBaseMetadata(typeGuids, entityMetadata, mupName, mindMupIdea, links);
  62.                     }
  63.                     mindmup.Ideas.Add(Id(entityMetadata), mindMupIdea);
  64.  
  65.                 }
  66.                 else if(metadata is EnumMetadata)
  67.                 {
  68.                     var enumMetadata = (EnumMetadata)metadata;
  69.                     mindMupIdea.Title = enumMetadata.DisplayName;
  70.                     mindMupIdea.Id = Id(enumMetadata, mupName);
  71.                     mindMupIdea.Ideas = GetValues(mupName, enumMetadata);
  72.                     mindmup.Ideas.Add(IdByUid(metadata), mindMupIdea);
  73.                 }
  74.             }
  75.            
  76.  
  77.             mindmup.Links = links.ToArray();
  78.             return mindmup;
  79.         }
  80.  
  81.         private void AddBaseMetadata(ICollection<Guid> typeGuids, EntityMetadata entityMetadata, string mupName,
  82.             MindMupIdea mindMupIdea, List<LinkElement> links)
  83.         {
  84.             if(!typeGuids.Contains(entityMetadata.BaseClassUid))
  85.                 typeGuids.Add(entityMetadata.BaseClassUid);
  86.  
  87.             var parentMetsdata = _publicMetadataService.LoadMetadata(entityMetadata.BaseClassUid) as EntityMetadata;
  88.             if (parentMetsdata == null) return;
  89.             var parentId = $"{entityMetadata.Uid}{parentMetsdata.Uid}".GetDeterministicGuid();
  90.             var mupIdea = new MindMupIdea()
  91.             {
  92.                 Id = Id(parentId, mupName),
  93.                 Title = $"#BASE : {parentMetsdata.DisplayName}"
  94.             };
  95.             mindMupIdea.Ideas.Add(Id(parentId), mupIdea);
  96.             var linkElement = new LinkElement()
  97.             {
  98.                 IdeaIdFrom = Id(parentId, mupName),
  99.                 IdeaIdTo = Id(parentMetsdata.Uid, mupName),
  100.             };
  101.             linkElement.Attr.Style.LineStyle = "dashed";
  102.             links.Add(linkElement);
  103.         }
  104.         private static string Id(EntityMetadata metadata, string mupName)
  105.         {
  106.             return $"{Id(metadata)}.{mupName}";
  107.         }
  108.  
  109.         private static string Id(EntityMetadata metadata)
  110.         {
  111.             return Id(metadata.Name.GetDeterministicGuid());
  112.         }
  113.         private static string Id(EnumMetadata metadata, string mupName)
  114.         {
  115.             return $"{IdByUid(metadata)}.{mupName}";
  116.         }
  117.         private static string Id(EnumValueMetadata metadata, string mupName)
  118.         {
  119.             return $"{IdByUid(metadata)}.{mupName}";
  120.         }
  121.  
  122.         private static string Id(IPropertyMetadata metadata, string mupName)
  123.         {
  124.             return $"{IdByUid(metadata)}.{mupName}";
  125.         }
  126.  
  127.         private static string IdByUid(IMetadata metadata)
  128.         {
  129.             var metadataUid = metadata.Uid;
  130.             return Id(metadataUid);
  131.         }
  132.         private static string Id(Guid metadataUid, string mupName)
  133.         {
  134.             return $"{Id(metadataUid)}.{mupName}";
  135.         }
  136.         private static string Id(Guid metadataUid)
  137.         {
  138.             if (!MetadataMap.ContainsKey(metadataUid))
  139.             {
  140.                 var i = MetadataMap.Any() ? MetadataMap.Max(c => c.Value) + 1 : 1;
  141.                 MetadataMap.Add(metadataUid, i);
  142.             }
  143.  
  144.             var metadata1 = MetadataMap[metadataUid];
  145.             return metadata1.ToString();
  146.         }
  147.  
  148.         private Dictionary<string, MindMupIdea> GetValues(string mupName, EnumMetadata publicMetadataInfo)
  149.         {
  150.             var metaProps = publicMetadataInfo.Values;
  151.            
  152.             var props =
  153.                 metaProps
  154.                     .ToDictionary(IdByUid,
  155.                         propertyMetadata =>
  156.                         {
  157.                             var mindMupIdea = new MindMupIdea()
  158.                             {
  159.                                 Id = Id(propertyMetadata, mupName),
  160.                                 Title = propertyMetadata.Name,
  161.                                 Ideas = Ideas(mupName, propertyMetadata)
  162.                             };
  163.                             return mindMupIdea;
  164.                         });
  165.             return props;
  166.         }
  167.  
  168.        
  169.  
  170.         private static Dictionary<string, MindMupIdea> Ideas(string mupName, EnumValueMetadata propertyMetadata)
  171.         {
  172.             var propertyMetadataUid = $"{propertyMetadata.Uid}".GetDeterministicGuid();
  173.             return new Dictionary<string, MindMupIdea>() {
  174.                 {
  175.                     Id(propertyMetadataUid),
  176.                     new MindMupIdea()
  177.                     {
  178.                         Id = Id(propertyMetadataUid, mupName),
  179.                         Title = $"{propertyMetadata.DisplayName} ({propertyMetadata.IntValue?.ToString() ?? propertyMetadata.UidStr})"
  180.                     }
  181.                 }
  182.             };
  183.         }
  184.  
  185.         private Dictionary<string, MindMupIdea> GetProperties(string mupName, EntityMetadata entityMetadata, ICollection<LinkElement> links, ICollection<Guid> typeGuids)
  186.         {
  187.             var metaProps = entityMetadata.GetPropertiesAndTableParts().ToList();
  188.  
  189.             var parentMeta = _publicMetadataService.LoadMetadata(entityMetadata.BaseClassUid) as EntityMetadata;
  190.  
  191.             if (parentMeta != null)
  192.             {
  193.                 metaProps.RemoveAll(c => parentMeta.Properties.Any(p => p.Uid == c.Uid));
  194.             }
  195.  
  196.             var props =
  197.                 metaProps
  198.                     .ToDictionary(IdByUid,
  199.                         propertyMetadata =>
  200.                         {
  201.                             var mindMupIdea = new MindMupIdea()
  202.                             {
  203.                                 Id = Id(propertyMetadata, mupName),
  204.                                 Title = propertyMetadata.Name,
  205.                                 Ideas = MindMupIdeas(mupName, propertyMetadata)
  206.                             };
  207.                             return mindMupIdea;
  208.                         });
  209.  
  210.             AddLinks(mupName, links, typeGuids, metaProps);
  211.             return props;
  212.  
  213.         }
  214.  
  215.         private static Dictionary<string, MindMupIdea> MindMupIdeas(string mupName, IPropertyMetadata propertyMetadata)
  216.         {
  217.             var metadataUid = $"{propertyMetadata.Uid}".GetDeterministicGuid();
  218.             return new Dictionary<string, MindMupIdea>() {
  219.                 {
  220.                     Id(metadataUid),
  221.                     new MindMupIdea()
  222.                     {
  223.                         Id = Id(metadataUid, mupName),
  224.                         Title = propertyMetadata.DisplayName
  225.                     }
  226.                 }
  227.             };
  228.         }
  229.  
  230.         private void AddLinks(string mupName, ICollection<LinkElement> links, ICollection<Guid> typeGuids, List<IPropertyMetadata> metaProps)
  231.         {
  232.             foreach (var prop in metaProps)
  233.             {
  234.                 if (prop.SubTypeUid != Guid.Empty)
  235.                 {
  236.                     var metadata = _publicMetadataService.LoadMetadata(prop.SubTypeUid);
  237.                     if (metadata is EntityMetadata)
  238.                     {
  239.                         var propMeta = (EntityMetadata)metadata;
  240.                         if (typeGuids.Contains(propMeta.ImplementationUid))
  241.                         {
  242.                             var linkElement = new LinkElement()
  243.                             {
  244.                                 IdeaIdFrom = Id(prop, mupName),
  245.                                 IdeaIdTo = Id(propMeta, mupName),
  246.                             };
  247.  
  248.                             //TODO переделать на serializableTypeDescriptor
  249.                             var entitySettings = prop.Settings as EntitySettings;
  250.                             if (entitySettings != null)
  251.                             {
  252.                                 linkElement.Attr.Style.Label = $"({EnumHelper.GetDisplayName(entitySettings.RelationType)})";
  253.                             }
  254.                             links.Add(linkElement);
  255.                         }
  256.                     }
  257.  
  258.                     if (metadata is EnumMetadata)
  259.                     {
  260.                         var propMeta = (EnumMetadata)metadata;
  261.                         links.Add(new LinkElement()
  262.                         {
  263.                             IdeaIdFrom = Id(prop, mupName),
  264.                             IdeaIdTo = Id(propMeta, mupName),
  265.                         });
  266.                     }
  267.                 }
  268.             }
  269.         }
  270.  
  271.         public IPublicMetadataInfo[] Types()
  272.         {
  273.             var publicMetadataInfos = GetAllMetadataInfo<EntityMetadata>(FilterEntityMetadata).ToList();
  274.             publicMetadataInfos.AddRange(GetAllMetadataInfo<EnumMetadata>());
  275.             return publicMetadataInfos.ToArray();
  276.         }
  277.  
  278.         private static bool FilterEntityMetadata(EntityMetadata m)
  279.         {
  280.             if (m.IdTypeUid != Int64Descriptor.UID && m.IdTypeUid != Int32Descriptor.UID &&
  281.                 m.IdTypeUid != Int16Descriptor.UID) return false;
  282.             if (m.Type != 0)
  283.             {
  284.                 return m.Type == EntityMetadataType.InterfaceImplementation;
  285.             }
  286.             return true;
  287.         }
  288.  
  289.         private IPublicMetadataInfo[] GetAllMetadataInfo<T>(Func<T, bool> func = null) where T : class, IMetadata
  290.         {
  291.             return _publicMetadataService.GetMetadataInfoList().Where(delegate (IPublicMetadataInfo i)
  292.             {
  293.                 var val = i.GetMetadata() as T;
  294.                 if (val != null)
  295.                 {
  296.                     return func == null || func(val);
  297.                 }
  298.                 return false;
  299.             }).ToArray();
  300.         }
  301.     }
  302. }
Add Comment
Please, Sign In to add comment