示例#1
0
        public void Save(string filename)
        {
            var document = new XDocument();
            var root     = new XElement(ConfigTag);

            document.Add(root);

            root.Add(new XElement(DatabaseServerTag, DatabaseServer));
            root.Add(new XElement(DatabasePortTag, DatabasePort));
            root.Add(new XElement(DatabaseNameTag, DatabaseName));
            root.Add(new XElement(DatabaseUsernameTag, DatabaseUsername));
            root.Add(new XElement(DatabasePasswordTag, DatabasePassword));
            root.Add(new XElement(AdminMailAddressTag, AdminMailAddress));
            root.Add(new XElement(SystemMailAddressTag, SystemMailAddress));
            root.Add(new XElement(SystemMailGpgKeyIdTag, SystemMailGpgKeyId));
            root.Add(new XElement(SystemMailGpgKeyPassphraseTag, SystemMailGpgKeyPassphrase));
            root.Add(new XElement(MailServerHostTag, MailServerHost));
            root.Add(new XElement(MailServerPortTag, MailServerPort));
            root.Add(new XElement(MailAccountNameTag, MailAccountName));
            root.Add(new XElement(MailAccountPasswordTag, MailAccountPassword));
            root.Add(new XElement(WebSiteAddressTag, WebSiteAddress));
            root.Add(new XElement(GpgHomedirTag, GpgHomedir));
            root.Add(new XElement(PingenApiTokenTag, PingenApiToken));
            root.Add(new XElement(SiteNameTag, SiteName));
            root.Add(new XElement(LinkKeyTag, LinkKey.ToHexString()));
            root.Add(new XElement(OAuth2AuthorizationUrlTag, OAuth2AuthorizationUrl));
            root.Add(new XElement(OAuth2TokenUrlTag, OAuth2TokenUrl));
            root.Add(new XElement(OAuth2ApiUrlTag, OAuth2ApiUrl));
            root.Add(new XElement(OAuth2ClientIdTag, OAuth2ClientId));
            root.Add(new XElement(OAuth2ClientSecretTag, OAuth2ClientSecret));

            document.Save(filename);
        }
示例#2
0
    private Rule applyRule(RuleKey ruleKey, LinkKey linkKey, ElementScript firstElement, ElementScript secondElement)
    {
        Rule rule;

        if (rules.TryGetValue(ruleKey, out rule))
        {
            // there is a rule between these two types
            if (rule.hasLink)
            {
                Debug.Log("Adding link for rule " + rule.type + " between " + firstElement.name + " and " + secondElement.name);
                addLink(rule.type, linkKey, firstElement, secondElement);
            }
            else
            {
                // remove any link between these two objects
                Debug.Log("Removing link for rule " + rule.type + " between " + firstElement.name + " and " + secondElement.name);
                removeLink(linkKey, firstElement, secondElement);
            }

            firstElement.Type  = rule.firstTypeFinal;
            secondElement.Type = rule.secondTypeFinal;

            UpdateLinks(linkKey);
        }

        return(rule);
    }
示例#3
0
 public AesEncrypter(IOptions <LinkKey> options)
 {
     if (options == null)
     {
         throw new ArgumentNullException(nameof(options));
     }
     this.Key = options.Value;
     buildKey();
 }
示例#4
0
    private Link addLink(string ruleType, LinkKey linkKey, ElementScript firstElement, ElementScript secondElement)
    {
        Link link;

        // if link already exists update it with the new rule type
        if (links.TryGetValue(linkKey, out link))
        {
            if (link.type != ruleType)
            {
                activeRules[link.type].Remove(linkKey);
                link.type = ruleType;
                activeRules[ruleType].Add(linkKey);
            }

            return(link);
        }

        link           = new Link(ruleType, firstElement, secondElement);
        links[linkKey] = link;

        HashSet <LinkKey> linksForRule;

        if (!activeRules.TryGetValue(ruleType, out linksForRule))
        {
            linksForRule = new HashSet <LinkKey>();
            activeRules.Add(ruleType, linksForRule);
        }

        linksForRule.Add(linkKey);

        HashSet <LinkKey> neighborsFirst;

        if (!elementLinks.TryGetValue(firstElement.name, out neighborsFirst))
        {
            neighborsFirst = new HashSet <LinkKey>();
            elementLinks.Add(firstElement.name, neighborsFirst);
        }

        neighborsFirst.Add(linkKey);

        HashSet <LinkKey> neighborsSecond;

        if (!elementLinks.TryGetValue(secondElement.name, out neighborsSecond))
        {
            neighborsSecond = new HashSet <LinkKey>();
            elementLinks.Add(secondElement.name, neighborsSecond);
        }

        neighborsSecond.Add(linkKey);

        return(link);
    }
示例#5
0
    private void removeLink(LinkKey linkKey, ElementScript firstElement, ElementScript secondElement)
    {
        Link link;

        if (links.TryGetValue(linkKey, out link))
        {
            links.Remove(linkKey);
            link.Remove();
        }

        elementLinks[firstElement.name].Remove(linkKey);
        elementLinks[secondElement.name].Remove(linkKey);
    }
示例#6
0
    public void AddCollision(ElementScript firstElement, ElementScript secondElement)
    {
        // see if we already have a link between these two objects
        LinkKey linkKey = new LinkKey(firstElement.name, secondElement.name);

        if (!links.ContainsKey(linkKey))
        {
            Rule rule;
            if ((rule = applyRule(new RuleKey(firstElement.Type, secondElement.Type), linkKey, firstElement, secondElement)) == null)
            {
                rule = applyRule(new RuleKey(secondElement.Type, firstElement.Type), linkKey, secondElement, firstElement);
            }
        }
    }
示例#7
0
        private void putNodeAndLink(Dictionary <Element, AddtionalNodeInfomation> nodes, Dictionary <LinkKey, AddtionalLinkInfomation> links, Element element, int distance)
        {
            //自分自身をノードリストに追加します。
            //結果変数はHashSetなので重複を考慮しなくても本来は問題ないですが、重複した場合後勝ちとなるため、先勝ちとなるよう存在チェックを行います。
            if (!nodes.ContainsKey(element))
            {
                nodes.Add(element, new AddtionalNodeInfomation(distance));
            }

            //依存する要素を取得し結果変数に格納します。
            //結果変数はHashSetなので重複を考慮しなくても本来は問題ないですが、重複した場合後勝ちとなるため、先勝ちとなるよう存在チェックを行います。
            List <Dependency> dependencies = element.getDependency();

            foreach (Dependency dependency in dependencies)
            {
                if (!nodes.ContainsKey(dependency.dependencyElement))
                {
                    nodes.Add(dependency.dependencyElement, new AddtionalNodeInfomation(distance));
                }
                LinkKey linkKey = new LinkKey(element, dependency.dependencyElement);
                if (!links.ContainsKey(linkKey))
                {
                    links.Add(linkKey, new AddtionalLinkInfomation(dependency, distance, this.getDrection(dependency)));
                }
            }

            //依存される要素を取得し結果変数に格納します。
            //結果変数はHashSetなので重複を考慮しなくても本来は問題ないですが、重複した場合後勝ちとなるため、先勝ちとなるよう存在チェックを行います。
            List <Dependency> dependenciesDependOnMe = element.getDependencyDependOnMe();

            foreach (Dependency dependencyDependOnMe in dependenciesDependOnMe)
            {
                if (!nodes.ContainsKey(dependencyDependOnMe.element))
                {
                    nodes.Add(dependencyDependOnMe.element, new AddtionalNodeInfomation(distance));
                }
                LinkKey linkKey = new LinkKey(dependencyDependOnMe.element, element);
                if (!links.ContainsKey(linkKey))
                {
                    links.Add(linkKey, new AddtionalLinkInfomation(dependencyDependOnMe, distance, this.getDrection(dependencyDependOnMe)));
                }
            }
        }
示例#8
0
    private void UpdateLinks(LinkKey originalLinkKey)
    {
        Queue <string>   elementsToCheck   = new Queue <string>();
        HashSet <string> processedElements = new HashSet <string>();

        elementsToCheck.Enqueue(originalLinkKey.first);
        elementsToCheck.Enqueue(originalLinkKey.second);
        processedElements.Add(originalLinkKey.first);
        processedElements.Add(originalLinkKey.second);

        while (elementsToCheck.Count > 0)
        {
            string elementName = elementsToCheck.Dequeue();

            HashSet <LinkKey> neighborsOriginal;
            if (elementLinks.TryGetValue(elementName, out neighborsOriginal))
            {
                // see if there is a rule between the neighbor's type and the new element's type;
                ElementScript element = elements[elementName];

                HashSet <LinkKey> neighbors = new HashSet <LinkKey>(neighborsOriginal);

                foreach (LinkKey linkKey in neighbors)
                {
                    string otherElementName = linkKey.GetOther(elementName);

                    if (processedElements.Contains(otherElementName))
                    {
                        continue;
                    }

                    ElementScript otherElement = elements[otherElementName];

                    Debug.Log("Processing link between " + elementName + " and " + otherElementName);

                    Rule rule;

                    if (rules.TryGetValue(new RuleKey(element.Type, otherElement.Type), out rule))
                    {
                        // there is a rule between these two types
                        if (rule.hasLink)
                        {
                            addLink(rule.type, linkKey, element, otherElement);
                        }
                        else
                        {
                            // remove any link between these two objects
                            removeLink(linkKey, element, otherElement);
                        }

                        element.Type      = rule.firstTypeFinal;
                        otherElement.Type = rule.secondTypeFinal;
                        elementsToCheck.Enqueue(otherElementName);
                    }
                    else if (rules.TryGetValue(new RuleKey(otherElement.Type, element.Type), out rule))
                    {
                        // there is a rule between these two types
                        if (rule.hasLink)
                        {
                            addLink(rule.type, linkKey, otherElement, element);
                        }
                        else
                        {
                            // remove any link between these two objects
                            removeLink(linkKey, element, otherElement);
                        }

                        otherElement.Type = rule.firstTypeFinal;
                        element.Type      = rule.secondTypeFinal;
                        if (!processedElements.Contains(otherElementName))
                        {
                            elementsToCheck.Enqueue(otherElementName);
                        }
                    }
                    else
                    {
                        removeLink(linkKey, element, otherElement);
                    }
                }
            }

            processedElements.Add(elementName);
        }
    }
示例#9
0
        public ActionResult <string> DataFlowInfomation([FromForm] string[] nodeStrings)
        {
            Dictionary <Element, AddtionalNodeInfomation> nodes = new Dictionary <Element, AddtionalNodeInfomation>();
            Dictionary <LinkKey, AddtionalLinkInfomation> links = new Dictionary <LinkKey, AddtionalLinkInfomation>();
            List <Element> groups = new List <Element>();

            //1段階目の取得■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            for (int i = 0; i < nodeStrings.Length; i++)
            {
                //空文字の場合はスキップ
                if (nodeStrings[i].Equals(""))
                {
                    continue;
                }

                //rootノードの場合はスキップ
                if (nodeStrings[i].Equals("root"))
                {
                    continue;
                }

                Element element = Element.getElement(nodeStrings[i]);

                this.putNodeAndLink(nodes, links, element, 1);
                if (!element.isLeaf())
                {
                    foreach (Element child in element.getChild())
                    {
                        this.putNodeAndLink(nodes, links, child, 1);
                    }

                    //昇格のためのgroupエレメントを配列に格納します。
                    //同一Groupの親-子-孫が候補の場合、格納するのは親Groupエレメントのみです。
                    bool    isAdd            = true;
                    Element unnecesarryGroup = null;
                    foreach (Element group in groups)
                    {
                        if (group.contain(element))
                        {
                            isAdd = false;
                            break;
                        }

                        if (element.contain(group))
                        {
                            unnecesarryGroup = group;
                            break;
                        }
                    }
                    if (isAdd)
                    {
                        groups.Add(element);
                    }
                    if (unnecesarryGroup != null)
                    {
                        groups.Remove(unnecesarryGroup);
                    }
                }
            }

            //2段階目の取得■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

            //2段階目を取得する際に、ループを回すコレクションに対し要素追加を行うとConcurrentModificationExceptionが発生するためコピーします
            Dictionary <Element, AddtionalNodeInfomation> nodes2 = new Dictionary <Element, AddtionalNodeInfomation>();

            nodes2 = new Dictionary <Element, AddtionalNodeInfomation>(nodes);

            //2段階目を取得します
            foreach (KeyValuePair <Element, AddtionalNodeInfomation> nodeSet in nodes)
            {
                this.putNodeAndLink(nodes2, links, nodeSet.Key, 2);
            }

            //グループ化■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            Dictionary <Element, AddtionalNodeInfomation> nodes3 = new Dictionary <Element, AddtionalNodeInfomation>();
            Dictionary <LinkKey, AddtionalLinkInfomation> links3 = new Dictionary <LinkKey, AddtionalLinkInfomation>();

            foreach (KeyValuePair <Element, AddtionalNodeInfomation> nodeSet in nodes2)
            {
                bool isGroupNode = false;

                foreach (Element group in groups)
                {
                    //グループ内のノード以外を対象とします
                    if (group.contain(nodeSet.Key.getId()))
                    {
                        isGroupNode = true;
                        break;
                    }
                }

                if (!isGroupNode)
                {
                    nodes3.Add(nodeSet.Key, nodeSet.Value);
                }
            }
            foreach (KeyValuePair <LinkKey, AddtionalLinkInfomation> linkSet in links)
            {
                bool    isGroupLink = false;
                bool    isVirtual   = false;
                LinkKey linkKey     = null;
                Element source      = linkSet.Key.getSource();
                Element target      = linkSet.Key.getTarget();

                foreach (Element group in groups)
                {
                    //グループ内のリンク以外を対象とします
                    if (group.contain(linkSet.Key.getSource()) && group.contain(linkSet.Key.getTarget()))
                    {
                        isGroupLink = true;
                        break;
                    }
                    else if (group.contain(linkSet.Key.getSource()))
                    {
                        //グループ内のノードはグループノードに昇格します(ソース側)
                        source    = group;
                        isVirtual = true;
                    }
                    else if (group.contain(linkSet.Key.getTarget()))
                    {
                        //グループ内のノードはグループノードに昇格します(ターゲット側)
                        target    = group;
                        isVirtual = true;
                    }
                }

                linkKey = new LinkKey(source, target);

                if (!isGroupLink)
                {
                    //昇格した結果、そのリンクがすでに存在していれば集約します。
                    if (links3.ContainsKey(linkKey))
                    {
                        AddtionalLinkInfomation val;
                        links3.TryGetValue(linkKey, out val);
                        this.summarizeLink(linkSet.Value, val, false);
                    }
                    else
                    {
                        linkSet.Value.isVirtual = isVirtual;
                        links3.Add(linkKey, linkSet.Value);
                    }
                }
            }

            //逆向きリンクの集約■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            Dictionary <LinkKey, AddtionalLinkInfomation> links4 = new Dictionary <LinkKey, AddtionalLinkInfomation>();

            foreach (KeyValuePair <LinkKey, AddtionalLinkInfomation> linkSet3 in links3)
            {
                bool duplex = false;
                foreach (KeyValuePair <LinkKey, AddtionalLinkInfomation> linkSet4 in links4)
                {
                    //ソースとターゲットが同一ノードで逆向きとなっているリンクがあれば集約します
                    if (linkSet3.Key.getSource() == linkSet4.Key.getTarget() && linkSet3.Key.getTarget() == linkSet4.Key.getSource())
                    {
                        this.summarizeLink(linkSet3.Value, linkSet4.Value, true);
                        duplex = true;
                        break;
                    }
                }

                if (!duplex)
                {
                    links4.Add(linkSet3.Key, linkSet3.Value);
                }
            }

            var dataflow = new Dataflow();

            foreach (KeyValuePair <Element, AddtionalNodeInfomation> element in nodes3)
            {
                var node = new Node2
                {
                    parent  = element.Key.getParent().getId(),
                    id      = element.Key.getId(),
                    name    = element.Key.getName(),
                    type    = element.Key.getType(),
                    remark  = element.Key.getRemark(),
                    svgFile = element.Key.getSvgFile() + ".svg",
                    visible = element.Value.getDistance() == 2 ? false : true,
                    size    = element.Key.isLeaf() ? 32 : 64,
                    group   = !element.Key.isLeaf(),
                    depth   = element.Key.getParent().getId().Equals(Element.getRoot().getId()) ? 0 : element.Key.getParent().getId().Split('.').Length
                };

                dataflow.nodes.Add(node);
            }

            foreach (KeyValuePair <LinkKey, AddtionalLinkInfomation> linkSet in links4)
            {
                Dependency depndency = linkSet.Value.getDependency();

                var link = new Link
                {
                    source     = linkSet.Key.getSource().getId(),
                    target     = linkSet.Key.getTarget().getId(),
                    isCreate   = depndency.dependencyTypeCreate,
                    isRead     = depndency.dependencyTypeRead,
                    isUpdate   = depndency.dependencyTypeUpdate,
                    isDelete   = depndency.dependencyTypeDelete,
                    remark     = depndency.remark,
                    io         = linkSet.Value.getDirection().ToString(),
                    colorIndex = Convert.ToInt32(depndency.getDependencyType(), 2).ToString(),
                    visible    = linkSet.Value.getDistance() == 2 ? false : true,
                    isVirtual  = linkSet.Value.isVirtual
                };

                dataflow.links.Add(link);
            }

            return(JsonConvert.SerializeObject(dataflow));
        }