1: using Microsoft.EntityFrameworkCore.Internal;
2: using SimpleImpersonation;
3: using System;
4: using System.Collections.Generic;
5: using System.Configuration;
6: using System.IO;
7: using System.Linq;
8: using System.Text;
9: using System.Text.Json;
10: using static Ia.Cl.Model.Db.Temp;
11: using static Ia.Ngn.Cl.Model.Business.NetworkDesignDocument;
12: using static Ia.Ngn.Cl.Model.Business.Nokia.Sdc;
13: using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
14:
15: namespace Ia.Ngn.Cl.Model.Data.Nokia
16: {
17: ////////////////////////////////////////////////////////////////////////////
18:
19: /// <summary publish="true">
20: /// Optical Fiber Network's Operations Support System Management Intranet (OFN OSS) support class for Nokia's Optical Fiber Network (OFN) data model.
21: /// </summary>
22: ///
23: /// <remarks>
24: /// Copyright © 2018-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
25: ///
26: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
27: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
28: ///
29: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
30: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
31: ///
32: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
33: ///
34: /// Copyright notice: This notice may not be removed or altered from any source distribution.
35: /// </remarks>
36: public class Sdc
37: {
38: private static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> ponNameToTransactionTimestampValueListDictionary, ponNameToTransactionTimestampValueHourlyListDictionary;
39:
40: private static readonly object objectLock = new object();
41:
42: //public static readonly string SdcArchiveFilePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\SdcPonNameToTimestampValueListDictionary " + DateTime.UtcNow.AddHours(3).ToString("yyyy-MM") + ".json";
43: public static readonly string SdcArchiveFilePath = @"\\" + ArchiveServerHostIp + @"\Ia\Archive\SdcPonNameToTransactionTimestampValueListDictionary ";
44:
45: /// <summary/>
46: public static string ArchiveServerHostIp { get { return ConfigurationManager.AppSettings["archiveServerHostIp"].ToString(); } }
47:
48: /// <summary/>
49: public static string ArchiveServerDomain { get { return "dummydomain"; } }
50:
51: /// <summary/>
52: public static string ArchiveServerUserName { get { return ConfigurationManager.AppSettings["archiveServerUserName"].ToString(); } }
53:
54: /// <summary/>
55: public static string ArchiveServerPassword { get { return ConfigurationManager.AppSettings["archiveServerPassword"].ToString(); } }
56:
57: ////////////////////////////////////////////////////////////////////////////
58:
59: /// <summary>
60: ///
61: /// </summary>
62: public Sdc() { }
63:
64: ////////////////////////////////////////////////////////////////////////////
65:
66: /// <summary>
67: ///
68: /// </summary>
69: public static List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue> ReadTransactionTimestampHourlyValueListOfPon(Ia.Ngn.Cl.Model.Business.Nokia.Sdc.Transaction transaction, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Pon pon)
70: {
71: var transactionTimestampValueList0 = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.TransactionTimestampValueHourlyListByPonName(pon.Name);
72:
73: var transactionTimestampValueList = Ia.Ngn.Cl.Model.Business.Nokia.Sdc.AdjustTransactionTimestampHourlyValueList(transaction, transactionTimestampValueList0);
74:
75: return transactionTimestampValueList;
76: }
77:
78: ////////////////////////////////////////////////////////////////////////////
79:
80: /// <summary>
81: ///
82: /// </summary>
83: public static List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue> TransactionTimestampValueListByPonName(string ponName)
84: {
85: List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue> list;
86:
87: var d = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
88:
89: if (d.ContainsKey(ponName)) list = d[ponName];
90: else list = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
91:
92: return list;
93: }
94:
95: ////////////////////////////////////////////////////////////////////////////
96:
97: /// <summary>
98: ///
99: /// </summary>
100: public static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> PonNameToTransactionTimestampValueListDictionary()
101: {
102: return Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary(false);
103: }
104:
105: ////////////////////////////////////////////////////////////////////////////
106:
107: /// <summary>
108: ///
109: /// </summary>
110: public static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> PonNameToTransactionTimestampValueListDictionary(bool resetContent)
111: {
112: if (ponNameToTransactionTimestampValueListDictionary == null || ponNameToTransactionTimestampValueListDictionary.Count == 0 || resetContent)
113: {
114: lock (objectLock)
115: {
116: ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc._PonNameToTransactionTimestampValueListDictionaryFromArchiveServer();
117: }
118: }
119:
120: return ponNameToTransactionTimestampValueListDictionary;
121: }
122:
123: ////////////////////////////////////////////////////////////////////////////
124:
125: /// <summary>
126: ///
127: /// </summary>
128: private static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> _PonNameToTransactionTimestampValueListDictionaryFromArchiveServer()
129: {
130: var userCredentials = new UserCredentials(Ia.Ngn.Cl.Model.Data.Nokia.Sdc.ArchiveServerDomain,
131: Ia.Ngn.Cl.Model.Data.Nokia.Sdc.ArchiveServerUserName,
132: Ia.Ngn.Cl.Model.Data.Nokia.Sdc.ArchiveServerPassword);
133:
134: Impersonation.RunAsUser(userCredentials, LogonType.NewCredentials, () =>
135: {
136: var zipBytes = File.ReadAllBytes(SdcArchiveFilePath + DateTime.UtcNow.AddHours(3).ToString("yyyy-MM") + ".zip.bytes");
137:
138: string json = Ia.Cl.Model.Zip.UnzipString(zipBytes);
139:
140: ponNameToTransactionTimestampValueListDictionary = JsonSerializer.Deserialize<Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>>(json);
141: });
142:
143: // default value
144: if (ponNameToTransactionTimestampValueListDictionary == null)
145: {
146: ponNameToTransactionTimestampValueListDictionary = new Dictionary<string, List<Business.Nokia.Sdc.TransactionTimestampValue>>();
147: }
148:
149: return ponNameToTransactionTimestampValueListDictionary;
150: }
151:
152: ////////////////////////////////////////////////////////////////////////////
153:
154: /// <summary>
155: ///
156: /// </summary>
157: public static void SaveTransactionTimestampValueListOfPon(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Pon pon, Ia.Ngn.Cl.Model.Business.Nokia.Sdc.Transaction transaction, DateTime timestampDateTime, List<long> valueList)
158: {
159: var ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
160:
161: // debug
162: /*
163: if (ponNameToTimestampValueListDictionary == null || ponNameToTimestampValueListDictionary.Count == 0)
164: {
165: ponNameToTimestampValueListDictionary = new Dictionary<string, List<Business.Nokia.Sdc.TimestampValue>>();
166: }
167: */
168:
169: if (ponNameToTransactionTimestampValueListDictionary.ContainsKey(pon.Name))
170: {
171: if (ponNameToTransactionTimestampValueListDictionary[pon.Name] == null)
172: {
173: ponNameToTransactionTimestampValueListDictionary[pon.Name] = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
174: }
175: }
176: else ponNameToTransactionTimestampValueListDictionary[pon.Name] = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
177:
178: var transactiontimestampValueList = ponNameToTransactionTimestampValueListDictionary[pon.Name];
179:
180: int i = 1;
181:
182: foreach (var v in valueList)
183: {
184: if (!transactiontimestampValueList.Any(u => u.Transaction == transaction && u.Timestamp.DayOfYear == timestampDateTime.DayOfYear && u.Timestamp.Hour == timestampDateTime.Hour && u.Value == v))
185: {
186: var transactionTimestampValue = new TransactionTimestampValue(transaction, timestampDateTime.AddMinutes(-i * 5), v);
187:
188: ponNameToTransactionTimestampValueListDictionary[pon.Name].Add(transactionTimestampValue);
189: }
190: else
191: {
192: }
193:
194: i++;
195: }
196: }
197:
198: ////////////////////////////////////////////////////////////////////////////
199:
200: /// <summary>
201: ///
202: /// </summary>
203: public static void WritePonNameToTransactionTimestampValueHourlyListDictionaryToJsonFile()
204: {
205: var now = DateTime.UtcNow.AddHours(3);
206:
207: var startOfThisMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
208:
209: var filteredPonNameToTransactionTimestampValueHourlyListDictionary = new Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>();
210:
211: var ponNameToTransactionTimestampValueHourlyListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueHourlyListDictionary(true);
212: //var ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
213:
214: if (ponNameToTransactionTimestampValueHourlyListDictionary != null)
215: {
216: foreach (var ponName in ponNameToTransactionTimestampValueHourlyListDictionary.Keys)
217: {
218: var transactionTimestampValueList = ponNameToTransactionTimestampValueHourlyListDictionary[ponName];
219:
220: foreach (var transactionTimestampValue in transactionTimestampValueList)
221: {
222: if (transactionTimestampValue.Timestamp >= startOfThisMonth)
223: {
224: if (!filteredPonNameToTransactionTimestampValueHourlyListDictionary.ContainsKey(ponName))
225: {
226: filteredPonNameToTransactionTimestampValueHourlyListDictionary[ponName] = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
227: }
228:
229: filteredPonNameToTransactionTimestampValueHourlyListDictionary[ponName].Add(transactionTimestampValue);
230: }
231: }
232: }
233:
234: var json = JsonSerializer.Serialize(filteredPonNameToTransactionTimestampValueHourlyListDictionary);
235:
236: byte[] zipBytes = Ia.Cl.Model.Zip.ZipString(json);
237:
238: File.WriteAllBytes(SdcArchiveFilePath + DateTime.UtcNow.AddHours(3).ToString("yyyy-MM") + ".zip.bytes", zipBytes);
239: }
240: else
241: {
242: }
243: }
244:
245: ////////////////////////////////////////////////////////////////////////////
246:
247: /// <summary>
248: ///
249: /// </summary>
250: public static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> PonNameToTransactionTimestampValueHourlyListDictionary()
251: {
252: return Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueHourlyListDictionary(false);
253: }
254:
255: ////////////////////////////////////////////////////////////////////////////
256:
257: /// <summary>
258: ///
259: /// </summary>
260: public static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> PonNameToTransactionTimestampValueHourlyListDictionary(bool recalculateContent)
261: {
262: if (ponNameToTransactionTimestampValueHourlyListDictionary == null || ponNameToTransactionTimestampValueHourlyListDictionary.Count == 0 || recalculateContent)
263: {
264: lock (objectLock)
265: {
266: ponNameToTransactionTimestampValueHourlyListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc._PonNameToTransactionTimestampValueHourlyListDictionary();
267: }
268: }
269:
270: return ponNameToTransactionTimestampValueHourlyListDictionary;
271: }
272:
273: ////////////////////////////////////////////////////////////////////////////
274:
275: /// <summary>
276: ///
277: /// </summary>
278: private static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> _PonNameToTransactionTimestampValueHourlyListDictionary()
279: {
280: string key;
281: DateTime dateTime;
282:
283: var ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
284:
285: var dictionary = new Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>();
286:
287: foreach (var ponName in ponNameToTransactionTimestampValueListDictionary.Keys)
288: {
289: var transactionTimestampToTransactionTimestampValueDictionary = new Dictionary<string, Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
290:
291: var list = ponNameToTransactionTimestampValueListDictionary[ponName];
292:
293: foreach (var l in list)
294: {
295: dateTime = new DateTime(l.Timestamp.Year, l.Timestamp.Month, l.Timestamp.Day, l.Timestamp.Hour, 0, 0);
296:
297: key = l.Transaction + ":" + dateTime;
298:
299: if (!transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, 0);
300:
301: if (transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key].Value += l.Value;
302: else
303: {
304: transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, l.Value);
305: }
306: }
307:
308: dictionary[ponName] = transactionTimestampToTransactionTimestampValueDictionary.Values.OrderBy(u => u.Timestamp).ToList();
309: }
310:
311: return dictionary;
312: }
313:
314: ////////////////////////////////////////////////////////////////////////////
315:
316: /// <summary>
317: ///
318: /// </summary>
319: public static List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue> TransactionTimestampValueHourlyListByPonName(string ponName)
320: {
321: string key;
322: DateTime dateTime;
323:
324: var transactionTimestampValueList = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.TransactionTimestampValueListByPonName(ponName);
325:
326: var dictionary = new Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>();
327:
328: var transactionTimestampToTransactionTimestampValueDictionary = new Dictionary<string, Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
329:
330: foreach (var l in transactionTimestampValueList)
331: {
332: dateTime = new DateTime(l.Timestamp.Year, l.Timestamp.Month, l.Timestamp.Day, l.Timestamp.Hour, 0, 0);
333:
334: key = l.Transaction + ":" + dateTime;
335:
336: if (!transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, 0);
337:
338: if (transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key].Value += l.Value;
339: else
340: {
341: transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, l.Value);
342: }
343: }
344:
345: var list = transactionTimestampToTransactionTimestampValueDictionary.Values.OrderBy(u => u.Timestamp).ToList();
346:
347: return list;
348: }
349:
350: ////////////////////////////////////////////////////////////////////////////
351: ////////////////////////////////////////////////////////////////////////////
352: }
353:
354: ////////////////////////////////////////////////////////////////////////////
355: ////////////////////////////////////////////////////////////////////////////
356: }