Esempio n. 1
0
        public void LoadDefinitionHierarchy(LogicalModel.Table logicaltable)
        {
            var rootlocator = new Locator();

            rootlocator.ID = "Root";
            var rootNode = new Hierarchy <Locator>(rootlocator);

            DefinitionItems.Clear();
            DefinitionItems.Add(rootNode);
            XmlNamespaceManager nsmanager = null;
            var refdoc = this.Taxonomy.TaxonomyDocuments.FirstOrDefault(i => i.LocalPath == this.DefinitionPath);

            if (refdoc != null)
            {
                nsmanager = Utilities.Xml.GetTaxonomyNamespaceManager(refdoc.XmlDocument);
            }

            foreach (var definitionlink in DefinitionLinks)
            {
                definitionlink.LoadHierarchy();
                DefinitionItems.AddRange(definitionlink.DefinitionItems);
            }
            foreach (var definitionlink in DefinitionLinks)
            {
                var locatorswithroles = definitionlink.DefinitionRoot.Where(i => !String.IsNullOrEmpty(i.Item.TargetRole));
                foreach (var l in locatorswithroles)
                {
                    var ss = DefinitionLinks.FirstOrDefault(i => i.Role == l.Item.TargetRole).DefinitionRoot;
                    ss.Item.RoleType = l.Item.RoleType;
                    l.Item           = ss.Item;
                    l.Children       = ss.Children;
                }
                var hascube = definitionlink.DefinitionArcs.Any(i => i.RoleType == ArcRoleType.hypercube_dimension);
                if (hascube)
                {
                    if (definitionlink.DefinitionRoot.Find(i => i.Item.RoleType == ArcRoleType.domain_member) != null)
                    {
                        rootNode.Children.Add(definitionlink.DefinitionRoot);
                        definitionlink.DefinitionRoot.Parent = rootNode;
                    }
                    else
                    {
                        //no domain member found
                    }
                }
                else
                {
                    var hasall = definitionlink.DefinitionArcs.Any(i => i.RoleType == ArcRoleType.all);
                    if (hasall)
                    {
                        rootNode.Children.Add(definitionlink.DefinitionRoot);
                        definitionlink.DefinitionRoot.Parent = rootNode;
                    }
                }
            }

            DefinitionRoot = rootNode;

            LocateDefinitions();

            var nontrivialdomains = new Dictionary <string, LogicalModel.Dimensions.DimensionDomain>();

            var hypercubenodes = DefinitionItems.Where(i => i.Item.RoleType.In(ArcRoleType.all, ArcRoleType.notAll)).ToList();

            foreach (var hypercubenode in hypercubenodes)
            {
                var hypercube = new LogicalModel.HyperCube();
                //map the concepts
                var concepts = new List <Hierarchy <Locator> >();
                var parent   = hypercubenode.Parent;
                concepts.Add(parent);
                if (parent.Children.Count > 1)
                {
                    var parentconcepts = parent.Children.Where(i => i.Item.RoleType != ArcRoleType.all);
                    concepts.AddRange(parentconcepts);
                }

                foreach (var conceptnode in concepts)
                {
                    var logicalconcept = new LogicalModel.Concept();
                    if (conceptnode.Item.Element != null)
                    {
                        logicalconcept.Content = conceptnode.Item.Element.Key;
                        logicalconcept.Name    = conceptnode.Item.Element.Name;
                        hypercube.Concepts.Add(logicalconcept);
                    }
                    else
                    {
                        Logger.WriteLine(String.Format("Concept Element not found for {0}!", conceptnode.Item.ID));
                    }
                }

                //map the dimensions
                var domains = hypercubenode.Where(i => i.Item.RoleType == ArcRoleType.dimension_domain).Where(i => i.Children.Count > 0);
                domains = domains.Where(i => i.Children.FirstOrDefault(j => !j.Item.Element.IsDefaultMember) != null).ToList();

                var hypercubeitems = hypercubenode.Where(i => i.Item.RoleType == ArcRoleType.hypercube_dimension); //.Where(i => i.Children.Count > 0)
                foreach (var hypercubeitem in hypercubeitems)
                {
                    var logicalhypercubeitem = new LogicalModel.Dimensions.DimensionItem();
                    //logicalhypercubeitem.Content = hypercubeitem.Item.Element.Key;
                    logicalhypercubeitem.Name      = hypercubeitem.Item.Element.Name;
                    logicalhypercubeitem.Namespace = hypercubeitem.Item.Element.Namespace;
                    logicalhypercubeitem.LabelID   = hypercubeitem.Item.LabelID;

                    var fixedns = Taxonomy.FindNamespacePrefix(hypercubeitem.Item.Element.NamespaceURI, hypercubeitem.Item.Element.Namespace);
                    if (fixedns != logicalhypercubeitem.Namespace)
                    {
                        logicalhypercubeitem.Namespace = fixedns;
                    }
                    //if (logicalhypercubeitem.Name.Contains("RCP"))
                    //{

                    //}
                    if (hypercubeitem.Children.Count == 0)
                    {
                        var domainref = hypercubeitem.Item.Element.TypedDomainRef;
                        if (!String.IsNullOrEmpty(domainref))
                        {
                            var se_dim_doc = this.Taxonomy.TaxonomyDocuments.FirstOrDefault(i => i.TargetNamespacePrefix == hypercubeitem.Item.Element.Namespace);
                            //TODO
                            var localrelpath = Utilities.Strings.ResolveHref(LogicalModel.TaxonomyEngine.LocalFolder, se_dim_doc.LocalFolder, domainref);

                            //var path = Utilities.Strings.ResolveRelativePath(se_dim_doc.LocalFolder, domainref);
                            //var localrelpath = Utilities.Strings.GetRelativePath(LogicalModel.TaxonomyEngine.LocalFolder, path);
                            var se_domain_doc = this.Taxonomy.FindDocument(localrelpath);

                            var refid         = domainref.Substring(domainref.IndexOf("#") + 1);
                            var se_domain_key = se_domain_doc.TargetNamespacePrefix + ":" + refid;
                            var se_domain     = Taxonomy.SchemaElementDictionary[se_domain_key];

                            if (se_domain != null)
                            {
                                var logicaldomain = new LogicalModel.Dimensions.DimensionDomain();
                                logicaldomain.Content       = se_domain_key;
                                logicaldomain.Name          = se_domain.Name;
                                logicaldomain.DimensionItem = logicalhypercubeitem;
                                logicaldomain.LabelID       = se_domain.ID;
                                logicalhypercubeitem.Domains.Add(logicaldomain);

                                var logicalmember = new LogicalModel.Dimensions.TypedDimensionMember();
                                logicalmember.Content = logicaldomain.Name + ":*";
                                logicalmember.Name    = "*";
                                logicalmember.Domain  = logicaldomain;
                                logicalmember.LabelID = "";
                                //logicalmember.IsDefaultMember = domainmember.Item.Element.IsDefaultMember;
                                logicaldomain.DomainMembers.Add(logicalmember);

                                hypercube.DimensionItems.Add(logicalhypercubeitem);
                            }
                            else
                            {
                            }
                        }
                        //var xs = Taxonomy.SchemaElementDictionary[hypercubeitem.Item.]
                    }

                    var completedomains = hypercubeitem.Children.Where(i => i.Children.FirstOrDefault(j => !j.Item.Element.IsDefaultMember) != null).ToList();
                    if (completedomains.Count > 0)
                    {
                        hypercube.DimensionItems.Add(logicalhypercubeitem);
                    }
                    else
                    {
                    }

                    foreach (var domain in completedomains)
                    {
                        var logicaldomain = new LogicalModel.Dimensions.DimensionDomain();
                        logicaldomain.Content       = domain.Item.Element.Key;
                        logicaldomain.Name          = domain.Item.Element.Name;
                        logicaldomain.DimensionItem = logicalhypercubeitem;
                        logicaldomain.LabelID       = domain.Item.LabelID;
                        logicalhypercubeitem.Domains.Add(logicaldomain);

                        var domainmembers = domain.Children;//.Where(i=>!i.Item.Element.IsDefaultMember).ToList();
                        foreach (var domainmember in domainmembers)
                        {
                            var logicalmember = new LogicalModel.Dimensions.DimensionMember();
                            logicalmember.Content = domainmember.Item.Element.Key;
                            logicalmember.Name    = domainmember.Item.Element.Name;

                            var memelement   = domainmember.Item.Element;
                            var memfixedns   = Taxonomy.FindNamespacePrefix(memelement.NamespaceURI, memelement.Namespace);
                            var memberdomain = logicaldomain;
                            //if (memfixedns != logicaldomain.ID)
                            //{
                            //    LogicalModel.Dimensions.DimensionDomain ntdomain = null;
                            //    if (!nontrivialdomains.ContainsKey(memfixedns))
                            //    {
                            //        ntdomain = new LogicalModel.Dimensions.DimensionDomain();
                            //        var domelement = Taxonomy.GetDomain(memfixedns);
                            //        logicaldomain.Content = domelement.Key;
                            //        logicaldomain.Name = domelement.Name;
                            //        logicaldomain.DimensionItem = logicalhypercubeitem;
                            //        nontrivialdomains.Add(memfixedns, ntdomain);
                            //    }
                            //    ntdomain = nontrivialdomains[memfixedns];
                            //    memberdomain = ntdomain;
                            //}

                            logicalmember.Domain          = memberdomain;
                            logicalmember.LabelID         = domainmember.Item.LabelID;
                            logicalmember.IsDefaultMember = domainmember.Item.Element.IsDefaultMember;
                            logicaldomain.DomainMembers.Add(logicalmember);
                        }
                    }
                }

                logicaltable.HyperCubes.Add(hypercube);
            }

            /*
             * foreach (var hc in logicaltable.HyperCubes)
             * {
             *  foreach (var dimitem in hc.DimensionItems)
             *  {
             *      foreach (var domitem in dimitem.Domains)
             *      {
             *          var nsuri = nsmanager.LookupNamespace(domitem.Namespace);
             *          var fixedns = Taxonomy.FindNamespacePrefix(nsuri, domitem.Namespace);
             *          if (fixedns != domitem.Namespace)
             *          {
             *              domitem.Namespace = fixedns;
             *          }
             *
             *          foreach (var member in domitem.DomainMembers)
             *          {
             *              var memnsuri = nsmanager.LookupNamespace(member.Domain.Namespace);
             *              var memfixedns = Taxonomy.FindNamespacePrefix(nsuri, member.Domain.Namespace);
             *              if (memfixedns != member.Domain.Namespace)
             *              {
             *                  domitem.Namespace = memfixedns;
             *              }
             *          }
             *      }
             *
             *  }
             * }
             */
        }
Esempio n. 2
0
        public void LoadLayoutHierarchy(LogicalModel.Table logicaltable)
        {
            Identifiables.Clear();
            Arcs.Clear();
            Identifiables.AddRange(Tables);
            Identifiables.AddRange(BreakDowns);
            Identifiables.AddRange(RuleNodes);
            Identifiables.AddRange(AspectNodes);
            Identifiables.AddRange(DimensionFilters);
            Identifiables.AddRange(DimensionRelationShips);
            Arcs.AddRange(BreakdownTrees);
            Arcs.AddRange(TableBreakDowns);
            Arcs.AddRange(DefinitionNodeSubTrees);
            Arcs.AddRange(AspectNodeFilters);

            foreach (var identifiable in Identifiables)
            {
                var li = new LogicalModel.LayoutItem();
                li.Table = logicaltable;
                var hi = new Hierarchy <LogicalModel.LayoutItem>(li);
                li.ID      = identifiable.ID;
                li.LabelID = identifiable.LabelID;
                li.LoadLabel(Taxonomy);

                var df = identifiable as DimensionFilter;
                if (df != null)
                {
                    li.Category = LogicalModel.LayoutItemCategory.Filter;

                    var dfexp = df as ExplicitDimensionFilter;
                    if (dfexp != null)
                    {
                        var member = dfexp.Members.FirstOrDefault();
                        if (member != null)
                        {
                            li.Role     = member.LinkRole;
                            li.RoleAxis = member.Axis;
                        }
                    }
                    var drel = df as DimensionRelationShip;
                    if (drel != null)
                    {
                        var member = drel.Member;
                        if (member != null)
                        {
                            li.Role     = drel.LinkRole;
                            li.RoleAxis = drel.Axis;
                            var dim = new LogicalModel.Dimension();
                            dim.DimensionItem = drel.Dimension.QName.Content;
                            dim.Domain        = drel.Member.Domain;
                            //dim.DomainMember = member.Value;
                            dim.SetTyped();
                            li.Dimensions.Add(dim);
                            li.Category = LogicalModel.LayoutItemCategory.Aspect;
                        }
                    }
                }

                var rule = identifiable as RuleNode;
                if (rule != null)
                {
                    li.Category = LogicalModel.LayoutItemCategory.Rule;

                    if (rule.Concept != null)
                    {
                        li.Concept = Mappings.ToLogical(rule.Concept); //rule.Concept.QName.Content;
                    }
                    if (rule.Abstract)
                    {
                        li.IsAbstract = rule.Abstract;
                    }
                    var dimensions = rule.Dimensions;//.Where(i=>i.)
                    foreach (var dimension in dimensions)
                    {
                        var logicaldimension  = new LogicalModel.Dimension();
                        var explicitDimension = dimension as ExplicitDimension;
                        var typedDimension    = dimension as TypedDimension;
                        if (explicitDimension != null)
                        {
                            logicaldimension.DimensionItem = explicitDimension.Dimension;
                            if (explicitDimension.Members.Count == 1)
                            {
                                var member = explicitDimension.Members.FirstOrDefault();
                                logicaldimension.Domain       = member.QName.Domain;
                                logicaldimension.DomainMember = member.QName.Value;
                            }
                            else
                            {
                                Logger.WriteLine("Multiple Members Detected");
                            }
                        }
                        if (typedDimension != null)
                        {
                            Logger.WriteLine("Typed Dimension Detected");
                        }
                        li.Dimensions.Add(logicaldimension);
                    }
                }

                var aspect = identifiable as AspectNode;
                if (aspect != null)
                {
                    li.Category = LogicalModel.LayoutItemCategory.Aspect;
                    var logicaldimension = new LogicalModel.Dimension();
                    logicaldimension.DimensionItem = aspect.DimensionAspect.Content;
                    var hc = logicaltable.HyperCubes.FirstOrDefault(i => i.DimensionItems.Any(j => j.FullName == logicaldimension.DimensionItem));
                    if (hc != null)
                    {
                        var dimitem = hc.DimensionItems.FirstOrDefault(i => i.FullName == logicaldimension.DimensionItem);
                        if (dimitem != null && dimitem.Domains.Count > 0)
                        {
                            //logicaldimension.Domain = dimitem.Domains.FirstOrDefault().FullName;
                            var domain = dimitem.Domains.FirstOrDefault();
                            logicaldimension.Domain = LogicalModel.Taxonomy.IsTyped(domain.FullName) ? domain.FullName : domain.ID;
                        }
                    }
                    logicaldimension.SetTyped();
                    li.Dimensions.Add(logicaldimension);
                }
                var breakdown = identifiable as BreakDown;

                if (breakdown != null)
                {
                    li.Category = LogicalModel.LayoutItemCategory.BreakDown;
                }

                logicaltable.LayoutItems.Add(hi);
            }

            var layoutfilename            = Utilities.Strings.GetFileName(this.LayoutPath);
            XmlNamespaceManager nsmanager = null;
            var layoutdoc = this.Taxonomy.TaxonomyDocuments.FirstOrDefault(i => i.FileName == layoutfilename);

            if (layoutdoc != null)
            {
                nsmanager = Utilities.Xml.GetTaxonomyNamespaceManager(layoutdoc.XmlDocument);
            }
            var d_con = new Dictionary <string, string>();

            foreach (var li in logicaltable.LayoutItems)
            {
                var concept = li.Item.Concept;
                if (concept != null)
                {
                    var nsuri = nsmanager.LookupNamespace(concept.Namespace);
                    concept.Namespace = Taxonomy.FindNamespacePrefix(nsuri, concept.Namespace);
                }
                foreach (var dimension in li.Item.Dimensions)
                {
                    var dimqname = new QName(dimension.DimensionItem);
                    var nsuri    = nsmanager.LookupNamespace(dimqname.Domain);
                    dimqname.Domain         = Taxonomy.FindNamespacePrefix(nsuri, dimqname.Domain);
                    dimension.DimensionItem = dimqname.Content;

                    string domnsuri;

                    if (dimension.IsTyped)
                    {
                        var domqname = new QName(dimension.Domain);
                        domnsuri         = nsmanager.LookupNamespace(domqname.Domain);
                        domqname.Domain  = Taxonomy.FindNamespacePrefix(domnsuri, domqname.Domain);
                        dimension.Domain = domqname.Content;
                    }
                    else
                    {
                        domnsuri         = nsmanager.LookupNamespace(dimension.Domain);
                        dimension.Domain = Taxonomy.FindNamespacePrefix(domnsuri, dimension.Domain);
                    }
                }
            }

            logicaltable.LayoutRoot = Hierarchy <LogicalModel.LayoutItem> .GetHierarchy(Arcs, logicaltable.LayoutItems,
                                                                                        (i, a) => i.Item.LabelID == a.From, (i, a) => i.Item.LabelID == a.To,
                                                                                        (i, a) => { i.Item.Order = a.Order; i.Item.Axis = a is TableBreakDownArc ? ((TableBreakDownArc)a).Axis.ToString() : ""; });

            logicaltable.ID   = logicaltable.LayoutRoot.Item.ID;
            logicaltable.Name = logicaltable.LayoutRoot.Item.LabelContent;
            logicaltable.SetHtmlPath();
            Utilities.FS.WriteAllText(logicaltable.LayoutPath, logicaltable.LayoutRoot.ToHierarchyString(GetLayoutString));
            //var x = GetXbrlRendering();
            //Utilities.FS.WriteAllText(logicaltable.FullHtmlPath.Replace(".html", "_layout.txt"), x.ToHierarchyString(GetLayoutString));
        }