source: trunk/CrypPlugins/KeySearcher/P2P/Tree/NodeBase.cs @ 2391

Last change on this file since 2391 was 2289, checked in by Sven Rech, 11 years ago

fixed keysearcher result bug

File size: 7.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Numerics;
4using Cryptool.P2P;
5using Cryptool.P2P.Internal;
6using KeySearcher.Helper;
7using KeySearcher.P2P.Exceptions;
8using KeySearcher.P2P.Storage;
9
10namespace KeySearcher.P2P.Tree
11{
12    abstract class NodeBase
13    {
14        protected internal readonly BigInteger From;
15        protected internal readonly BigInteger To;
16        protected internal readonly string DistributedJobIdentifier;
17        protected readonly StorageHelper StorageHelper;
18        protected readonly KeyQualityHelper KeyQualityHelper;
19
20        protected internal DateTime LastUpdate;
21
22        public readonly Node ParentNode;
23        public LinkedList<KeySearcher.ValueKey> Result;
24
25        //Dictionary Tests       
26        //public String Avatarname = "CrypTool2";
27        public String Avatarname = P2PSettings.Default.PeerName;
28       
29        public Dictionary<String, Dictionary<long, Information>> Activity;
30        protected bool integrated;
31
32        protected NodeBase(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
33        {
34            StorageHelper = storageHelper;
35            KeyQualityHelper = keyQualityHelper;
36            ParentNode = parentNode;
37            From = @from;
38            To = to;
39            DistributedJobIdentifier = distributedJobIdentifier;
40
41            LastUpdate = DateTime.MinValue;
42            Result = new LinkedList<KeySearcher.ValueKey>();
43            Activity = new Dictionary<string, Dictionary<long, Information>>();
44            integrated = false;
45
46            StorageHelper.UpdateFromDht(this);
47        }
48
49        protected void UpdateDht()
50        {
51            // If this instance is the root node, we need a special handling
52            if (ParentNode == null)
53            {
54                UpdateDhtForRootNode();
55                return;
56            }
57
58            // Compare with refreshed parent node
59            var result = StorageHelper.UpdateFromDht(ParentNode, true);
60            if (!result.IsSuccessful())
61            {
62                throw new UpdateFailedException("Parent node could not be updated: " + result.Status);
63            }
64
65            IntegrateResultsIntoParent();
66            ParentNode.ChildFinished(this);
67            ParentNode.UpdateCache();
68
69            // TODO add check, if we retrieved our lock (e.g. by comparing the lock date or the future client identifier
70            if (StorageHelper.RetrieveWithStatistic(StorageHelper.KeyInDht(this)).Status == RequestResultType.KeyNotFound)
71            {
72                throw new ReservationRemovedException("Before updating parent node, this leaf's reservation was deleted.");
73            }
74
75            var updateResult = StorageHelper.UpdateInDht(ParentNode);
76            if (!updateResult.IsSuccessful())
77            {
78                throw new UpdateFailedException("Parent node could not be updated: " + updateResult.Status);
79            }
80
81            StorageHelper.RemoveWithStatistic(StorageHelper.KeyInDht(this));
82
83            if (ParentNode.IsCalculated())
84            {
85                ParentNode.UpdateDht();
86            }
87        }
88
89        private void IntegrateResultsIntoParent()
90        {
91            var bestValue = KeyQualityHelper.WorstValue();
92            if (ParentNode.Result.Count > 0)
93            {
94                bestValue = ParentNode.Result.First.Value.value;
95            }
96
97            var revertedResults = new LinkedList<KeySearcher.ValueKey>();
98            foreach (var valueKey in Result)
99            {
100                revertedResults.AddFirst(valueKey);
101            }
102
103            foreach (var valueKey in revertedResults)
104            {
105                if (!KeyQualityHelper.IsBetter(valueKey.value, bestValue)) continue;
106
107                if (ParentNode.Result.Contains(valueKey)) continue;
108
109                ParentNode.Result.AddFirst(valueKey);
110                bestValue = valueKey.value;
111
112                if (ParentNode.Result.Count > 10)
113                {
114                    ParentNode.Result.RemoveLast();
115                }
116            }
117
118
119            //Integration of the Dictionary into the ParentNode
120            if(!integrated)
121            {
122                //Collection of all avatarnames in activity of this node
123                Dictionary<String, Dictionary<long, Information>>.KeyCollection keyColl = Activity.Keys;
124
125                foreach (string avname in keyColl)
126                {
127                    //taking the dictionary in this avatarname
128                    Dictionary<long, Information> MaschCount = Activity[avname];
129
130                    //collecting der maschinID's for this avatarname
131                    Dictionary<long, Information>.KeyCollection maschColl = MaschCount.Keys;
132
133                    //if the avatarname already exists in the parentnode.activity
134                    if (ParentNode.Activity.ContainsKey(avname))
135                    {
136                        foreach (long id in maschColl)
137                        {
138                            //get the parent maschcount for this avatarname
139                            Dictionary<long, Information> ParentMaschCount = ParentNode.Activity[avname];
140
141                            //if the id of the Maschine already exists for this avatarname
142                            if (ParentMaschCount.ContainsKey(id))
143                            {
144                                ParentMaschCount[id].Count = ParentMaschCount[id].Count + MaschCount[id].Count;
145                                ParentMaschCount[id].Hostname = MaschCount[id].Hostname;
146                                ParentMaschCount[id].Date = MaschCount[id].Date;
147
148                                ParentNode.Activity[avname] = ParentMaschCount;
149                            }
150                            else
151                            {
152                                //add a new id,count value for this avatarname
153                                ParentNode.Activity[avname].Add(id, MaschCount[id]);
154                            }
155                        }
156                    }
157                    else
158                    {
159                        //add the maschinecount dictionary to this avatarname
160                        ParentNode.Activity[avname] = MaschCount;
161                    }
162                }
163                //Integration of this node was already done
164                integrated = true;
165           
166            }//end if
167         
168        }
169
170        private void UpdateDhtForRootNode()
171        {
172            StorageHelper.UpdateFromDht(this, true);
173            StorageHelper.UpdateInDht(this);
174        }
175
176        protected void UpdateActivity()
177        {
178            var Maschine = new Dictionary<long, Information> { { Cryptool.PluginBase.Miscellaneous.UniqueIdentifier.GetID(), new Information() { Count = 1, Hostname = Cryptool.PluginBase.Miscellaneous.UniqueIdentifier.GetHostName(),Date = DateTime.UtcNow } } };
179            if (!Activity.ContainsKey(Avatarname))
180            {
181                Activity.Add(Avatarname, Maschine);
182            }
183        }
184
185        public abstract bool IsReserved();
186
187        public abstract Leaf CalculatableLeaf(bool useReservedNodes);
188
189        public abstract bool IsCalculated();
190
191        public abstract void Reset();
192
193        public abstract void UpdateCache();
194
195        public override string ToString()
196        {
197            return "NodeBase " + GetType() + ", from " + From + " to " + To;
198        }
199    }
200}
Note: See TracBrowser for help on using the repository browser.