)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Axe (Ia.Ftn.Cl.Models.Business.Ericsson)

Public general use code classes and xml files that we've compiled and used over the years:

Ericsson AXE support class of Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.IO;
    4: using System.Linq;
    5: using System.Text.RegularExpressions;
    6:  
    7: namespace Ia.Ftn.Cl.Models.Business.Ericsson
    8: {
    9:     ////////////////////////////////////////////////////////////////////////////
   10:  
   11:     /// <summary publish="true">
   12:     /// Ericsson AXE support class of Fixed Telecommunications Network (FTN) business model.
   13:     /// </summary>
   14:     /// 
   15:     /// <remarks> 
   16:     /// Copyright © 2018-2025 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 Axe
   29:     {
   30:         private static List<string> properlySelectedAxeServiceList = new List<string>();
   31:         private static Queue<ProvisioningWorkflow> synchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>();
   32:         private static Queue<ProvisioningWorkflow> serviceSuspentionSynchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>();
   33:  
   34:         /// <summary/>
   35:         public enum Opcode {
   36:             /// <summary/>
   37:             Suscp,
   38:  
   39:             /// <summary/>
   40:             Sulie,
   41:  
   42:             /// <summary/>
   43:             SusccXxx,
   44:  
   45:             /// <summary/>
   46:             SusccTboTbi,
   47:  
   48:             /// <summary/>
   49:             SusccIcs,
   50:  
   51:             /// <summary/>
   52:             ConfirmCommandSemicolon,
   53:  
   54:             /// <summary/>
   55:             KeepAliveCommandSemicolon
   56:         }
   57:  
   58:         /// <summary/>
   59:         public class ProvisioningWorkflow
   60:         {
   61:             /// <summary/>
   62:             public Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn Pstn { get; set; }
   63:  
   64:             /// <summary/>
   65:             public string ReadCommand { get; set; }
   66:  
   67:             /// <summary/>
   68:             public string UpdateCommand { get; set; }
   69:  
   70:             /// <summary/>
   71:             public string DeleteCommand { get; set; }
   72:  
   73:             /// <summary/>
   74:             public string ServiceSuspensionCommand { get; set; }
   75:  
   76:             /// <summary/>
   77:             public string ExecuteSemicolon { get; set; }
   78:  
   79:             /// <summary/>
   80:             public ProvisioningWorkflow()
   81:             {
   82:  
   83:             }
   84:         }
   85:  
   86:         /// <summary/>
   87:         public static string Host(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn)
   88:         {
   89:             string host;
   90:  
   91:             switch (pstn.Name)
   92:             {
   93:                 case "MSF": host = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeMsfEricssonServerHost"); break;
   94:                 case "SLMA": host = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeSlmaEricssonServerHost"); break;
   95:                 default: host = string.Empty; break;
   96:             }
   97:  
   98:             return host;
   99:         }
  100:  
  101:         /// <summary/>
  102:         public static int Port { get { return 23; } } // 23 telnet port
  103:  
  104:         /// <summary/>
  105:         public static string UserName(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn)
  106:         {
  107:             string userName;
  108:  
  109:             switch (pstn.Name)
  110:             {
  111:                 case "MSF": userName = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeMsfEricssonServerUserName"); break;
  112:                 case "SLMA": userName = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeSlmaEricssonServerUserName"); break;
  113:                 default: userName = string.Empty; break;
  114:             }
  115:  
  116:             return userName;
  117:         }
  118:  
  119:         /// <summary/>
  120:         public static string Password(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn)
  121:         {
  122:             string password;
  123:  
  124:             switch (pstn.Name)
  125:             {
  126:                 case "MSF": password = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeMsfEricssonServerPassword"); break;
  127:                 case "SLMA": password = Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeSlmaEricssonServerPassword"); break;
  128:                 default: password = string.Empty; break;
  129:             }
  130:  
  131:             return password;
  132:         }
  133:  
  134:         /// <summary/>
  135:         public static string LogoutCommand { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AxeEricssonServerLogoutCommand"); } }
  136:  
  137:         /// <summary/>
  138:         public static List<string> ServiceSymbolList { get; } = new List<string>();
  139:  
  140:         ////////////////////////////////////////////////////////////////////////////
  141:  
  142:         /// <summary>
  143:         /// Response of Ericsson AXE
  144:         /// </summary>
  145:         public class Response
  146:         {
  147:             /// <summary/>
  148:             public int Service { get; set; }
  149:  
  150:             /// <summary/>
  151:             public bool IsSuccess { get { return ReturnCode == Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful; } }
  152:  
  153:             /// <summary/>
  154:             public bool IsProvisioned { get; set; }
  155:  
  156:             /// <summary/>
  157:             public Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode ReturnCode { get; set; }
  158:  
  159:             /// <summary/>
  160:             //public string Ctag { get; set; } // no need because the commad string is included in response body
  161:  
  162:             /// <summary/>
  163:             public DateTime DateTime { get; set; }
  164:  
  165:             /// <summary/>
  166:             public string CommandString { get; set; }
  167:  
  168:             /// <summary/>
  169:             public int Snb { get; set; }
  170:  
  171:             /// <summary/>
  172:             public string Dev { get; set; }
  173:  
  174:             /// <summary/>
  175:             public string Dety { get; set; }
  176:  
  177:             /// <summary/>
  178:             public string Sut { get; set; }
  179:  
  180:             /// <summary/>
  181:             public string Scl { get; set; }
  182:  
  183:             /// <summary/>
  184:             public string Mis { get; set; }
  185:  
  186:             /// <summary/>
  187:             public string Cos { get; set; }
  188:  
  189:             /// <summary/>
  190:             public string Content { get; set; }
  191:  
  192:             /// <summary/>
  193:             //public Dictionary<string, string> QueryDictionary { get; set; }
  194:  
  195:             /// <summary/>
  196:             public Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService ServiceSupplementaryService { get; set; }
  197:  
  198:             ////////////////////////////////////////////////////////////////////////////
  199:  
  200:             /// <summary>
  201:             ///
  202:             /// </summary>
  203:             public Response(string content)
  204:             {
  205:                 string service;
  206:                 Match match;
  207:                 Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
  208:                 Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode returnCode;
  209:  
  210:                 if (content.Contains("GENERAL AVAILABILITY FOR SUPPLEMENTARY SERVICES SUBSCRIBER CATEGORIES")) // result of SULIE
  211:                 {
  212:                     /*
  213:         SUBSCRIBER DATA
  214:         SNB        DEV            DETY    SUT SCL         MIS             COS
  215:         25381611   LIMA-18146
  216:         GENERAL AVAILABILITY FOR SUPPLEMENTARY SERVICES SUBSCRIBER CATEGORIES
  217: 
  218:         SCL
  219:         ALS-1
  220: 
  221:         SUBSCRIBER METER DATA
  222:         SNB        UCMS    CMV1                                MISC
  223:         25381611   1       0
  224:                            SUB1     SUB2     SUB3     SUB4
  225:                            0        0        0        0
  226:         END
  227:                      */
  228:  
  229:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful;
  230:                 }
  231:                 else if (content.StartsWith("SUBSCRIBER DATA") && content.EndsWith("END")) // order important
  232:                 {
  233:                     /*
  234:         SUBSCRIBER DATA
  235:         SNB        DEV            DETY    SUT SCL         MIS             COS
  236:         25382234   LIMA-634                   CCB-1
  237: 
  238:         END
  239: 
  240: 
  241:         SUBSCRIBER DATA
  242:         SNB        DEV            DETY    SUT SCL         MIS             COS
  243:         25387526                          NC
  244:         END
  245: 
  246: 
  247:         SUBSCRIBER DATA
  248:         SNB        DEV            DETY    SUT SCL         MIS             COS
  249:         25381111                          PB  IPT-2
  250:                                               ANT-2
  251:                                               CBA-2
  252: 
  253:         END
  254:                      */
  255:                     match = Regex.Match(content, @"\r\n(\d{8})\s+");
  256:  
  257:                     if (match.Success)
  258:                     {
  259:                         service = match.Groups[1].Value;
  260:  
  261:                         this.CommandString = @"SUSCP:SNB=" + service + ";";
  262:  
  263:                         this.Service = int.Parse(service);
  264:  
  265:                         if (content.Contains("            NC"))
  266:                         {
  267:                             this.IsProvisioned = false;
  268:                         }
  269:                         else
  270:                         {
  271:                             serviceSupplementaryService = Ia.Ftn.Cl.Models.Business.Ericsson.Axe.ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(content);
  272:  
  273:                             this.IsProvisioned = true;
  274:                             this.ServiceSupplementaryService = serviceSupplementaryService;
  275:                         }
  276:  
  277:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful;
  278:                     }
  279:                     else
  280:                     {
  281:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Failed;
  282:                     }
  283:                 }
  284:                 else if (content.Contains("EXECUTED"))
  285:                 {
  286:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Successful;
  287:                 }
  288:                 else if (content.Contains("NOT ACCEPTED") && content.Contains("UNREASONABLE VALUE"))
  289:                 {
  290:                     /*
  291:     <SUSCP:SNB=25612222;
  292:     NOT ACCEPTED
  293:     UNREASONABLE VALUE
  294:     (0)SNB=25612222
  295:                      */
  296:                     match = Regex.Match(content, @"SNB=(\d{8})");
  297:  
  298:                     if (match.Success)
  299:                     {
  300:                         service = match.Groups[1].Value;
  301:  
  302:                         this.CommandString = @"SUSCP:SNB=" + service + ";";
  303:  
  304:                         this.Service = int.Parse(service);
  305:                         this.IsProvisioned = false;
  306:  
  307:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.NotAcceptedUnreasonableValue;
  308:                     }
  309:                     else
  310:                     {
  311:                         returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.Failed;
  312:                     }
  313:                 }
  314:                 else if (content.Contains("NOT ACCEPTED") && content.Contains("SUBSCRIBER NOT CONNECTED"))
  315:                 {
  316:                     /*
  317: <SULIE:SNB=25384651;
  318:  SULIE:SNB=25384651;
  319: <;
  320: NOT ACCEPTED
  321: FAULT CODE 41
  322: SUBSCRIBER NOT CONNECTED
  323: (0)SNB=25384651
  324:                      */
  325:  
  326:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.SubscriberNotConnected;
  327:                 }
  328:                 else if (content.Contains("NOT ACCEPTED") && content.Contains("COMMAND UNKNOWN"))
  329:                 {
  330:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.NotAcceptedCommandUnknown;
  331:                 }
  332:                 else if (content.Contains("TIME OUT"))
  333:                 {
  334:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.TimeOut;
  335:                 }
  336:                 else
  337:                 {
  338:                     returnCode = Ia.Ftn.Cl.Models.Client.Ericsson.Axe.ResultCode.UnknownError;
  339:                 }
  340:  
  341:                 this.ReturnCode = returnCode;
  342:                 this.Content = content;
  343:                 this.ParseSuscp(content, out int snb, out string dev, out string dety, out string sut, out string scl, out string mis, out string cos);
  344:                 this.Snb = snb;
  345:                 this.Dev = dev;
  346:                 this.Dety = dety;
  347:                 this.Sut = sut;
  348:                 this.Scl = scl;
  349:                 this.Mis = mis;
  350:                 this.Cos = cos;
  351:             }
  352:  
  353:             ////////////////////////////////////////////////////////////////////////////
  354:  
  355:             /// <summary>
  356:             ///
  357:             /// </summary>
  358:             private void ParseSuscp(string suscpOutputContent, out int snb, out string dev, out string dety, out string sut, out string scl, out string mis, out string cos)
  359:             {
  360:                 using (StringReader stringReader = new StringReader(suscpOutputContent))
  361:                 {
  362:                     bool startReadingSnbInformationFlag;
  363:                     int snbIndex, devIndex, detyIndex, sutIndex, sclIndex, misIndex, cosIndex;
  364:                     string s, line;
  365:                     List<string> snbList, devList, detyList, sutList, sclList, misList, cosList;
  366:  
  367:                     startReadingSnbInformationFlag = false;
  368:                     snbIndex = devIndex = detyIndex = sutIndex = sclIndex = misIndex = cosIndex = -1;
  369:                     snb = -1;
  370:                     dev = dety = sut = scl = mis = cos = string.Empty;
  371:  
  372:                     snbList = new List<string>();
  373:                     devList = new List<string>();
  374:                     detyList = new List<string>();
  375:                     sutList = new List<string>();
  376:                     sclList = new List<string>();
  377:                     misList = new List<string>();
  378:                     cosList = new List<string>();
  379:  
  380:                     while ((line = stringReader.ReadLine()) != null)
  381:                     {
  382:                         if (!string.IsNullOrWhiteSpace(line))
  383:                         {
  384:                             if (line.StartsWith("SUBSCRIBER DATA") || line.StartsWith("END") || line.StartsWith("GENERAL AVAILABILITY"))
  385:                             {
  386:                                 startReadingSnbInformationFlag = false;
  387:                             }
  388:                             else if (line.StartsWith("SNB") && line.Contains("DEV"))
  389:                             {
  390:                                 snbIndex = 0; // line.IndexOf("SNB");
  391:                                 devIndex = line.IndexOf("DEV");
  392:                                 detyIndex = line.IndexOf("DETY");
  393:                                 sutIndex = line.IndexOf("SUT");
  394:                                 sclIndex = line.IndexOf("SCL");
  395:                                 misIndex = line.IndexOf("MIS");
  396:                                 cosIndex = line.IndexOf("COS");
  397:  
  398:                                 startReadingSnbInformationFlag = true;
  399:                             }
  400:                             else if (startReadingSnbInformationFlag)
  401:                             {
  402:                                 line = line.PadRight(cosIndex + 3, ' '); // 3 for the string COS
  403:  
  404:                                 s = line.Substring(snbIndex, devIndex - snbIndex).Trim();
  405:                                 if (!string.IsNullOrEmpty(s)) snbList.Add(s);
  406:  
  407:                                 s = line.Substring(devIndex, detyIndex - devIndex).Trim();
  408:                                 if (!string.IsNullOrEmpty(s)) devList.Add(s);
  409:  
  410:                                 s = line.Substring(detyIndex, sutIndex - detyIndex).Trim();
  411:                                 if (!string.IsNullOrEmpty(s)) detyList.Add(s);
  412:  
  413:                                 s = line.Substring(sutIndex, sclIndex - sutIndex).Trim();
  414:                                 if (!string.IsNullOrEmpty(s)) sutList.Add(s);
  415:  
  416:                                 s = line.Substring(sclIndex, misIndex - sclIndex).Trim();
  417:                                 if (!string.IsNullOrEmpty(s)) sclList.Add(s);
  418:  
  419:                                 s = line.Substring(misIndex, cosIndex - misIndex).Trim();
  420:                                 if (!string.IsNullOrEmpty(s)) misList.Add(s);
  421:  
  422:                                 s = line.Substring(cosIndex, line.Length - cosIndex).Trim();
  423:                                 if (!string.IsNullOrEmpty(s)) cosList.Add(s);
  424:  
  425:                                 snb = int.Parse(string.Join(",", snbList));
  426:                                 dev = string.Join(",", devList);
  427:                                 dety = string.Join(",", detyList);
  428:                                 sut = string.Join(",", sutList);
  429:                                 scl = string.Join(",", sclList);
  430:                                 mis = string.Join(",", misList);
  431:                                 cos = string.Join(",", cosList);
  432:                             }
  433:                             else
  434:                             {
  435:  
  436:                             }
  437:                         }
  438:                         else
  439:                         {
  440:  
  441:                         }
  442:                     }
  443:                 }
  444:             }
  445:  
  446:             ////////////////////////////////////////////////////////////////////////////
  447:             ////////////////////////////////////////////////////////////////////////////
  448:         }
  449:  
  450:         ////////////////////////////////////////////////////////////////////////////
  451:  
  452:         /// <summary>
  453:         ///
  454:         /// </summary>
  455:         public Axe() { }
  456:  
  457:         ////////////////////////////////////////////////////////////////////////////
  458:  
  459:         /// <summary>
  460:         ///
  461:         /// </summary>
  462:         public static string ProperlySelectedSingleServiceQueueServiceNumber(ref int referenceIndex, List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn> pstnList, out int itemIndex, out int listCount)
  463:         {
  464:             string service;
  465:  
  466:             if (properlySelectedAxeServiceList.JustStartedOrRolledOver())
  467:             {
  468:                 properlySelectedAxeServiceList = AllPossibleServiceNumbersPreferablyNotInAxeSubscriberWithinPstn(pstnList).ToList();
  469:  
  470:                 // Sort the strings by their reversed characters
  471:                 // https://www.codingame.com/playgrounds/213/using-c-linq---a-practical-overview/reverse-and-orderby
  472:  
  473:                 properlySelectedAxeServiceList = properlySelectedAxeServiceList.OrderBy(str => new string(str.Reverse().ToArray())).ToList();
  474:             }
  475:  
  476:             service = properlySelectedAxeServiceList.Next(ref referenceIndex, out itemIndex, out listCount);
  477:  
  478:             return service;
  479:         }
  480:  
  481:         ////////////////////////////////////////////////////////////////////////////
  482:  
  483:         /// <summary>
  484:         ///
  485:         /// </summary>
  486:         public static List<string> AllPossibleServiceNumbersPreferablyNotInAxeSubscriberWithinPstn(List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn> pstnList)
  487:         {
  488:             var allPossibleServiceNumbersWithinPstn = new List<int>();
  489:  
  490:             foreach (var pstn in pstnList)
  491:             {
  492:                 allPossibleServiceNumbersWithinPstn.AddRange(Ia.Ftn.Cl.Models.Data.Service.AllPossibleServiceNumbersWithinPstn(pstn.Name));
  493:             }
  494:  
  495:             var snbList = Ia.Ftn.Cl.Models.Data.Ericsson.Subscriber.SnbList();
  496:  
  497:             var list = allPossibleServiceNumbersWithinPstn.Except(snbList).ToList();
  498:  
  499:             // if list is empty then will use the all list
  500:             if (list.Count == 0) list = allPossibleServiceNumbersWithinPstn;
  501:  
  502:             var servicelist = list.ConvertAll<string>(u => u.ToString());
  503:  
  504:             var hashSet = new HashSet<string>(servicelist);
  505:  
  506:             return hashSet.ToList();
  507:         }
  508:  
  509:         ////////////////////////////////////////////////////////////////////////////
  510:  
  511:         /// <summary>
  512:         ///
  513:         /// </summary>
  514:         public static ProvisioningWorkflow SynchronizeAxeServiceIcsxRouteToMatchImsServiceRouterVendorProvisioningWorkflowItem(Ia.Ftn.Cl.Models.Business.Default.Procedure procedure)
  515:         {
  516:             ProvisioningWorkflow provisioningWorkflow;
  517:             List<ProvisioningWorkflow> list;
  518:  
  519:             provisioningWorkflow = null;
  520:  
  521:             if (synchronizationProvisioningWorkflowQueue.Count == 0 && procedure == Ia.Ftn.Cl.Models.Business.Default.Procedure.InitializeOrIterate)
  522:             {
  523:                 list = Ia.Ftn.Cl.Models.Business.Ericsson.Axe.DeleteAndUpdateAndReadCommandToSynchronizeAxeServiceIcsxRouteToMatchImsServiceRouterVendorProvisioningWorkflowList();
  524:  
  525:                 synchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>(list); // don't shuffle because a modify command is followed by a read .Shuffle());
  526:             }
  527:  
  528:             if (synchronizationProvisioningWorkflowQueue.Count > 0) provisioningWorkflow = synchronizationProvisioningWorkflowQueue.Dequeue();
  529:  
  530:             return provisioningWorkflow;
  531:         }
  532:  
  533:         ////////////////////////////////////////////////////////////////////////////
  534:  
  535:         /// <summary>
  536:         ///
  537:         /// </summary>
  538:         public static List<ProvisioningWorkflow> DeleteAndUpdateAndReadCommandToSynchronizeAxeServiceIcsxRouteToMatchImsServiceRouterVendorProvisioningWorkflowList()
  539:         {
  540:             int icsxRoute;
  541:             string service;
  542:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor vendor;
  543:             Ia.Ftn.Cl.Models.Business.Default.SwitchRoute pstnSwitchRoute, switchRouteToMigratedRouterVendor;
  544:             ProvisioningWorkflow provisioningWorkflow;
  545:             List<ProvisioningWorkflow> provisioningWorkflowList;
  546:  
  547:             provisioningWorkflowList = new List<ProvisioningWorkflow>();
  548:  
  549:             var imsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary = Ia.Ftn.Cl.Models.Data.Service.ImsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary;
  550:  
  551:             var axeServiceToSwitchRouteDictionary = Ia.Ftn.Cl.Models.Data.Ericsson.Subscriber.PstnServiceToSwitchRouteDictionary();
  552:  
  553:             // will exclude exempt numbers
  554:             var serviceExemptionList = Ia.Ftn.Cl.Models.Data.Provision.ServiceOfServiceExemptFromProvisionProcessingList();
  555:  
  556:             foreach (KeyValuePair<string, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor> kvp in imsServiceToOntRouterVendorInAllowedToBeMigratedOltDictionary)
  557:             {
  558:                 service = kvp.Key;
  559:                 vendor = kvp.Value;
  560:  
  561:                 if (axeServiceToSwitchRouteDictionary.ContainsKey(service))
  562:                 {
  563:                     pstnSwitchRoute = axeServiceToSwitchRouteDictionary[service];
  564:  
  565:                     if (vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia) switchRouteToMigratedRouterVendor = Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.NokiaIms;
  566:                     else if (vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Huawei) switchRouteToMigratedRouterVendor = Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.HuaweiIms;
  567:                     else switchRouteToMigratedRouterVendor = Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.Unknown;
  568:  
  569:                     if (pstnSwitchRoute != switchRouteToMigratedRouterVendor && switchRouteToMigratedRouterVendor != Ia.Ftn.Cl.Models.Business.Default.SwitchRoute.Unknown)
  570:                     {
  571:                         if (!serviceExemptionList.Contains(service))
  572:                         {
  573:                             provisioningWorkflow = new ProvisioningWorkflow();
  574:  
  575:                             icsxRoute = Ia.Ftn.Cl.Models.Business.Ericsson.Subscriber.SwitchRouteToIcsxRoute(switchRouteToMigratedRouterVendor);
  576:  
  577:                             provisioningWorkflow.Pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  578:  
  579:                             provisioningWorkflow.ExecuteSemicolon = ConfirmCommandSemicolon();
  580:  
  581:                             provisioningWorkflow.DeleteCommand = DeleteServiceCommand(service);
  582:                             provisioningWorkflow.UpdateCommand = UpdateServiceRouteCommand(service, icsxRoute);
  583:                             provisioningWorkflow.ReadCommand = ReadServiceCommand(service);
  584:  
  585:                             provisioningWorkflowList.Add(provisioningWorkflow);
  586:                         }
  587:                     }
  588:                 }
  589:             }
  590:  
  591:             return provisioningWorkflowList;
  592:         }
  593:  
  594:         ////////////////////////////////////////////////////////////////////////////
  595:  
  596:         /// <summary>
  597:         ///
  598:         /// </summary>
  599:         public static ProvisioningWorkflow SynchronizeBetweenServiceRequestAdministrativeIssueAndEricssonAxePstnServiceProvisioningWorkflowItem()
  600:         {
  601:             ProvisioningWorkflow provisioningWorkflow;
  602:             List<ProvisioningWorkflow> list;
  603:  
  604:             provisioningWorkflow = null;
  605:  
  606:             if (serviceSuspentionSynchronizationProvisioningWorkflowQueue.Count == 0)
  607:             {
  608:                 list = Ia.Ftn.Cl.Models.Business.Ericsson.Axe.ServiceSuspentionAndReadCommandSynchronizeBetweenServiceRequestAdministrativeIssueAndEricssonAxePstnServiceProvisioningWorkflowList();
  609:  
  610:                 serviceSuspentionSynchronizationProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow>(list); // don't shuffle because a modify command is followed by a read .Shuffle());
  611:             }
  612:  
  613:             if (serviceSuspentionSynchronizationProvisioningWorkflowQueue.Count > 0) provisioningWorkflow = serviceSuspentionSynchronizationProvisioningWorkflowQueue.Dequeue();
  614:  
  615:             return provisioningWorkflow;
  616:         }
  617:  
  618:         ////////////////////////////////////////////////////////////////////////////
  619:  
  620:         /// <summary>
  621:         ///
  622:         /// </summary>
  623:         public static List<ProvisioningWorkflow> ServiceSuspentionAndReadCommandSynchronizeBetweenServiceRequestAdministrativeIssueAndEricssonAxePstnServiceProvisioningWorkflowList()
  624:         {
  625:             bool state;
  626:             ProvisioningWorkflow provisioningWorkflow;
  627:             List<ProvisioningWorkflow> provisioningWorkflowList;
  628:  
  629:             provisioningWorkflowList = new List<ProvisioningWorkflow>();
  630:  
  631:             Ia.Ftn.Cl.Models.Data.Provision.EricssonAxePstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out _, out _);
  632:  
  633:             // will exclude exempt numbers
  634:             var serviceExemptionList = Ia.Ftn.Cl.Models.Data.Provision.ServiceOfServiceExemptFromProvisionProcessingList();
  635:  
  636:             state = true;
  637:  
  638:             foreach (var service in serviceToSuspendList)
  639:             {
  640:                 if (!serviceExemptionList.Contains(service))
  641:                 {
  642:                     provisioningWorkflow = new ProvisioningWorkflow();
  643:  
  644:                     provisioningWorkflow.Pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  645:  
  646:                     provisioningWorkflow.ExecuteSemicolon = ConfirmCommandSemicolon();
  647:  
  648:                     provisioningWorkflow.ServiceSuspensionCommand = ServiceSuspensionCommand(service, state);
  649:  
  650:                     provisioningWorkflow.ReadCommand = ReadServiceCommand(service);
  651:  
  652:                     provisioningWorkflowList.Add(provisioningWorkflow);
  653:                 }
  654:             }
  655:  
  656:  
  657:             state = false;
  658:  
  659:             foreach (var service in serviceToReleaseList)
  660:             {
  661:                 if (!serviceExemptionList.Contains(service))
  662:                 {
  663:                     provisioningWorkflow = new ProvisioningWorkflow();
  664:  
  665:                     provisioningWorkflow.Pstn = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnFromService(service);
  666:  
  667:                     provisioningWorkflow.ExecuteSemicolon = ConfirmCommandSemicolon();
  668:  
  669:                     provisioningWorkflow.ServiceSuspensionCommand = ServiceSuspensionCommand(service, state);
  670:  
  671:                     provisioningWorkflow.ReadCommand = ReadServiceCommand(service);
  672:  
  673:                     provisioningWorkflowList.Add(provisioningWorkflow);
  674:                 }
  675:             }
  676:  
  677:             return provisioningWorkflowList;
  678:         }
  679:  
  680:         ////////////////////////////////////////////////////////////////////////////
  681:  
  682:         /// <summary>
  683:         /// 
  684:         /// </summary>
  685:         public static Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService ServiceSupplementaryServiceStateFromServiceNetManagerOutputString(string content)
  686:         {
  687:             string service;
  688:             Match match;
  689:             Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService serviceSupplementaryService;
  690:  
  691:             serviceSupplementaryService = new Ia.Ftn.Cl.Models.Business.Service.ServiceSupplementaryService();
  692:  
  693:             /*
  694:     SUBSCRIBER DATA
  695:     SNB        DEV            DETY    SUT SCL         MIS             COS
  696:     25382234   LIMA-634                   CCB-1
  697: 
  698:     END
  699: 
  700:     SUBSCRIBER DATA
  701:     SNB        DEV            DETY    SUT SCL         MIS             COS
  702:     25381111                          PB  IPT-2
  703:                                       ANT-2
  704:                                       CBA-2
  705: 
  706:     END
  707:              */
  708:  
  709:  
  710:             /*
  711:     2019-12-29 07:58:44: ServiceSymbolList: Service symbol list: CBA-2, IPT-2, ANT-2, FLA-2, GUG-5, CAW-1, ENQ-2, CCB-1, CDP-1, CBA-1, CFUF-1, IPT-3, APT-2, CFUV-1,
  712:     CBP-1, CCB-2, FLA-1, ENQ-1, CBB-1, CBA-9, TCL-9, CBA-3, GUG-2, TBO-2, TBI-1, ICS-3, FDC-1, LNR-1, CBA-15, TBO-1, CBA-7, BIC-1, FDC-2, CBA-10, MCIDSC-1, ADI-2,
  713:     LIBAMA-14, OCG-1, TLI-14, BAT-1, GUG-0, GUG-3, BOC-1
  714:              */
  715:  
  716:             /*
  717:     Unknown: IPT-2, CDP-1, APT-2, ENQ-1, CBP-1, CBB-1, CBA-7, CBA-15, CBA-1, CBA-9, TCL-9, CBA-10, FDC-1, CCB-2, FLA-1, CBA-3, OCG-1, TLI-14, BAT-1, FDC-2, LIBAMA-14, MCIDSC-1, LNR-1, GUG-2, GUG-0, GUG-3
  718: 
  719:     IPT-3,ANT-2    CallerId
  720:     CFUF-1,CFUV-1    CallForwarding
  721:     CAW-1,FLA-2    CallWaiting
  722:     ENQ-2,FLA-2    ConferenceCall
  723:     GUG-5    WakeupCall
  724:     ADI-2    AbbriviatedCalling
  725:     CCB-1    InternationalCallingUserControlled
  726:     CBA-2    InternationalCalling
  727:     TBO-1,TBI-1    ServiceSuspension
  728:     TBO-2,TBI-1    ServiceSuspension due to ServiceAdministrativelySuspendedByBillingDepartment
  729:     BIC-1,BOC-1    ServiceSuspension due to ServiceAdministrativelySuspendedForOtherReasons
  730:     BIC-1    ServiceSuspension
  731:     BOC-1    ServiceSuspension
  732: 
  733:              */
  734:             match = Regex.Match(content, @"\r\n(\d{8})\s+");
  735:  
  736:             if (match.Success)
  737:             {
  738:                 service = match.Groups[1].Value;
  739:  
  740:                 if (int.TryParse(service, out int snb))
  741:                 {
  742:                     serviceSupplementaryService.Service = snb;
  743:  
  744:                     if (content.Contains("IPT-3") && content.Contains("ANT-2") /*&& outputContent.Contains("APT-2")*/) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallerId);
  745:                     if (/*outputContent.Contains("CDP-1") &&*/ content.Contains("CFUF-1") && content.Contains("CFUV-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallForwarding);
  746:                     //if (outputContent.Contains("OCG-1") && outputContent.Contains("TLI-14")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.MagneticCart);
  747:                     //if (outputContent.Contains("FLA-2") && outputContent.Contains("MCIDSC-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.CallMonitoring);
  748:                     if (content.Contains("CAW-1") && content.Contains("FLA-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting);
  749:                     if (content.Contains("ENQ-2") && content.Contains("FLA-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ConferenceCall);
  750:                     if (content.Contains("GUG-5")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.WakeupCall);
  751:                     if (content.Contains("ADI-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.AbbriviatedCalling);
  752:                     if (content.Contains("CCB-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCallingUserControlled);
  753:                     if (content.Contains("CBA-2")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCalling);
  754:  
  755:                     //if (outputContent.Contains("FDC-1") && outputContent.Contains("LNR-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.OneWayHotoutputContent);
  756:                     //if (outputContent.Contains("FDC-2") && outputContent.Contains("LNR-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.TwoWayHotoutputContent);
  757:  
  758:                     //if (outputContent.Contains("SSI-1")) serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.???);
  759:  
  760:                     if (content.Contains("TBO-1") && content.Contains("TBI-1"))
  761:                     {
  762:                         //serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Model.Business.Service.SupplementaryService.ManualBillingDisconnect);
  763:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  764:                     }
  765:  
  766:                     if (content.Contains("TBO-2") && content.Contains("TBI-1"))
  767:                     {
  768:                         serviceSupplementaryService.ServiceAdministrativelySuspendedByBillingDepartment = true;
  769:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  770:                     }
  771:  
  772:                     if (content.Contains("BIC-1") && content.Contains("BOC-1"))
  773:                     {
  774:                         serviceSupplementaryService.ServiceAdministrativelySuspendedForOtherReasons = true;
  775:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  776:                     }
  777:                     else if (content.Contains("BIC-1"))
  778:                     {
  779:                         //serviceSupplementaryService.IncomingDisconnect = true;
  780:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  781:                     }
  782:                     else if (content.Contains("BOC-1"))
  783:                     {
  784:                         //serviceSupplementaryService.OutgoingDisconnect = true;
  785:                         serviceSupplementaryService.SupplementaryServiceList.Add(Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension);
  786:                     }
  787:  
  788:                     if (content.Contains("PB")) serviceSupplementaryService.IsPbx = true;
  789:  
  790:                     Ia.Ftn.Cl.Models.Business.Ericsson.Axe.ExtractAndUpdateUniqueAxeServiceSymbolListFromOutputContent(content);
  791:                 }
  792:                 else
  793:                 {
  794:                 }
  795:             }
  796:             else
  797:             {
  798:             }
  799:  
  800:             return serviceSupplementaryService;
  801:         }
  802:  
  803:         ////////////////////////////////////////////////////////////////////////////
  804:         ////////////////////////////////////////////////////////////////////////////
  805:  
  806:         /// <summary>
  807:         ///
  808:         /// </summary>
  809:         public static string ReadServiceCommand(string service)
  810:         {
  811:             return AxeCommand(Opcode.Suscp, int.Parse(service));
  812:         }
  813:  
  814:         ////////////////////////////////////////////////////////////////////////////
  815:  
  816:         /// <summary>
  817:         ///
  818:         /// </summary>
  819:         public static string DeleteServiceCommand(string service)
  820:         {
  821:             return AxeCommand(Opcode.Sulie, int.Parse(service));
  822:         }
  823:  
  824:         ////////////////////////////////////////////////////////////////////////////
  825:  
  826:         /// <summary>
  827:         ///
  828:         /// </summary>
  829:         public static string UpdateSupplementaryServiceCommand(string service, Ia.Ftn.Cl.Models.Business.Service.SupplementaryService supplementaryService, bool supplementaryServiceState)
  830:         {
  831:             int snb;
  832:             string command;
  833:  
  834:             snb = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Number(service);
  835:  
  836:             switch (supplementaryService)
  837:             {
  838:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.AbbriviatedCalling):
  839:                     {
  840:                         command = AxeCommand(Opcode.SusccXxx, snb);
  841:                         break;
  842:                     }
  843:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallerId):
  844:                     {
  845:                         command = AxeCommand(Opcode.SusccXxx, snb);
  846:                         break;
  847:                     }
  848:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallForwarding):
  849:                     {
  850:                         command = AxeCommand(Opcode.SusccXxx, snb);
  851:                         break;
  852:                     }
  853:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.CallWaiting):
  854:                     {
  855:                         command = AxeCommand(Opcode.SusccXxx, snb);
  856:                         break;
  857:                     }
  858:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ConferenceCall):
  859:                     {
  860:                         command = AxeCommand(Opcode.SusccXxx, snb);
  861:                         break;
  862:                     }
  863:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.WakeupCall):
  864:                     {
  865:                         command = AxeCommand(Opcode.SusccXxx, snb);
  866:                         break;
  867:                     }
  868:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCallingUserControlled):
  869:                     {
  870:                         command = AxeCommand(Opcode.SusccXxx, snb);
  871:                         break;
  872:                     }
  873:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.InternationalCalling):
  874:                     {
  875:                         command = AxeCommand(Opcode.SusccXxx, snb);
  876:                         break;
  877:                     }
  878:                 case (Ia.Ftn.Cl.Models.Business.Service.SupplementaryService.ServiceSuspension):
  879:                     {
  880:                         command = AxeCommand(Opcode.SusccXxx, snb);
  881:                         break;
  882:                     }
  883:                 default:
  884:                     {
  885:                         command = snb + ",unknown SupplementaryService: " + supplementaryServiceState.ToString().ToLower();
  886:                         break;
  887:                     }
  888:             }
  889:  
  890:             return command;
  891:         }
  892:  
  893:         ////////////////////////////////////////////////////////////////////////////
  894:  
  895:         /// <summary>
  896:         ///
  897:         /// </summary>
  898:         public static string UpdateServiceRouteCommand(string service, int ics)
  899:         {
  900:             var snb = int.Parse(service);
  901:  
  902:             return AxeCommand(Opcode.SusccIcs, snb, ics);
  903:         }
  904:  
  905:         ////////////////////////////////////////////////////////////////////////////
  906:  
  907:         /// <summary>
  908:         ///
  909:         /// </summary>
  910:         public static string ServiceSuspensionCommand(string service, bool serviceSuspensionState)
  911:         {
  912:             string command;
  913:  
  914:             var snb = int.Parse(service);
  915:  
  916:             if (serviceSuspensionState) command = AxeCommand(Opcode.SusccTboTbi, snb, 2, 1); // suspend
  917:             else command = AxeCommand(Opcode.SusccTboTbi, snb, 0, 0); // release
  918:  
  919:             return command;
  920:         }
  921:  
  922:         ////////////////////////////////////////////////////////////////////////////
  923:  
  924:         /// <summary>
  925:         ///
  926:         /// </summary>
  927:         public static string ConfirmCommandSemicolon()
  928:         {
  929:             return AxeCommand(Opcode.ConfirmCommandSemicolon);
  930:         }
  931:  
  932:         ////////////////////////////////////////////////////////////////////////////
  933:  
  934:         /// <summary>
  935:         ///
  936:         /// </summary>
  937:         public static string KeepAliveCommandSemicolon()
  938:         {
  939:             return AxeCommand(Opcode.KeepAliveCommandSemicolon);
  940:         }
  941:  
  942:         ////////////////////////////////////////////////////////////////////////////
  943:         ////////////////////////////////////////////////////////////////////////////
  944:  
  945:         /// <summary>
  946:         ///
  947:         /// </summary>
  948:         private static string AxeCommand(Opcode opcode)
  949:         {
  950:             string command;
  951:  
  952:             if (opcode == Opcode.ConfirmCommandSemicolon) command = ";";
  953:             else if (opcode == Opcode.KeepAliveCommandSemicolon) command = ";";
  954:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  955:  
  956:             return command;
  957:         }
  958:  
  959:         ////////////////////////////////////////////////////////////////////////////
  960:  
  961:         /// <summary>
  962:         ///
  963:         /// </summary>
  964:         private static string AxeCommand(Opcode opcode, int snb)
  965:         {
  966:             string command;
  967:  
  968:             if (opcode == Opcode.Suscp) command = "SUSCP:SNB=" + snb + ";";
  969:             else if (opcode == Opcode.Sulie) command = "SULIE:SNB=" + snb + ";"; // SULIE must be followed with semicolon';'
  970:             else if (opcode == Opcode.SusccXxx) command = "SUSCC:SNB=" + snb + ",SCL=Xxx;"; // SUSCC must be followed with semicolon';'
  971:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  972:  
  973:             return command;
  974:         }
  975:  
  976:         ////////////////////////////////////////////////////////////////////////////
  977:  
  978:         /// <summary>
  979:         ///
  980:         /// </summary>
  981:         private static string AxeCommand(Opcode opcode, int snb, int parameter)
  982:         {
  983:             string command;
  984:  
  985:             if (opcode == Opcode.SusccIcs) command = "SUSCC:SNB=" + snb + ",SCL=ICS-" + parameter + "&TBO-0&TBI-0&BOC-0&BIC-0;"; // SUSCC must be followed with semicolon';'
  986:             else if (opcode == Opcode.SusccXxx) command = "SUSCC:SNB=" + snb + ",SCL=Xxx-" + parameter + ";"; // SUSCC must be followed with semicolon';'
  987:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
  988:  
  989:             return command;
  990:         }
  991:  
  992:         ////////////////////////////////////////////////////////////////////////////
  993:  
  994:         /// <summary>
  995:         ///
  996:         /// </summary>
  997:         private static string AxeCommand(Opcode opcode, int snb, int parameter1, int parameter2)
  998:         {
  999:             string command;
 1000:  
 1001:             if (opcode == Opcode.SusccTboTbi) command = "SUSCC:SNB=" + snb + ",SCL=TBO-" + parameter1 + "&TBI-" + parameter2 + ";"; // SUSCC must be followed with semicolon';'
 1002:             else throw new System.ArgumentOutOfRangeException("AxeCommand(): Opcode unrecognized. ");
 1003:  
 1004:             return command;
 1005:         }
 1006:  
 1007:         ////////////////////////////////////////////////////////////////////////////
 1008:  
 1009:         /// <summary>
 1010:         ///
 1011:         /// </summary>
 1012:         public static string AxeDisplayTimeCommand
 1013:         {
 1014:             get
 1015:             {
 1016:                 return ";";
 1017:             }
 1018:         }
 1019:  
 1020:         ////////////////////////////////////////////////////////////////////////////
 1021:  
 1022:         /// <summary>
 1023:         /// Extract unique AXE service symbols into array 
 1024:         /// </summary>
 1025:         public static void ExtractAndUpdateUniqueAxeServiceSymbolListFromOutputContent(string outputContent)
 1026:         {
 1027:             MatchCollection matchCollection;
 1028:  
 1029:             matchCollection = Regex.Matches(outputContent, @"\b[A-Z]{3,8}-\d+\b");
 1030:  
 1031:             if (matchCollection.Count > 0)
 1032:             {
 1033:                 foreach (Match match in matchCollection)
 1034:                 {
 1035:                     if (!match.Value.StartsWith("LIMA")) // LIMA-3445 is a circuit
 1036:                     {
 1037:                         if (!ServiceSymbolList.Contains(match.Value))
 1038:                         {
 1039:                             ServiceSymbolList.Add(match.Value);
 1040:                         }
 1041:                     }
 1042:                 }
 1043:             }
 1044:         }
 1045:  
 1046:         ////////////////////////////////////////////////////////////////////////////
 1047:         ////////////////////////////////////////////////////////////////////////////
 1048:     }
 1049:  
 1050:     ////////////////////////////////////////////////////////////////////////////
 1051:     ////////////////////////////////////////////////////////////////////////////    
 1052: }
 1053: