source: trunk/CrypPlugins/KeySearcher/P2P/Tree/KeyPoolTree.cs @ 1705

Last change on this file since 1705 was 1705, checked in by Paul Lelgemann, 11 years ago

o KeySearcher: improved visualization of local and distributed components

File size: 4.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using Cryptool.PluginBase;
4using KeySearcher.Helper;
5using KeySearcher.KeyPattern;
6using KeySearcher.P2P.Presentation;
7using KeySearcher.P2P.Storage;
8
9namespace KeySearcher.P2P.Tree
10{
11    internal class KeyPoolTree
12    {
13        private readonly KeySearcher keySearcher;
14        private readonly StatusContainer statusContainer;
15        private readonly StatisticsGenerator statisticsGenerator;
16        private readonly KeyPatternPool patternPool;
17        private readonly NodeBase rootNode;
18        private readonly StorageHelper storageHelper;
19        private readonly string identifier;
20
21        private NodeBase currentNode;
22        private bool skippedReservedNodes;
23
24        public KeyPoolTree(KeyPatternPool patternPool, KeySearcher keySearcher, KeyQualityHelper keyQualityHelper, StorageKeyGenerator identifierGenerator, StatusContainer statusContainer, StatisticsGenerator statisticsGenerator)
25        {
26            this.patternPool = patternPool;
27            this.keySearcher = keySearcher;
28            this.statusContainer = statusContainer;
29            this.statisticsGenerator = statisticsGenerator;
30            identifier = identifierGenerator.Generate();
31
32            storageHelper = new StorageHelper(keySearcher, statisticsGenerator, statusContainer);
33            skippedReservedNodes = false;
34
35            rootNode = NodeFactory.CreateNode(storageHelper, keyQualityHelper, null, 0, this.patternPool.Length - 1,
36                                              identifier);
37            currentNode = rootNode;
38        }
39
40        public DateTime StartDate()
41        {
42            return storageHelper.StartDate(identifier);
43        }
44
45        public Leaf FindNextLeaf()
46        {
47            statusContainer.IsSearchingForReservedNodes = false;
48            statisticsGenerator.MarkStartOfNodeSearch();
49
50            var nodeBeforeStarting = currentNode;
51            var foundNode = FindNextLeaf(false);
52
53            if (foundNode == null && skippedReservedNodes)
54            {
55                keySearcher.GuiLogMessage("Searching again with reserved nodes enabled...", NotificationLevel.Info);
56
57                currentNode = nodeBeforeStarting;
58                statusContainer.IsSearchingForReservedNodes = true;
59                foundNode = FindNextLeaf(true);
60                currentNode = foundNode;
61
62                statisticsGenerator.MarkEndOfNodeSearch();
63                return foundNode;
64            }
65
66            currentNode = foundNode;
67
68            statisticsGenerator.MarkEndOfNodeSearch();
69            return foundNode;
70        }
71
72        private Leaf FindNextLeaf(bool useReservedLeafs)
73        {
74            if (currentNode == null)
75            {
76                return null;
77            }
78
79            var isReserved = false;
80            storageHelper.UpdateFromDht(currentNode, true);
81            currentNode.UpdateCache();
82            while (currentNode.IsCalculated() || (!useReservedLeafs && (isReserved = currentNode.IsReserverd())))
83            {
84                if (isReserved)
85                    skippedReservedNodes = true;
86
87                // Current node is calculated or reserved,
88                // move one node up and update it
89                currentNode = currentNode.ParentNode;
90
91                // Root node calculated => everything finished
92                if (currentNode == null)
93                {
94                    currentNode = rootNode;
95                    return null;
96                }
97
98                // Update the new _currentNode
99                storageHelper.UpdateFromDht(currentNode, true);
100                currentNode.UpdateCache();
101            }
102
103            // currentNode is calculateable => find leaf
104            currentNode.UpdateCache();
105            return currentNode.CalculatableLeaf(useReservedLeafs);
106        }
107
108
109        internal bool IsCalculationFinished()
110        {
111            storageHelper.UpdateFromDht(rootNode, true);
112            return rootNode.IsCalculated();
113        }
114
115        internal void Reset()
116        {
117            rootNode.Reset();
118            currentNode = rootNode;
119            skippedReservedNodes = false;
120        }
121
122        public static void ProcessCurrentPatternCalculationResult(Leaf currentLeaf,
123                                                                  LinkedList<KeySearcher.ValueKey> result)
124        {
125            currentLeaf.HandleResults(result);
126        }
127    }
128}
Note: See TracBrowser for help on using the repository browser.