1: using System;
2: using System.Collections.Generic;
3: using System.Data;
4: using System.Linq;
5: using System.Text;
6:
7: namespace Ia.Ngn.Cl.Model.Data.Huawei
8: {
9: ////////////////////////////////////////////////////////////////////////////
10:
11: /// <summary publish="true">
12: /// Huawei's EMS VAG Entity Framework class for Optical Fiber Network (OFN) data model.
13: /// </summary>
14: ///
15: /// <remarks>
16: /// Copyright © 2019-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
17: ///
18: /// 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
19: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
20: ///
21: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
22: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
23: ///
24: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
25: ///
26: /// Copyright notice: This notice may not be removed or altered from any source distribution.
27: /// </remarks>
28: public class Vag
29: {
30: /// <summary/>
31: public Vag() { }
32:
33: ////////////////////////////////////////////////////////////////////////////
34:
35: /// <summary>
36: ///
37: /// </summary>
38: public static bool Update(Ia.Ngn.Cl.Model.Business.Huawei.Ems.Response response, out Ia.Cl.Model.Result result)
39: {
40: bool isUpdated;
41: int did, queryDid, queryVagId, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount, vagId;
42: string id, queryCommand;
43: DataColumnCollection columns;
44: DataRow columnDataRow;
45: Ia.Ngn.Cl.Model.Huawei.EmsVag emsVag, newVag;
46: Ia.Ngn.Cl.Model.Huawei.EmsOnt emsOnt;
47: Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev mduDev;
48: List<string> itemIdList;
49: List<Ia.Ngn.Cl.Model.Huawei.EmsVag> emsVagList;
50:
51: isUpdated = false;
52: readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
53:
54: result = new Ia.Cl.Model.Result(); // remove initially then add to test all return paths
55:
56: queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
57:
58: // LST-VAG::DEV=MDU-SAA-748-002,VAGID=0:1::;
59: //queryDev = Ia.Cl.Model.Default.Match(queryCommand, @"DEV=(.+?),");
60:
61: // LST-VAG::DID=7340164,VAGID=0:1::;
62: queryDid = int.TryParse(Ia.Cl.Model.Default.Match(queryCommand, @"DID=(\d+)"), out int i) ? i : 0;
63: queryVagId = int.TryParse(Ia.Cl.Model.Default.Match(queryCommand, @"VAGID=(\d+)"), out i) ? i : 0;
64:
65: var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Huawei.Default.AccessNameToMduDevDictionary;
66:
67: mduDev = (from m in accessNameToMduDevDictionary where m.Value.Did == queryDid select m.Value).SingleOrDefault();
68:
69: if (mduDev != null)
70: {
71: if (mduDev.Dev != null)
72: {
73: //nddOnt = Ia.Ngn.Cl.Model.Business.Default.NddOntFromHuaweiEmsAccessNameFormat(queryDev);
74:
75: //if (nddOnt != null)
76: //{
77: using (var db = new Ia.Ngn.Cl.Model.Ngn())
78: {
79: did = queryDid;
80: vagId = queryVagId;
81:
82: emsOnt = (from eo in db.EmsOnts where eo.Id == mduDev.NddOntId select eo).SingleOrDefault();
83:
84: if (emsOnt != null)
85: {
86: emsVagList = (from v in db.EmsVags where v.EmsOnt.Id == emsOnt.Id && v.VAGID == vagId select v).ToList();
87:
88: existingItemCount = emsVagList.Count;
89:
90: if (response.CompletionCode == "COMPLD")
91: {
92: if (response.QueryDataTable != null)
93: {
94: itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
95:
96: columns = response.QueryDataTable.Columns;
97: readItemCount = response.QueryDataTable.Rows.Count;
98:
99: if (response.QueryDataTable.Rows.Count >= 1)
100: {
101: columnDataRow = response.QueryDataTable.Rows[0];
102:
103: foreach (DataRow dataRow in response.QueryDataTable.Rows)
104: {
105: did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
106: vagId = int.Parse(dataRow[columns.IndexOf("VAGID")].ToString());
107:
108: if (did == queryDid && vagId == queryVagId)
109: {
110: id = Ia.Ngn.Cl.Model.Business.Huawei.Vag.VagId(emsOnt.Id, vagId);
111:
112: emsVag = (from v in emsVagList where v.Id == id select v).SingleOrDefault();
113:
114: newVag = new Ia.Ngn.Cl.Model.Huawei.EmsVag()
115: {
116: Id = id,
117: DID = did,
118: VAGNAME = columns.Contains("VAGNAME") ? dataRow[columns.IndexOf("VAGNAME")].ToString() : string.Empty,
119: VAGID = vagId,
120: SIGIP = columns.Contains("SIGIP") ? dataRow[columns.IndexOf("SIGIP")].ToString() : string.Empty,
121: SIGMASK = columns.Contains("SIGMASK") ? dataRow[columns.IndexOf("SIGMASK")].ToString() : string.Empty,
122: SIGGW = columns.Contains("SIGGW") ? dataRow[columns.IndexOf("SIGGW")].ToString() : string.Empty,
123: SIGPORT = columns.Contains("SIGPORT") ? int.Parse(dataRow[columns.IndexOf("SIGPORT")].ToString()) : 0,
124: SIGVLANID = columns.Contains("SIGVLANID") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("SIGVLANID", dataRow[columns.IndexOf("SIGVLANID")].ToString()) : 0,
125: SIGQOS = columns.Contains("SIGQOS") ? dataRow[columns.IndexOf("SIGQOS")].ToString() : string.Empty,
126: SIGDSCP = columns.Contains("SIGDSCP") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("SIGDSCP", dataRow[columns.IndexOf("SIGDSCP")].ToString()) : 0,
127: SIGIPPRI = columns.Contains("SIGIPPRI") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("SIGIPPRI", dataRow[columns.IndexOf("SIGIPPRI")].ToString()) : 0,
128: SIGTOSPRI = columns.Contains("SIGTOSPRI") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("SIGTOSPRI", dataRow[columns.IndexOf("SIGTOSPRI")].ToString()) : 0,
129: SIGVLANPRI = columns.Contains("SIGVLANPRI") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("SIGVLANPRI", dataRow[columns.IndexOf("SIGVLANPRI")].ToString()) : 0,
130: MEDIAIP = columns.Contains("MEDIAIP") ? dataRow[columns.IndexOf("MEDIAIP")].ToString() : string.Empty,
131: MEDIAMASK = columns.Contains("MEDIAMASK") ? dataRow[columns.IndexOf("MEDIAMASK")].ToString() : string.Empty,
132: MEDIAGW = columns.Contains("MEDIAGW") ? dataRow[columns.IndexOf("MEDIAGW")].ToString() : string.Empty,
133: MEDIAPORT = columns.Contains("MEDIAPORT") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("MEDIAPORT", dataRow[columns.IndexOf("MEDIAPORT")].ToString()) : 0,
134: MEDIAVLANID = columns.Contains("MEDIAVLANID") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("MEDIAVLANID", dataRow[columns.IndexOf("MEDIAVLANID")].ToString()) : 0,
135: MEDIAQOS = columns.Contains("MEDIAQOS") ? dataRow[columns.IndexOf("MEDIAQOS")].ToString() : string.Empty,
136: MEDIADSCP = columns.Contains("MEDIADSCP") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("MEDIADSCP", dataRow[columns.IndexOf("MEDIADSCP")].ToString()) : 0,
137: MEDIAIPPRI = columns.Contains("MEDIAIPPRI") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("MEDIAIPPRI", dataRow[columns.IndexOf("MEDIAIPPRI")].ToString()) : 0,
138: MEDIATOSPRI = columns.Contains("MEDIATOSPRI") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("MEDIATOSPRI", dataRow[columns.IndexOf("MEDIATOSPRI")].ToString()) : 0,
139: MEDIAVLANPRI = columns.Contains("MEDIAVLANPRI") ? Ia.Ngn.Cl.Model.Business.Huawei.Vag.SpecialIntegerParameterHandling("MEDIAVLANPRI", dataRow[columns.IndexOf("MEDIAVLANPRI")].ToString()) : 0,
140: DOMAINNAME = columns.Contains("DOMAINNAME") ? dataRow[columns.IndexOf("DOMAINNAME")].ToString() : string.Empty,
141: ACTIVEMGCDNAME = columns.Contains("ACTIVEMGCDNAME") ? dataRow[columns.IndexOf("ACTIVEMGCDNAME")].ToString() : string.Empty,
142: STANDBYMGCDNAME = columns.Contains("STANDBYMGCDNAME") ? dataRow[columns.IndexOf("STANDBYMGCDNAME")].ToString() : string.Empty,
143: VAGSTAT = columns.Contains("VAGSTAT") ? dataRow[columns.IndexOf("VAGSTAT")].ToString() : string.Empty,
144: PROTOCOLTYPE = columns.Contains("PROTOCOLTYPE") ? dataRow[columns.IndexOf("PROTOCOLTYPE")].ToString() : string.Empty,
145: TIDLAYER = columns.Contains("TIDLAYER") ? dataRow[columns.IndexOf("TIDLAYER")].ToString() : string.Empty,
146: H248PFNAME = columns.Contains("H248PFNAME") ? dataRow[columns.IndexOf("H248PFNAME")].ToString() : string.Empty,
147: SIPPFNAME = columns.Contains("SIPPFNAME") ? dataRow[columns.IndexOf("SIPPFNAME")].ToString() : string.Empty,
148: REGMODE = columns.Contains("REGMODE") ? dataRow[columns.IndexOf("REGMODE")].ToString() : string.Empty,
149:
150: EmsOnt = (from eo in db.EmsOnts where eo.Id == mduDev.NddOntId select eo).SingleOrDefault()
151: };
152:
153: if (emsVag == null)
154: {
155: newVag.Created = newVag.Updated = DateTime.UtcNow.AddHours(3);
156:
157: db.EmsVags.Add(newVag);
158:
159: insertedItemCount++;
160: }
161: else // update
162: {
163: if (emsVag.Update(newVag))
164: {
165: db.EmsVags.Attach(emsVag);
166:
167: db.Entry(emsVag).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
168: //vag.Update(newVag); does not update
169:
170: updatedItemCount++;
171: }
172: }
173:
174: itemIdList.Add(id); // keep at the end
175: }
176: else
177: {
178: result.AddError("LST-VAG (" + response.Ctag + "): did != queryDid and/or vagId != queryVagId for mduDev.AccessName: " + mduDev.AccessName);
179: }
180: }
181:
182: // below: this function will remove values that were not present in the reading
183: if (emsVagList.Count > 0)
184: {
185: foreach (var v in emsVagList)
186: {
187: if (!itemIdList.Contains(v.Id))
188: {
189: emsVag = (from vi in db.EmsVags where vi.Id == v.Id select vi).SingleOrDefault();
190:
191: db.EmsVags.Remove(emsVag);
192:
193: deletedItemCount++;
194: }
195: }
196: }
197: }
198: else
199: {
200: if (emsVagList.Count > 0)
201: {
202: foreach (Ia.Ngn.Cl.Model.Huawei.EmsVag v in emsVagList)
203: {
204: emsVag = (from ev in db.EmsVags where ev.Id == v.Id select ev).SingleOrDefault();
205:
206: db.EmsVags.Remove(emsVag);
207:
208: deletedItemCount++;
209: }
210: }
211: }
212:
213: db.SaveChanges();
214: }
215: else
216: {
217: result.AddWarning("LST-VAG (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
218: }
219: }
220: else
221: {
222: if (response.ResultCode == Ia.Ngn.Cl.Model.Client.Huawei.Ems.ResultCode.DeviceOfflineError)
223: {
224: var emsDevResultCodeIsUpdated = Ia.Ngn.Cl.Model.Data.Huawei.Dev.UpdateResultCode(mduDev.Did, response.ResultCode);
225:
226: result.AddWarning("LST-VAG (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ") EmsOnt.ResultCode updated?: " + emsDevResultCodeIsUpdated.ToString().ToLower());
227: }
228: else
229: {
230: result.AddWarning("LST-VAG (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
231: }
232: }
233: }
234: else
235: {
236: result.AddWarning("LST-VAG (" + response.Ctag + "): EmsOnt is null for mduDev.AccessName: " + mduDev.AccessName);
237: }
238: }
239:
240: if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
241: else isUpdated = false;
242:
243: result.AddSuccess("LST-VAG (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
244: //}
245: //else
246: //{
247: // result.AddError("nddOnt is null");
248: //}
249: }
250: else
251: {
252: result.AddError("LST-VAG (" + response.Ctag + "): mduDev.Dev is null for did: " + queryDid);
253: }
254: }
255: else
256: {
257: result.AddError("LST-VAG (" + response.Ctag + "): mduDev is null for did: " + queryDid);
258: }
259:
260: return isUpdated;
261: }
262:
263: ////////////////////////////////////////////////////////////////////////////
264:
265: /// <summary>
266: ///
267: /// </summary>
268: public static List<Ia.Ngn.Cl.Model.Huawei.EmsVag> List()
269: {
270: List<Ia.Ngn.Cl.Model.Huawei.EmsVag> list;
271:
272: using (var db = new Ia.Ngn.Cl.Model.Ngn())
273: {
274: list = (from v in db.EmsVags select v).ToList();
275: }
276:
277: return list;
278: }
279:
280: ////////////////////////////////////////////////////////////////////////////
281:
282: /// <summary>
283: ///
284: /// </summary>
285: public static List<Ia.Ngn.Cl.Model.Huawei.EmsVag> List(string ontId)
286: {
287: List<Ia.Ngn.Cl.Model.Huawei.EmsVag> list;
288:
289: using (var db = new Ia.Ngn.Cl.Model.Ngn())
290: {
291: list = (from v in db.EmsVags where v.EmsOnt.Id == ontId select v).ToList();
292: }
293:
294: return list;
295: }
296:
297: ////////////////////////////////////////////////////////////////////////////
298:
299: /// <summary>
300: ///
301: /// </summary>
302: public static List<Ia.Ngn.Cl.Model.Huawei.EmsVag> ListByDid(int did)
303: {
304: List<Ia.Ngn.Cl.Model.Huawei.EmsVag> list;
305:
306: using (var db = new Ia.Ngn.Cl.Model.Ngn())
307: {
308: list = (from v in db.EmsVags where v.DID == did select v).ToList();
309: }
310:
311: return list;
312: }
313:
314: ////////////////////////////////////////////////////////////////////////////
315: ////////////////////////////////////////////////////////////////////////////
316:
317: /// <summary>
318: ///
319: /// </summary>
320: public static string ToSimpleTextString(Ia.Ngn.Cl.Model.Huawei.EmsVag vag)
321: {
322: StringBuilder sb;
323:
324: sb = new StringBuilder();
325:
326: sb.AppendLine("DID: " + vag.DID);
327: sb.AppendLine("VAGSTAT: " + vag.VAGSTAT);
328: sb.AppendLine("PROTOCOLTYPE: " + vag.PROTOCOLTYPE);
329: //sb.AppendLine("Route: " + Ia.Ngn.Cl.Model.Business.Huawei.Vag.RnidxRouteName[vag.RNIDX2]);
330:
331: return sb.ToString();
332: }
333:
334: ////////////////////////////////////////////////////////////////////////////
335: ////////////////////////////////////////////////////////////////////////////
336: }
337:
338: ////////////////////////////////////////////////////////////////////////////
339: ////////////////////////////////////////////////////////////////////////////
340: }