1: using Microsoft.EntityFrameworkCore;
2: using System;
3: using System.Collections;
4: using System.Collections.Generic;
5: using System.Data;
6: using System.Linq;
7: using System.Text;
8:
9: namespace Ia.Ngn.Cl.Model.Data.Huawei
10: {
11: ////////////////////////////////////////////////////////////////////////////
12:
13: /// <summary publish="true">
14: /// Huawei's Ont support class of Optical Fiber Network (OFN) data model.
15: /// </summary>
16: ///
17: /// <remarks>
18: /// Copyright © 2016-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
19: ///
20: /// 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
21: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
22: ///
23: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
24: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
25: ///
26: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
27: ///
28: /// Copyright notice: This notice may not be removed or altered from any source distribution.
29: /// </remarks>
30: public class Ont
31: {
32: /// <summary/>
33: public Ont() { }
34:
35: ////////////////////////////////////////////////////////////////////////////
36:
37: /// <summary>
38: ///
39: /// </summary>
40: public static List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> List()
41: {
42: List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> list;
43:
44: using (var db = new Ia.Ngn.Cl.Model.Ngn())
45: {
46: list = (from o in db.EmsOnts select o).ToList();
47: }
48:
49: return list;
50: }
51:
52: ////////////////////////////////////////////////////////////////////////////
53:
54: /// <summary>
55: ///
56: /// </summary>
57: public static List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> ListWithNullAccess()
58: {
59: List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> list;
60:
61: using (var db = new Ia.Ngn.Cl.Model.Ngn())
62: {
63: list = (from o in db.EmsOnts where o.Access == null select o).ToList();
64: }
65:
66: return list;
67: }
68:
69: ////////////////////////////////////////////////////////////////////////////
70:
71: /// <summary>
72: ///
73: /// </summary>
74: public static List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> ListIncludeAccess()
75: {
76: List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> list;
77:
78: using (var db = new Ia.Ngn.Cl.Model.Ngn())
79: {
80: list = (from o in db.EmsOnts select o).Include(u => u.Access).AsNoTracking().ToList();
81: }
82:
83: return list;
84: }
85:
86: ////////////////////////////////////////////////////////////////////////////
87:
88: /// <summary>
89: ///
90: /// </summary>
91: public static List<string> IdList()
92: {
93: List<string> list;
94:
95: using (var db = new Ia.Ngn.Cl.Model.Ngn())
96: {
97: list = (from o in db.EmsOnts select o.Id).ToList();
98: }
99:
100: return list;
101: }
102:
103: ////////////////////////////////////////////////////////////////////////////
104:
105: /// <summary>
106: ///
107: /// </summary>
108: public static List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> ListByDidFnSnPn(int did, int fn, int sn, int pn)
109: {
110: List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> list;
111:
112: using (var db = new Ia.Ngn.Cl.Model.Ngn())
113: {
114: list = (from o in db.EmsOnts
115: where o.DID == did && o.FN == fn && o.SN == sn && o.PN == pn
116: select o).ToList();
117: }
118:
119: return list;
120: }
121:
122: ////////////////////////////////////////////////////////////////////////////
123:
124: /// <summary>
125: ///
126: /// </summary>
127: public static List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> ListByDid(int did)
128: {
129: List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> list;
130:
131: using (var db = new Ia.Ngn.Cl.Model.Ngn())
132: {
133: list = (from o in db.EmsOnts where o.DID == did select o).Include(u => u.Access).ToList();
134: }
135:
136: return list;
137: }
138:
139: ////////////////////////////////////////////////////////////////////////////
140:
141: /// <summary>
142: ///
143: /// </summary>
144: public static Ia.Ngn.Cl.Model.Huawei.EmsOnt ReadByDidFnSnPnOntId(int did, int fn, int sn, int pn, int ontId)
145: {
146: Ia.Ngn.Cl.Model.Huawei.EmsOnt item;
147:
148: using (var db = new Ia.Ngn.Cl.Model.Ngn())
149: {
150: item = (from o in db.EmsOnts
151: where o.DID == did && o.FN == fn && o.SN == sn && o.PN == pn && o.ONTID == ontId
152: select o).SingleOrDefault();
153: }
154:
155: return item;
156: }
157:
158: ////////////////////////////////////////////////////////////////////////////
159:
160: /// <summary>
161: ///
162: /// </summary>
163: public static Ia.Ngn.Cl.Model.Huawei.EmsOnt Read(string id)
164: {
165: Ia.Ngn.Cl.Model.Huawei.EmsOnt item;
166:
167: using (var db = new Ia.Ngn.Cl.Model.Ngn())
168: {
169: item = (from o in db.EmsOnts
170: where o.Id == id
171: select o).AsNoTracking().SingleOrDefault(); // use Id to connect MduDev.NddOntId instead.Include(u => u.Access).SingleOrDefault();
172: }
173:
174: return item;
175: }
176:
177: ////////////////////////////////////////////////////////////////////////////
178:
179: /// <summary>
180: ///
181: /// </summary>
182: public static Ia.Ngn.Cl.Model.Huawei.EmsOnt ReadIncludeAccess(string id)
183: {
184: Ia.Ngn.Cl.Model.Huawei.EmsOnt item;
185:
186: using (var db = new Ia.Ngn.Cl.Model.Ngn())
187: {
188: item = (from o in db.EmsOnts
189: where o.Id == id
190: select o).Include(u => u.Access)/*
191: .Include(u => u.EmsPort)
192: .Include(u => u.EmsPort.EmsBoard)
193: .Include(u => u.EmsPort.EmsBoard.EmsDev)*/.AsNoTracking().SingleOrDefault();
194: }
195:
196: return item;
197: }
198:
199: ////////////////////////////////////////////////////////////////////////////
200:
201: /// <summary>
202: ///
203: /// </summary>
204: public static Ia.Ngn.Cl.Model.Huawei.EmsOnt ReadIncludeAccessAndEmsOntSipInfosAndEmsVoipPstnUsers(string id)
205: {
206: Ia.Ngn.Cl.Model.Huawei.EmsOnt item;
207:
208: using (var db = new Ia.Ngn.Cl.Model.Ngn())
209: {
210: item = (from o in db.EmsOnts
211: where o.Id == id
212: select o).Include(u => u.Access).Include(u => u.EmsOntSipInfos).Include(u => u.EmsVoipPstnUsers).AsNoTracking().SingleOrDefault();
213: }
214:
215: return item;
216: }
217:
218: /*
219: ////////////////////////////////////////////////////////////////////////////
220:
221: /// <summary>
222: ///
223: /// </summary>
224: public static List<Ia.Ngn.Cl.Model.Huawei.Ont> List(string portId)
225: {
226: List<Ia.Ngn.Cl.Model.Huawei.Ont> list;
227:
228: using (var db = new Ia.Ngn.Cl.Model.Ngn())
229: {
230: list = (from o in db.EmsOnts where o.Port.Id == portId select o).ToList();
231: }
232:
233: return list;
234: }
235: */
236:
237: /*
238: ////////////////////////////////////////////////////////////////////////////
239:
240: /// <summary>
241: ///
242: /// </summary>
243: public static List<Ia.Ngn.Cl.Model.Huawei.Ont> ListByBoardId(string boardId)
244: {
245: List<Ia.Ngn.Cl.Model.Huawei.Ont> list;
246:
247: using (var db = new Ia.Ngn.Cl.Model.Ngn())
248: {
249: list = (from o in db.EmsOnts where o.Port.Board.Id == boardId select o).ToList();
250: }
251:
252: return list;
253: }
254: */
255:
256: /*
257: ////////////////////////////////////////////////////////////////////////////
258:
259: /// <summary>
260: ///
261: /// </summary>
262: public static List<Ia.Ngn.Cl.Model.Huawei.Ont> ListByDevId(int devId)
263: {
264: List<Ia.Ngn.Cl.Model.Huawei.Ont> list;
265:
266: using (var db = new Ia.Ngn.Cl.Model.Ngn())
267: {
268: list = (from o in db.EmsOnts where o.Port.Board.Dev.Id == devId select o).ToList();
269: }
270:
271: return list;
272: }
273: */
274:
275: ////////////////////////////////////////////////////////////////////////////
276:
277: /// <summary>
278: ///
279: /// </summary>
280: public static Dictionary<string, string> IdToAccessIdDictionary
281: {
282: get
283: {
284: Dictionary<string, string> dictionary, nullDictionary;
285:
286: using (var db = new Ia.Ngn.Cl.Model.Ngn())
287: {
288: dictionary = (from s in db.EmsOnts
289: where s.Access != null
290: select new
291: {
292: s.Id,
293: s.Access
294: }).ToDictionary(u => u.Id, u => u.Access.Id);
295:
296: nullDictionary = (from s in db.Onts where s.Access == null select s.Id).ToDictionary(u => u, null);
297: }
298:
299: return dictionary.Union(nullDictionary).ToDictionary(u => u.Key, u => u.Value);
300: }
301: }
302:
303: ////////////////////////////////////////////////////////////////////////////
304:
305: /// <summary>
306: ///
307: /// </summary>
308: public static Dictionary<string, Ia.Ngn.Cl.Model.Huawei.EmsOnt> IdToOntDictionary
309: {
310: get
311: {
312: Dictionary<string, Ia.Ngn.Cl.Model.Huawei.EmsOnt> dictionary;
313:
314: using (var db = new Ia.Ngn.Cl.Model.Ngn())
315: {
316: dictionary = (from s in db.EmsOnts
317: where s.Access != null
318: select new { OntId = s.Id, Ont = s }).ToDictionary(u => u.OntId, u => u.Ont);
319: }
320:
321: return dictionary;
322: }
323: }
324:
325: ////////////////////////////////////////////////////////////////////////////
326:
327: /// <summary>
328: ///
329: /// </summary>
330: public static Dictionary<string, Ia.Ngn.Cl.Model.Huawei.EmsOnt> AccessIdToOntDictionary
331: {
332: get
333: {
334: Dictionary<string, Ia.Ngn.Cl.Model.Huawei.EmsOnt> dictionary;
335:
336: using (var db = new Ia.Ngn.Cl.Model.Ngn())
337: {
338: dictionary = (from s in db.EmsOnts
339: where s.Access != null
340: select new { OntAccessId = s.Access.Id, Ont = s }).ToDictionary(u => u.OntAccessId, u => u.Ont);
341: }
342:
343: return dictionary;
344: }
345: }
346:
347: ////////////////////////////////////////////////////////////////////////////
348:
349: /// <summary>
350: ///
351: /// </summary>
352: public static Hashtable IdWithNullAccessHashtable
353: {
354: get
355: {
356: List<string> list;
357: Hashtable ht;
358:
359: using (var db = new Ia.Ngn.Cl.Model.Ngn())
360: {
361: list = (from eo in db.EmsOnts where eo.Access == null select eo.Id).ToList();
362:
363: if (list.Count > 0)
364: {
365: ht = new Hashtable(list.Count);
366:
367: foreach (string s in list) ht[s] = null;
368: }
369: else ht = null;
370: }
371:
372: return ht;
373: }
374: }
375:
376: ////////////////////////////////////////////////////////////////////////////
377:
378: /// <summary>
379: ///
380: /// </summary>
381: public static Dictionary<string, string> IdToAliasForNonNullAccessDictionary
382: {
383: get
384: {
385: Dictionary<string, string> dictionary;
386:
387: using (var db = new Ia.Ngn.Cl.Model.Ngn())
388: {
389: dictionary = (from eo in db.EmsOnts
390: where eo.Access != null
391: select new
392: {
393: eo.Id,
394: eo.ALIAS
395: }).ToDictionary(u => u.Id, u => u.ALIAS);
396: }
397:
398: return dictionary;
399: }
400: }
401:
402: ////////////////////////////////////////////////////////////////////////////
403:
404: /// <summary>
405: ///
406: /// </summary>
407: public static Dictionary<string, int> DistributionOfEquipmentIdInEmsOntWhereAccessIsNotNullDictionary
408: {
409: get
410: {
411: Dictionary<string, int> dictionary;
412:
413: using (var db = new Ia.Ngn.Cl.Model.Ngn())
414: {
415: var v = (from s in db.EmsOnts
416: where s.Access != null
417: group s by s.EQUIPMENTID into g
418: select new { EquipmentId = g.Key, Count = g.Count() });
419:
420: dictionary = v.ToDictionary(u => u.EquipmentId, u => u.Count);
421: }
422:
423: return dictionary;
424: }
425: }
426:
427: ////////////////////////////////////////////////////////////////////////////
428:
429: /// <summary>
430: ///
431: /// </summary>
432: public static bool Update(Ia.Ngn.Cl.Model.Business.Huawei.Ems.Response response, out Ia.Cl.Model.Result result)
433: {
434: bool isUpdated;
435: int did, dictionaryDid, fn, sn, pn, ontId, queryFn, querySn, queryPn, queryOntId, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
436: string id, queryCommand, queryDev, accessId;
437: DataColumnCollection columns;
438: DataRow dataRow;
439: Dictionary<string, int> devToDidDictionary;
440: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Pon pon;
441: Ia.Ngn.Cl.Model.Huawei.EmsOnt ont, newOnt;
442: Ia.Ngn.Cl.Model.Huawei.EmsPort port;
443: //List<string> itemIdList;
444: //List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> ontList;
445:
446: isUpdated = false;
447: readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
448: result = new Ia.Cl.Model.Result();
449:
450: queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
451:
452: // "LST-ONT::DEV=" + ont.Pon.PonGroup.Olt.EmsName + ",FN=0,SN=" + sn + ",PN=" + pn + ",ONTID=" + ontId + ":{ctag}::;";
453: queryDev = Ia.Cl.Model.Default.Match(queryCommand, @"DEV=(.+?),");
454: queryFn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"FN=(\d+)"));
455: querySn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"SN=(\d+)"));
456: queryPn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"PN=(\d+)"));
457: queryOntId = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"ONTID=(\d+)"));
458:
459: if (response.CompletionCode == "COMPLD")
460: {
461: devToDidDictionary = Ia.Ngn.Cl.Model.Data.Huawei.Dev.DevToDidDictionary;
462:
463: if (devToDidDictionary.ContainsKey(queryDev))
464: {
465: dictionaryDid = devToDidDictionary[queryDev];
466:
467: port = Ia.Ngn.Cl.Model.Data.Huawei.Port.ReadByDidFnSnPn(dictionaryDid, queryFn, querySn, queryPn);
468:
469: if (port != null)
470: {
471: //itemIdList = new List<string>(readItemCount + 1);
472:
473: pon = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.PonByOltEmsNameAndSnAndPnAndOptionallyOntId(queryDev, querySn, queryPn, queryOntId);
474:
475: if (pon != null)
476: {
477: id = Ia.Ngn.Cl.Model.Business.Huawei.Ont.OntId(pon.Id, queryOntId);
478:
479: using (var db = new Ia.Ngn.Cl.Model.Ngn())
480: {
481: //ontList = (from eo in db.EmsOnts where eo.EmsPort.Id == port.Id select eo).ToList();
482:
483: ont = (from eo in db.EmsOnts where eo.Id == id select eo).SingleOrDefault();
484:
485: if (ont != null) existingItemCount = 1;
486:
487: if (response.QueryDataTable != null)
488: {
489: columns = response.QueryDataTable.Columns;
490: readItemCount = response.QueryDataTable.Rows.Count;
491:
492: if (readItemCount == 1)
493: {
494: dataRow = response.QueryDataTable.Rows[0];
495:
496: did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
497: fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
498: sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
499: pn = int.Parse(dataRow[columns.IndexOf("PN")].ToString());
500: ontId = int.Parse(dataRow[columns.IndexOf("ONTID")].ToString());
501:
502: if (fn == queryFn && sn == querySn && pn == queryPn && ontId == queryOntId)
503: {
504: newOnt = new Ia.Ngn.Cl.Model.Huawei.EmsOnt()
505: {
506: Id = id,
507: DID = did,
508: ResultCode = (long)response.ResultCode,
509: StateId = (int)Ia.Ngn.Cl.Model.Business.Huawei.Ems.BellcoreState.Unknown, // (int)response.ResultCode,
510: FN = fn,
511: SN = sn,
512: PN = pn,
513: ONTID = ontId,
514: NAME = columns.Contains("NAME") ? dataRow[columns.IndexOf("NAME")].ToString() : string.Empty,
515: ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
516: CAPABPROF = columns.Contains("CAPABPROF") ? dataRow[columns.IndexOf("CAPABPROF")].ToString() : string.Empty,
517: VENDORID = columns.Contains("VENDORID") ? dataRow[columns.IndexOf("VENDORID")].ToString() : string.Empty,
518: EQUIPMENTID = columns.Contains("EQUIPMENTID") ? dataRow[columns.IndexOf("EQUIPMENTID")].ToString() : string.Empty,
519: MAINSOFTVERSION = columns.Contains("MAINSOFTVERSION") ? dataRow[columns.IndexOf("MAINSOFTVERSION")].ToString() : string.Empty,
520: AUTH = columns.Contains("AUTH") ? dataRow[columns.IndexOf("AUTH")].ToString() : string.Empty,
521: AUTHTIMEOUT = columns.Contains("AUTHTIMEOUT") ? Ia.Ngn.Cl.Model.Business.Huawei.Ont.SpecialIntegerParameterHandling("AUTHTIMEOUT", dataRow[columns.IndexOf("AUTHTIMEOUT")].ToString()) : 0,
522: LINEPROF = columns.Contains("LINEPROF") ? dataRow[columns.IndexOf("LINEPROF")].ToString() : string.Empty,
523: SRVPROF = columns.Contains("SRVPROF") ? dataRow[columns.IndexOf("SRVPROF")].ToString() : string.Empty,
524: SERIALNUM = columns.Contains("SERIALNUM") ? dataRow[columns.IndexOf("SERIALNUM")].ToString() : string.Empty,
525: LOID = columns.Contains("LOID") ? dataRow[columns.IndexOf("LOID")].ToString() : string.Empty,
526: CHECKCODE = columns.Contains("CHECKCODE") ? dataRow[columns.IndexOf("CHECKCODE")].ToString() : string.Empty,
527: PWD = columns.Contains("PWD") ? dataRow[columns.IndexOf("PWD")].ToString() : string.Empty,
528: ALMPROF = columns.Contains("ALMPROF") ? dataRow[columns.IndexOf("ALMPROF")].ToString() : string.Empty,
529: DEV = columns.Contains("DEV") ? dataRow[columns.IndexOf("DEV")].ToString() : string.Empty,
530: VLAN = columns.Contains("VLAN") ? int.Parse(dataRow[columns.IndexOf("VLAN")].ToString()) : 0,
531: PRI = columns.Contains("PRI") ? int.Parse(dataRow[columns.IndexOf("PRI")].ToString()) : 0,
532: IP = columns.Contains("IP") ? dataRow[columns.IndexOf("IP")].ToString() : string.Empty,
533: MASK = columns.Contains("MASK") ? dataRow[columns.IndexOf("MASK")].ToString() : string.Empty,
534: GATE = columns.Contains("GATE") ? dataRow[columns.IndexOf("GATE")].ToString() : string.Empty,
535: ROUTEIP = columns.Contains("ROUTEIP") ? dataRow[columns.IndexOf("ROUTEIP")].ToString() : string.Empty,
536: ROUTEMASK = columns.Contains("ROUTEMASK") ? dataRow[columns.IndexOf("ROUTEMASK")].ToString() : string.Empty,
537: NEXTHOP = columns.Contains("NEXTHOP") ? dataRow[columns.IndexOf("NEXTHOP")].ToString() : string.Empty,
538: SNMPPROF = columns.Contains("SNMPPROF") ? dataRow[columns.IndexOf("SNMPPROF")].ToString() : string.Empty,
539: OPTALMPROF = columns.Contains("OPTALMPROF") ? dataRow[columns.IndexOf("OPTALMPROF")].ToString() : string.Empty,
540: VAPROF = columns.Contains("VAPROF") ? dataRow[columns.IndexOf("VAPROF")].ToString() : string.Empty,
541: MACLEARN = columns.Contains("MACLEARN") ? dataRow[columns.IndexOf("MACLEARN")].ToString() : string.Empty,
542: SRVLEVELPROF = columns.Contains("SRVLEVELPROF") ? dataRow[columns.IndexOf("SRVLEVELPROF")].ToString() : string.Empty,
543: LSTUPTIME = columns.Contains("LSTUPTIME") ? int.Parse(dataRow[columns.IndexOf("LSTUPTIME")].ToString()) : 0,
544: LSTDOWNTIME = columns.Contains("LSTDOWNTIME") ? int.Parse(dataRow[columns.IndexOf("LSTDOWNTIME")].ToString()) : 0,
545: DEVCURRENTTIME = columns.Contains("DEVCURRENTTIME") ? int.Parse(dataRow[columns.IndexOf("DEVCURRENTTIME")].ToString()) : 0,
546: VASPROFILESET = columns.Contains("VASPROFILESET") ? dataRow[columns.IndexOf("VASPROFILESET")].ToString() : string.Empty,
547: HARDWAREVERSION = columns.Contains("HARDWAREVERSION") ? dataRow[columns.IndexOf("HARDWAREVERSION")].ToString() : string.Empty,
548: OPERSTATE = columns.Contains("OPERSTATE") ? dataRow[columns.IndexOf("OPERSTATE")].ToString() : string.Empty,
549: DEVNAME = columns.Contains("DEVNAME") ? dataRow[columns.IndexOf("DEVNAME")].ToString() : string.Empty,
550: BINDWIDTHTYPE = columns.Contains("BINDWIDTHTYPE") ? int.Parse(dataRow[columns.IndexOf("BINDWIDTHTYPE")].ToString()) : 0,
551: EmsPort = (from ep in db.EmsPorts where ep.Id == port.Id select ep).SingleOrDefault()
552: };
553:
554: accessId = Ia.Ngn.Cl.Model.Business.Access.AccessId(id);
555: if (accessId != null) newOnt.Access = (from a in db.Accesses where a.Id == accessId select a).SingleOrDefault();
556:
557: if (ont == null)
558: {
559: newOnt.Created = newOnt.Updated = DateTime.UtcNow.AddHours(3);
560:
561: db.EmsOnts.Add(newOnt);
562:
563: insertedItemCount++;
564: }
565: else // update
566: {
567: // below: copy values from newOnt to ont
568:
569: if (ont.Update(newOnt))
570: {
571: db.EmsOnts.Attach(ont);
572: db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
573:
574: updatedItemCount++;
575: }
576: }
577: }
578: else
579: {
580: result.AddError("LST-ONT (" + response.Ctag + "): did, fn, sn, pn, and/or ontId is/are not equal to queryDid, queryFn, querySn, queryPn, and/or ontId. did: " + did + ", queryDid: " + queryDev + ", fn: " + fn + ", queryFn: " + queryFn + ", sn: " + sn + ", querySn: " + querySn + ", pn: " + pn + ", queryPn: " + queryPn + ", ontId: " + ontId + ", queryOntId: " + queryOntId);
581: }
582: }
583: else //if (readItemCount > 1)
584: {
585: result.AddError("LST-ONT (" + response.Ctag + "): dataTable.Rows.Count has more than 1 row");
586: }
587: }
588: else
589: {
590: // if DataTable is null or "Resource does not exist"
591: // delete element if exists
592:
593: if (ont != null)
594: {
595: db.EmsOnts.Remove(ont);
596:
597: deletedItemCount++;
598: }
599:
600: result.AddWarning("LST-ONT (" + response.Ctag + "): " + response.CompletionCode + ", " + response.ResultCode.ToString());
601: }
602:
603: db.SaveChanges();
604: }
605:
606: if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
607: else isUpdated = false;
608:
609: result.AddSuccess("LST-ONT (" + response.Ctag + "): " + response.CompletionCode + ", " + response.ResultCode.ToString() + " (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
610: }
611: else
612: {
613: result.AddWarning("LST-ONT (" + response.Ctag + "): NDD PON is null");
614: }
615: }
616: else
617: {
618: result.AddWarning("LST-ONT (" + response.Ctag + "): port is null");
619: }
620: }
621: else
622: {
623: result.AddError("LST-ONT (" + response.Ctag + "): devToDidDictionary does not contain key: " + queryDev);
624: }
625: }
626: else
627: {
628: result.AddWarning("LST-ONT (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
629: }
630:
631: return isUpdated;
632: }
633:
634: ////////////////////////////////////////////////////////////////////////////
635:
636: /// <summary>
637: ///
638: /// </summary>
639: public static bool UpdateListWithDid(Ia.Ngn.Cl.Model.Business.Huawei.Ems.Response response, out Ia.Cl.Model.Result result)
640: {
641: bool isUpdated;
642: int queryDid, did, fn, sn, pn, ontId, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
643: string id, queryCommand, accessId;
644: DataColumnCollection columns;
645: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Pon pon;
646: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt;
647: Ia.Ngn.Cl.Model.Huawei.EmsOnt ont, newOnt;
648: Ia.Ngn.Cl.Model.Huawei.EmsPort port;
649: List<string> itemIdList;
650: List<Ia.Ngn.Cl.Model.Huawei.EmsOnt> ontList;
651:
652: isUpdated = false;
653: readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
654: result = new Ia.Cl.Model.Result();
655:
656: if (response.CompletionCode == "COMPLD")
657: {
658: if (response.QueryDataTable != null)
659: {
660: queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
661:
662: columns = response.QueryDataTable.Columns;
663: readItemCount = response.QueryDataTable.Rows.Count;
664:
665: // "LST-ONT::DID=" + olt.Did + ":{ctag}::;";
666: queryDid = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"DID=(\d+):"));
667:
668: olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltByDid(queryDid);
669:
670: if (olt != null)
671: {
672: ontList = Ia.Ngn.Cl.Model.Data.Huawei.Ont.ListByDid(queryDid);
673: existingItemCount = ontList.Count;
674:
675: itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
676:
677: using (var db = new Ia.Ngn.Cl.Model.Ngn())
678: {
679: foreach (DataRow dataRow in response.QueryDataTable.Rows)
680: {
681: did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
682: fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
683: sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
684: pn = int.Parse(dataRow[columns.IndexOf("PN")].ToString());
685: ontId = int.Parse(dataRow[columns.IndexOf("ONTID")].ToString());
686:
687: port = Ia.Ngn.Cl.Model.Data.Huawei.Port.ReadByDidFnSnPn(queryDid, fn, sn, pn);
688:
689: if (port != null)
690: {
691: ontList = (from eo in db.EmsOnts where eo.EmsPort.Id == port.Id select eo).ToList();
692: // or ontList = Ia.Ngn.Cl.Model.Data.Huawei.Ont.List(port.Id);
693:
694: if (did == queryDid)
695: {
696: pon = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.PonByOltEmsNameAndSnAndPnAndOptionallyOntId(olt.EmsName, sn, pn, ontId);
697:
698: if (pon != null)
699: {
700: id = Ia.Ngn.Cl.Model.Business.Huawei.Ont.OntId(pon.Id, ontId);
701:
702: newOnt = new Ia.Ngn.Cl.Model.Huawei.EmsOnt()
703: {
704: Id = id,
705: DID = did,
706: FN = fn,
707: SN = sn,
708: PN = pn,
709: ONTID = ontId,
710: NAME = columns.Contains("NAME") ? dataRow[columns.IndexOf("NAME")].ToString() : string.Empty,
711: ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
712: CAPABPROF = columns.Contains("CAPABPROF") ? dataRow[columns.IndexOf("CAPABPROF")].ToString() : string.Empty,
713: VENDORID = columns.Contains("VENDORID") ? dataRow[columns.IndexOf("VENDORID")].ToString() : string.Empty,
714: EQUIPMENTID = columns.Contains("EQUIPMENTID") ? dataRow[columns.IndexOf("EQUIPMENTID")].ToString() : string.Empty,
715: MAINSOFTVERSION = columns.Contains("MAINSOFTVERSION") ? dataRow[columns.IndexOf("MAINSOFTVERSION")].ToString() : string.Empty,
716: AUTH = columns.Contains("AUTH") ? dataRow[columns.IndexOf("AUTH")].ToString() : string.Empty,
717: AUTHTIMEOUT = columns.Contains("AUTHTIMEOUT") ? Ia.Ngn.Cl.Model.Business.Huawei.Ont.SpecialIntegerParameterHandling("AUTHTIMEOUT", dataRow[columns.IndexOf("AUTHTIMEOUT")].ToString()) : 0,
718: LINEPROF = columns.Contains("LINEPROF") ? dataRow[columns.IndexOf("LINEPROF")].ToString() : string.Empty,
719: SRVPROF = columns.Contains("SRVPROF") ? dataRow[columns.IndexOf("SRVPROF")].ToString() : string.Empty,
720: SERIALNUM = columns.Contains("SERIALNUM") ? dataRow[columns.IndexOf("SERIALNUM")].ToString() : string.Empty,
721: LOID = columns.Contains("LOID") ? dataRow[columns.IndexOf("LOID")].ToString() : string.Empty,
722: CHECKCODE = columns.Contains("CHECKCODE") ? dataRow[columns.IndexOf("CHECKCODE")].ToString() : string.Empty,
723: PWD = columns.Contains("PWD") ? dataRow[columns.IndexOf("PWD")].ToString() : string.Empty,
724: ALMPROF = columns.Contains("ALMPROF") ? dataRow[columns.IndexOf("ALMPROF")].ToString() : string.Empty,
725: DEV = columns.Contains("DEV") ? dataRow[columns.IndexOf("DEV")].ToString() : string.Empty,
726: VLAN = columns.Contains("VLAN") ? int.Parse(dataRow[columns.IndexOf("VLAN")].ToString()) : 0,
727: PRI = columns.Contains("PRI") ? int.Parse(dataRow[columns.IndexOf("PRI")].ToString()) : 0,
728: IP = columns.Contains("IP") ? dataRow[columns.IndexOf("IP")].ToString() : string.Empty,
729: MASK = columns.Contains("MASK") ? dataRow[columns.IndexOf("MASK")].ToString() : string.Empty,
730: GATE = columns.Contains("GATE") ? dataRow[columns.IndexOf("GATE")].ToString() : string.Empty,
731: ROUTEIP = columns.Contains("ROUTEIP") ? dataRow[columns.IndexOf("ROUTEIP")].ToString() : string.Empty,
732: ROUTEMASK = columns.Contains("ROUTEMASK") ? dataRow[columns.IndexOf("ROUTEMASK")].ToString() : string.Empty,
733: NEXTHOP = columns.Contains("NEXTHOP") ? dataRow[columns.IndexOf("NEXTHOP")].ToString() : string.Empty,
734: SNMPPROF = columns.Contains("SNMPPROF") ? dataRow[columns.IndexOf("SNMPPROF")].ToString() : string.Empty,
735: OPTALMPROF = columns.Contains("OPTALMPROF") ? dataRow[columns.IndexOf("OPTALMPROF")].ToString() : string.Empty,
736: VAPROF = columns.Contains("VAPROF") ? dataRow[columns.IndexOf("VAPROF")].ToString() : string.Empty,
737: MACLEARN = columns.Contains("MACLEARN") ? dataRow[columns.IndexOf("MACLEARN")].ToString() : string.Empty,
738: SRVLEVELPROF = columns.Contains("SRVLEVELPROF") ? dataRow[columns.IndexOf("SRVLEVELPROF")].ToString() : string.Empty,
739: LSTUPTIME = columns.Contains("LSTUPTIME") ? int.Parse(dataRow[columns.IndexOf("LSTUPTIME")].ToString()) : 0,
740: LSTDOWNTIME = columns.Contains("LSTDOWNTIME") ? int.Parse(dataRow[columns.IndexOf("LSTDOWNTIME")].ToString()) : 0,
741: DEVCURRENTTIME = columns.Contains("DEVCURRENTTIME") ? int.Parse(dataRow[columns.IndexOf("DEVCURRENTTIME")].ToString()) : 0,
742: VASPROFILESET = columns.Contains("VASPROFILESET") ? dataRow[columns.IndexOf("VASPROFILESET")].ToString() : string.Empty,
743: HARDWAREVERSION = columns.Contains("HARDWAREVERSION") ? dataRow[columns.IndexOf("HARDWAREVERSION")].ToString() : string.Empty,
744: OPERSTATE = columns.Contains("OPERSTATE") ? dataRow[columns.IndexOf("OPERSTATE")].ToString() : string.Empty,
745: DEVNAME = columns.Contains("DEVNAME") ? dataRow[columns.IndexOf("DEVNAME")].ToString() : string.Empty,
746: BINDWIDTHTYPE = columns.Contains("BINDWIDTHTYPE") ? int.Parse(dataRow[columns.IndexOf("BINDWIDTHTYPE")].ToString()) : 0,
747: EmsPort = (from ep in db.EmsPorts where ep.Id == port.Id select ep).SingleOrDefault()
748: };
749:
750: accessId = Ia.Ngn.Cl.Model.Business.Access.AccessId(id);
751: if (accessId != null) newOnt.Access = (from a in db.Accesses where a.Id == accessId select a).SingleOrDefault();
752:
753: ont = (from eo in /*ontList*/ db.EmsOnts where eo.Id == id select eo).SingleOrDefault();
754:
755: if (ont == null)
756: {
757: newOnt.Created = newOnt.Updated = DateTime.UtcNow.AddHours(3);
758:
759: db.EmsOnts.Add(newOnt);
760:
761: insertedItemCount++;
762: }
763: else
764: {
765: // below: copy values from newOnt to ont
766:
767: if (ont.Update(newOnt))
768: {
769: db.EmsOnts.Attach(ont);
770: db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
771:
772: updatedItemCount++;
773: }
774: }
775:
776: itemIdList.Add(id); // keep at the end
777: }
778: else
779: {
780: result.AddError("LST-ONT (" + response.Ctag + "): PON is null.");
781: }
782: }
783: else
784: {
785: result.AddError("LST-ONT (" + response.Ctag + "): did not equal to queryDid. did: " + did);
786: }
787: }
788: else
789: {
790: result.AddWarning("LST-ONT (" + response.Ctag + "): port is null");
791: }
792: }
793:
794: // below: this function will remove values that were not present in the reading
795: if (ontList.Count > 0)
796: {
797: foreach (Ia.Ngn.Cl.Model.Huawei.EmsOnt on in ontList)
798: {
799: if (!itemIdList.Contains(on.Id))
800: {
801: ont = (from o in db.EmsOnts where o.Id == @on.Id select o).SingleOrDefault();
802:
803: db.EmsOnts.Remove(ont);
804:
805: deletedItemCount++;
806: }
807: }
808: }
809:
810: db.SaveChanges();
811: }
812:
813: if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
814: else isUpdated = false;
815:
816: result.AddSuccess("LST-ONT (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
817: }
818: else
819: {
820: result.AddWarning("LST-ONT (" + response.Ctag + "): NDD OLT is null");
821: }
822: }
823: else
824: {
825: result.AddWarning("LST-ONT (" + response.Ctag + "): QueryDataTable is null, (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
826: }
827: }
828: else
829: {
830: result.AddWarning("LST-ONT (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
831: }
832:
833: return isUpdated;
834: }
835:
836: ////////////////////////////////////////////////////////////////////////////
837:
838: /// <summary>
839: ///
840: /// </summary>
841: public static bool UpdateResultCode(Ia.Ngn.Cl.Model.Huawei.EmsOnt emsOnt, Ia.Ngn.Cl.Model.Client.Huawei.Ems.ResultCode resultCode)
842: {
843: // similar to Ia.Ngn.Cl.Model.Data.Huawei.Dev.UpdateResultCode();
844: bool isUpdated;
845:
846: using (var db = new Ia.Ngn.Cl.Model.Ngn())
847: {
848: if (emsOnt != null)
849: {
850: var updatedOnt = (from o in db.EmsOnts where o.Id == emsOnt.Id select o).SingleOrDefault();
851:
852: if (updatedOnt != null)
853: {
854: if (updatedOnt.ResultCode != (long)resultCode)
855: {
856: updatedOnt.ResultCode = (long)resultCode;
857: updatedOnt.Updated = DateTime.UtcNow.AddHours(3);
858:
859: db.EmsOnts.Attach(updatedOnt);
860: db.Entry(updatedOnt).Property(u => u.ResultCode).IsModified = true;
861: db.Entry(updatedOnt).Property(u => u.Updated).IsModified = true;
862:
863: db.SaveChanges();
864:
865: isUpdated = true;
866: //result.AddSuccess("EmsOnt.ResultCode updated. ");
867: }
868: else
869: {
870: isUpdated = false;
871: // result.AddWarning("Warning: EmsOnt.ResultCode value was not updated because its the same. ");
872: }
873: }
874: else
875: {
876: isUpdated = false;
877: // result.AddError("Error: updatedOnt is null. ");
878: }
879: }
880: else
881: {
882: isUpdated = false;
883: }
884: }
885:
886: return isUpdated;
887: }
888:
889: ////////////////////////////////////////////////////////////////////////////
890:
891: /// <summary>
892: ///
893: /// </summary>
894: public static bool NullifyAccessIdByAccessId(string accessId, out string result)
895: {
896: bool b;
897: int numberOfRecordsWhereAccessIsNullified;
898: Ia.Ngn.Cl.Model.Huawei.EmsOnt ont;
899:
900: b = false;
901: numberOfRecordsWhereAccessIsNullified = 0;
902:
903: using (var db = new Ia.Ngn.Cl.Model.Ngn())
904: {
905: // --update EmsOnts set Access_Id = null where Access_Id = '1040101010040004'
906: //var query = (from eo in db.EmsOnts where eo.Access.Id == accessId select eo).ToList();
907:
908: //foreach (var v in query)
909: //{
910: ont = (from o in db.EmsOnts where o.Access.Id == accessId select o).Include(u => u.Access).FirstOrDefault(); //.SingleOrDefault();
911:
912: if (ont != null)
913: {
914: ont.Access = null;
915: ont.Updated = DateTime.UtcNow.AddHours(3);
916:
917: db.EmsOnts.Attach(ont);
918: db.Entry(ont).Property(u => u.Updated).IsModified = true;
919:
920: db.SaveChanges();
921:
922: numberOfRecordsWhereAccessIsNullified++;
923: }
924: //}
925:
926: b = true;
927: }
928:
929: result = "Number of records where access is nullified: " + numberOfRecordsWhereAccessIsNullified;
930:
931: return b;
932: }
933:
934: ////////////////////////////////////////////////////////////////////////////
935:
936: /// <summary>
937: ///
938: /// </summary>
939: public static bool Delete(string id, out string result)
940: {
941: bool b;
942:
943: b = false;
944: result = string.Empty;
945:
946: using (var db = new Ia.Ngn.Cl.Model.Ngn())
947: {
948: var v = (from em in db.EmsOnts where em.Id == id select em).FirstOrDefault();
949:
950: if (v != null)
951: {
952: db.EmsOnts.Remove(v);
953: db.SaveChanges();
954:
955: b = true;
956: }
957: else b = false;
958: }
959:
960: return b;
961: }
962:
963: ////////////////////////////////////////////////////////////////////////////
964:
965: /// <summary>
966: ///
967: /// </summary>
968: public static bool DeleteByAccessId(string accessId, out string result)
969: {
970: bool b;
971:
972: b = false;
973: result = string.Empty;
974:
975: using (var db = new Ia.Ngn.Cl.Model.Ngn())
976: {
977: var v = (from eo in db.EmsOnts where eo.Access.Id == accessId select eo).Include(u => u.Access).FirstOrDefault();
978:
979: if (v != null)
980: {
981: db.EmsOnts.Remove(v);
982: db.SaveChanges();
983:
984: b = true;
985: }
986: else b = false;
987: }
988:
989: return b;
990: }
991:
992: ////////////////////////////////////////////////////////////////////////////
993: ////////////////////////////////////////////////////////////////////////////
994:
995: /// <summary>
996: ///
997: /// </summary>
998: public static string ToSimpleTextString(Ia.Ngn.Cl.Model.Huawei.EmsOnt ont)
999: {
StringBuilder sb;
sb = new StringBuilder();
/*
//sb.AppendLine("Vendor: " + Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia.Name);
sb.AppendLine("State: " + ont.State);
sb.AppendLine("FamilyType: " + Ia.Ngn.Cl.Model.Data.Nokia.Ont.FamilyTypeFromId(ont.FamilyTypeId));
sb.AppendLine("Serial: " + ont.Serial);
sb.AppendLine("EquipmentId: " + ont.EquipmentId);
sb.AppendLine("ActiveSoftware: " + ont.ActiveSoftware);
//sb.AppendLine("PassiveSoftware: " + ont.PassiveSoftware);
sb.AppendLine("PlannedSoftware: " + ont.PlannedSoftware);
//sb.AppendLine("BatteryBackupAvailable: " + ont.BatteryBackupAvailable);
sb.AppendLine("Description1: " + ont.Description1);
sb.AppendLine("Description2: " + ont.Description2);
*/
return sb.ToString();
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
}