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: try
135: {
136: Impersonation.RunAsUser(userCredentials, LogonType.NewCredentials, () =>
137: {
138: var zipBytes = File.ReadAllBytes(SdcArchiveFilePath + DateTime.UtcNow.AddHours(3).ToString("yyyy-MM") + ".zip.bytes");
139:
140: string json = Ia.Cl.Model.Zip.UnzipString(zipBytes);
141:
142: ponNameToTransactionTimestampValueListDictionary = JsonSerializer.Deserialize<Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>>(json);
143: });
144: }
145: catch (Exception e)
146: {
147: }
148:
149: // default value
150: if (ponNameToTransactionTimestampValueListDictionary == null)
151: {
152: ponNameToTransactionTimestampValueListDictionary = new Dictionary<string, List<Business.Nokia.Sdc.TransactionTimestampValue>>();
153: }
154:
155: return ponNameToTransactionTimestampValueListDictionary;
156: }
157:
158: ////////////////////////////////////////////////////////////////////////////
159:
160: /// <summary>
161: ///
162: /// </summary>
163: 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)
164: {
165: var ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
166:
167: // debug
168: /*
169: if (ponNameToTimestampValueListDictionary == null || ponNameToTimestampValueListDictionary.Count == 0)
170: {
171: ponNameToTimestampValueListDictionary = new Dictionary<string, List<Business.Nokia.Sdc.TimestampValue>>();
172: }
173: */
174:
175: if (ponNameToTransactionTimestampValueListDictionary.ContainsKey(pon.Name))
176: {
177: if (ponNameToTransactionTimestampValueListDictionary[pon.Name] == null)
178: {
179: ponNameToTransactionTimestampValueListDictionary[pon.Name] = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
180: }
181: }
182: else ponNameToTransactionTimestampValueListDictionary[pon.Name] = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
183:
184: var transactiontimestampValueList = ponNameToTransactionTimestampValueListDictionary[pon.Name];
185:
186: int i = 1;
187:
188: foreach (var v in valueList)
189: {
190: if (!transactiontimestampValueList.Any(u => u.Transaction == transaction && u.Timestamp.DayOfYear == timestampDateTime.DayOfYear && u.Timestamp.Hour == timestampDateTime.Hour && u.Value == v))
191: {
192: var transactionTimestampValue = new TransactionTimestampValue(transaction, timestampDateTime.AddMinutes(-i * 5), v);
193:
194: ponNameToTransactionTimestampValueListDictionary[pon.Name].Add(transactionTimestampValue);
195: }
196: else
197: {
198: }
199:
200: i++;
201: }
202: }
203:
204: ////////////////////////////////////////////////////////////////////////////
205:
206: /// <summary>
207: ///
208: /// </summary>
209: public static void WritePonNameToTransactionTimestampValueHourlyListDictionaryToJsonFile()
210: {
211: var now = DateTime.UtcNow.AddHours(3);
212:
213: var startOfThisMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
214:
215: var filteredPonNameToTransactionTimestampValueHourlyListDictionary = new Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>();
216:
217: var ponNameToTransactionTimestampValueHourlyListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueHourlyListDictionary(true);
218: //var ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
219:
220: if (ponNameToTransactionTimestampValueHourlyListDictionary != null)
221: {
222: foreach (var ponName in ponNameToTransactionTimestampValueHourlyListDictionary.Keys)
223: {
224: var transactionTimestampValueList = ponNameToTransactionTimestampValueHourlyListDictionary[ponName];
225:
226: foreach (var transactionTimestampValue in transactionTimestampValueList)
227: {
228: if (transactionTimestampValue.Timestamp >= startOfThisMonth)
229: {
230: if (!filteredPonNameToTransactionTimestampValueHourlyListDictionary.ContainsKey(ponName))
231: {
232: filteredPonNameToTransactionTimestampValueHourlyListDictionary[ponName] = new List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
233: }
234:
235: filteredPonNameToTransactionTimestampValueHourlyListDictionary[ponName].Add(transactionTimestampValue);
236: }
237: }
238: }
239:
240: var json = JsonSerializer.Serialize(filteredPonNameToTransactionTimestampValueHourlyListDictionary);
241:
242: byte[] zipBytes = Ia.Cl.Model.Zip.ZipString(json);
243:
244: File.WriteAllBytes(SdcArchiveFilePath + DateTime.UtcNow.AddHours(3).ToString("yyyy-MM") + ".zip.bytes", zipBytes);
245: }
246: else
247: {
248: }
249: }
250:
251: ////////////////////////////////////////////////////////////////////////////
252:
253: /// <summary>
254: ///
255: /// </summary>
256: public static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> PonNameToTransactionTimestampValueHourlyListDictionary()
257: {
258: return Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueHourlyListDictionary(false);
259: }
260:
261: ////////////////////////////////////////////////////////////////////////////
262:
263: /// <summary>
264: ///
265: /// </summary>
266: public static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> PonNameToTransactionTimestampValueHourlyListDictionary(bool recalculateContent)
267: {
268: if (ponNameToTransactionTimestampValueHourlyListDictionary == null || ponNameToTransactionTimestampValueHourlyListDictionary.Count == 0 || recalculateContent)
269: {
270: lock (objectLock)
271: {
272: ponNameToTransactionTimestampValueHourlyListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc._PonNameToTransactionTimestampValueHourlyListDictionary();
273: }
274: }
275:
276: return ponNameToTransactionTimestampValueHourlyListDictionary;
277: }
278:
279: ////////////////////////////////////////////////////////////////////////////
280:
281: /// <summary>
282: ///
283: /// </summary>
284: private static Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>> _PonNameToTransactionTimestampValueHourlyListDictionary()
285: {
286: string key;
287: DateTime dateTime;
288:
289: var ponNameToTransactionTimestampValueListDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.PonNameToTransactionTimestampValueListDictionary();
290:
291: var dictionary = new Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>();
292:
293: foreach (var ponName in ponNameToTransactionTimestampValueListDictionary.Keys)
294: {
295: var transactionTimestampToTransactionTimestampValueDictionary = new Dictionary<string, Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
296:
297: var list = ponNameToTransactionTimestampValueListDictionary[ponName];
298:
299: foreach (var l in list)
300: {
301: dateTime = new DateTime(l.Timestamp.Year, l.Timestamp.Month, l.Timestamp.Day, l.Timestamp.Hour, 0, 0);
302:
303: key = l.Transaction + ":" + dateTime;
304:
305: if (!transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, 0);
306:
307: if (transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key].Value += l.Value;
308: else
309: {
310: transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, l.Value);
311: }
312: }
313:
314: dictionary[ponName] = transactionTimestampToTransactionTimestampValueDictionary.Values.OrderBy(u => u.Timestamp).ToList();
315: }
316:
317: return dictionary;
318: }
319:
320: ////////////////////////////////////////////////////////////////////////////
321:
322: /// <summary>
323: ///
324: /// </summary>
325: public static List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue> TransactionTimestampValueHourlyListByPonName(string ponName)
326: {
327: string key;
328: DateTime dateTime;
329:
330: var transactionTimestampValueList = Ia.Ngn.Cl.Model.Data.Nokia.Sdc.TransactionTimestampValueListByPonName(ponName);
331:
332: var dictionary = new Dictionary<string, List<Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>>();
333:
334: var transactionTimestampToTransactionTimestampValueDictionary = new Dictionary<string, Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue>();
335:
336: foreach (var l in transactionTimestampValueList)
337: {
338: dateTime = new DateTime(l.Timestamp.Year, l.Timestamp.Month, l.Timestamp.Day, l.Timestamp.Hour, 0, 0);
339:
340: key = l.Transaction + ":" + dateTime;
341:
342: if (!transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, 0);
343:
344: if (transactionTimestampToTransactionTimestampValueDictionary.ContainsKey(key)) transactionTimestampToTransactionTimestampValueDictionary[key].Value += l.Value;
345: else
346: {
347: transactionTimestampToTransactionTimestampValueDictionary[key] = new Ia.Ngn.Cl.Model.Business.Nokia.Sdc.TransactionTimestampValue(l.Transaction, dateTime, l.Value);
348: }
349: }
350:
351: var list = transactionTimestampToTransactionTimestampValueDictionary.Values.OrderBy(u => u.Timestamp).ToList();
352:
353: return list;
354: }
355:
356: ////////////////////////////////////////////////////////////////////////////
357: ////////////////////////////////////////////////////////////////////////////
358: }
359:
360: ////////////////////////////////////////////////////////////////////////////
361: ////////////////////////////////////////////////////////////////////////////
362: }