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

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

Fixed Telecommunications Network's Operations Support System Management Intranet (FTN OSS) support class for Nokia's Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Configuration;
    4: using System.Linq;
    5: using System.Text;
    6: using static Ia.Ftn.Cl.Models.Business.NetworkDesignDocument;
    7:  
    8: namespace Ia.Ftn.Cl.Models.Business.Nokia
    9: {
   10:     ////////////////////////////////////////////////////////////////////////////
   11:  
   12:     /// <summary publish="true">
   13:     /// Fixed Telecommunications Network's Operations Support System Management Intranet (FTN OSS) support class for Nokia's Fixed Telecommunications Network (FTN) business model.
   14:     /// </summary>
   15:     /// 
   16:     /// <value>
   17:     ///   <appSettings>
   18:     ///     <add key="sdcServerHost" value="https://*" />
   19:     ///     <add key="sdcServerPort" value="*" />
   20:     ///     <add key="sdcServerServiceUrl" value="*" />
   21:     ///     <add key="sdcServerUser" value="*" />
   22:     ///     <add key="sdcServerUserPassword" value="*" />
   23:     ///   </appSettings>
   24:     /// </value>
   25:     /// 
   26:     /// <remarks> 
   27:     /// Copyright © 2018-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   28:     ///
   29:     /// 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
   30:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   31:     ///
   32:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   33:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   34:     /// 
   35:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   36:     /// 
   37:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   38:     /// </remarks> 
   39:     public class Sdc
   40:     {
   41:         private static List<string> ponNameList;
   42:  
   43:         private static List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pon> ponList;
   44:  
   45:         /// <summary/>
   46:         public static string BaseAddress { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:SdcServerHost") + ":" + Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:SdcServerPort"); } }
   47:  
   48:         /// <summary/>
   49:         public static string ServiceUrl { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:SdcServerServiceUrl"); } }
   50:  
   51:         /// <summary/>
   52:         public static string UserName { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:SdcServerUser"); } }
   53:  
   54:         /// <summary/>
   55:         public static string Password { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:SdcServerUserPassword"); } }
   56:  
   57:         /// <summary/>
   58:         public enum Transaction { Receive, Transmit }
   59:  
   60:         /// <summary/>
   61:         public static List<TimeSpan> ScaleList
   62:         {
   63:             get
   64:             {
   65:                 return new List<TimeSpan> { TimeSpan.FromHours(1), TimeSpan.FromDays(1), TimeSpan.FromDays(7), TimeSpan.FromDays(30), TimeSpan.FromDays(365) };
   66:             }
   67:         }
   68:  
   69:         ////////////////////////////////////////////////////////////////////////////
   70:  
   71:         /// <summary>
   72:         ///
   73:         /// </summary>
   74:         public Sdc()
   75:         {
   76:         }
   77:  
   78:         ////////////////////////////////////////////////////////////////////////////
   79:  
   80:         /// <summary>
   81:         /// 
   82:         /// </summary>
   83:         public class TransactionTimestampValue
   84:         {
   85:             /// <summary/>           
   86:             public Transaction Transaction { get; set; }
   87:  
   88:             /// <summary/>           
   89:             public DateTime Timestamp { get; set; }
   90:  
   91:             /// <summary/>           
   92:             public long Value { get; set; }
   93:  
   94:             ////////////////////////////////////////////////////////////////////////////
   95:  
   96:             /// <summary>
   97:             ///
   98:             /// </summary>
   99:             public TransactionTimestampValue(Transaction transaction, DateTime timestamp, long value)
  100:             {
  101:                 this.Transaction = transaction;
  102:  
  103:                 this.Timestamp = timestamp;
  104:  
  105:                 this.Value = value;
  106:             }
  107:  
  108:             ////////////////////////////////////////////////////////////////////////////
  109:  
  110:             /// <summary>
  111:             ///
  112:             /// </summary>
  113:             public override string ToString()
  114:             {
  115:                 return this.Transaction.ToString() + ": " + this.Timestamp + ": " + this.Value;
  116:             }
  117:  
  118:             ////////////////////////////////////////////////////////////////////////////
  119:         }
  120:  
  121:         ////////////////////////////////////////////////////////////////////////////
  122:  
  123:         /// <summary>
  124:         /// Response of Nokia SDC server
  125:         /// </summary>
  126:         public class Response
  127:         {
  128:             public string Author { get; set; }
  129:  
  130:             /// <summary/>
  131:             public string Version { get; set; }
  132:  
  133:             /// <summary/>
  134:             public string Tmf854Version { get; set; }
  135:  
  136:             /// <summary/>
  137:             public string ActivityName { get; set; }
  138:  
  139:             /// <summary/>
  140:             public string MessageName { get; set; }
  141:  
  142:             /// <summary/>
  143:             public string MessageType { get; set; }
  144:  
  145:             /// <summary/>
  146:             public string SenderUri { get; set; }
  147:  
  148:             /// <summary/>
  149:             public string DestinationUri { get; set; }
  150:  
  151:             /// <summary/>
  152:             public string CommunicationPattern { get; set; }
  153:  
  154:             /// <summary/>
  155:             public string CommunicationStyle { get; set; }
  156:  
  157:             /// <summary/>
  158:             public string ActivityStatus { get; set; }
  159:  
  160:             /// <summary/>
  161:             public DateTime Timestamp { get; set; }
  162:  
  163:             /// <summary/>
  164:             public string BodyText { get; set; }
  165:  
  166:             /// <summary/>
  167:             public Dictionary<string, string> ParameterDictionary;
  168:  
  169:             /// <summary/>
  170:             public bool IsSuccessfull { get { return ReturnCode == Ia.Ftn.Cl.Models.Client.Nokia.Sdc.ResultCode.Successful; } }
  171:  
  172:             /// <summary/>
  173:             public Ia.Ftn.Cl.Models.Client.Nokia.Sdc.ResultCode ReturnCode { get; set; }
  174:  
  175:             /// <summary/>
  176:             public Response() { }
  177:         }
  178:  
  179:         ////////////////////////////////////////////////////////////////////////////
  180:  
  181:         /// <summary>
  182:         ///
  183:         /// </summary>
  184:         public static void EnableSdcPerformanceMonitoringDataOfAllPons(Ia.Ftn.Cl.Models.Client.Nokia.Sdc sdc, out Ia.Cl.Models.Result result)
  185:         {
  186:             StringBuilder sb;
  187:  
  188:             result = new Ia.Cl.Models.Result();
  189:  
  190:             if (ponList == null) ponList = (from p in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PonList
  191:                                             where p.PonGroup.Olt.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia
  192:                                             select p).ToList();
  193:  
  194:             sb = new StringBuilder();
  195:  
  196:             foreach (var pon in ponList)
  197:             {
  198:                 Ia.Ftn.Cl.Models.Business.Nokia.Sdc.EnableSdcPerformanceMonitoringDataForPon(sdc, pon, out result);
  199:  
  200:                 result.AddResult(result);
  201:  
  202:                 sb.AppendLine(result.Message);
  203:             }
  204:         }
  205:  
  206:         ////////////////////////////////////////////////////////////////////////////
  207:  
  208:         /// <summary>
  209:         ///
  210:         /// </summary>
  211:         public static void EnableSdcPerformanceMonitoringDataForPon(Ia.Ftn.Cl.Models.Client.Nokia.Sdc sdc, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pon pon, out Ia.Cl.Models.Result result)
  212:         {
  213:             string s;
  214:  
  215:             result = new Ia.Cl.Models.Result();
  216:  
  217:             sdc.EnablePerformanceMonitoringDataOverPon(pon, out Cl.Models.Business.Nokia.Sdc.Response response);
  218:  
  219:             s = response.Timestamp + ": " + response.ActivityName + ": " + response.ActivityStatus;
  220:             s += "\r\n";
  221:  
  222:             if (response != null && response.ParameterDictionary != null)
  223:             {
  224:                 if (response.ParameterDictionary.Count > 0)
  225:                 {
  226:                     foreach (KeyValuePair<string, string> kvp in response.ParameterDictionary)
  227:                     {
  228:                         s += kvp.Key + ": " + kvp.Value + "\r\n";
  229:                     }
  230:                 }
  231:             }
  232:  
  233:             if (response.IsSuccessfull) result.AddSuccess(s);
  234:             else result.AddError(s);
  235:         }
  236:  
  237:         ////////////////////////////////////////////////////////////////////////////
  238:  
  239:         /// <summary>
  240:         ///
  241:         /// </summary>
  242:         public static Ia.Cl.Models.Result ReadPerformanceMonitoringDataOfEnabledPon(Ia.Ftn.Cl.Models.Client.Nokia.Sdc sdc, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pon pon)
  243:         {
  244:             var result = new Ia.Cl.Models.Result();
  245:  
  246:             var response = sdc.GetPerformanceMonitoringDataOverPon(pon);
  247:  
  248:             var text = string.Empty;
  249:  
  250:             if (response.IsSuccessfull)
  251:             {
  252:                 // Tx
  253:                 if (response.ParameterDictionary.ContainsKey("pmParameterName0"))
  254:                 {
  255:                     var gponOltSidePonUtilTxPmIntervalTotalBytesPmParameterName = response.ParameterDictionary["pmParameterName0"];
  256:  
  257:                     if (response.ParameterDictionary.ContainsKey("pmParameterValue0"))
  258:                     {
  259:                         var gponOltSidePonUtilTxPmIntervalTotalBytesPmParameterValue = response.ParameterDictionary["pmParameterValue0"];
  260:  
  261:                         if (gponOltSidePonUtilTxPmIntervalTotalBytesPmParameterValue.Length > 0)
  262:                         {
  263:                             var list = gponOltSidePonUtilTxPmIntervalTotalBytesPmParameterValue.Split(',');
  264:  
  265:                             if (list.Length > 0)
  266:                             {
  267:                                 var valueList = new List<long>();
  268:  
  269:                                 foreach (var s in list)
  270:                                 {
  271:                                     if (long.TryParse(s, out long l)) valueList.Add(l);
  272:                                     else text += pon.Name + ": transmit: " + response.Timestamp + ": Error: can't parse s: " + s;
  273:                                 }
  274:  
  275:                                 Ia.Ftn.Cl.Models.Data.Nokia.Sdc.SaveTransactionTimestampValueListOfPon(pon, Ia.Ftn.Cl.Models.Business.Nokia.Sdc.Transaction.Transmit, response.Timestamp, valueList);
  276:  
  277:                                 text += pon.Name + ": transmit: " + response.Timestamp + ": " + string.Join(",", valueList);
  278:                             }
  279:                             else
  280:                             {
  281:                                 text += pon.Name + ": transmit: " + response.Timestamp + ": Error: list is empty";
  282:                             }
  283:                         }
  284:                         else
  285:                         {
  286:                             text += pon.Name + ": transmit: " + response.Timestamp + ": Error: gponOltSidePonUtilTxPmIntervalTotalBytesPmParameterValue is empty";
  287:                         }
  288:  
  289:                         result.AddSuccess(text);
  290:                     }
  291:                     else
  292:                     {
  293:                         text += pon.Name + ": transmit: " + response.Timestamp + ": Error: response.ParameterDictionary does not contain key pmParameterValue0";
  294:  
  295:                         result.AddError(text);
  296:                     }
  297:                 }
  298:                 else
  299:                 {
  300:                     text += pon.Name + ": transmit: " + response.Timestamp + ": Error: response.ParameterDictionary does not contain key pmParameterName0";
  301:  
  302:                     result.AddError(text);
  303:                 }
  304:  
  305:  
  306:                 text = string.Empty;
  307:  
  308:                 // Rx
  309:                 if (response.ParameterDictionary.ContainsKey("pmParameterName1"))
  310:                 {
  311:                     var gponOltSidePonUtilRxPmIntervalTotalBytesPmParameterName = response.ParameterDictionary["pmParameterName1"];
  312:  
  313:                     if (response.ParameterDictionary.ContainsKey("pmParameterValue1"))
  314:                     {
  315:                         var gponOltSidePonUtilRxPmIntervalTotalBytesPmParameterValue = response.ParameterDictionary["pmParameterValue1"];
  316:  
  317:                         if (gponOltSidePonUtilRxPmIntervalTotalBytesPmParameterValue.Length > 0)
  318:                         {
  319:                             var list = gponOltSidePonUtilRxPmIntervalTotalBytesPmParameterValue.Split(',');
  320:  
  321:                             if (list.Length > 0)
  322:                             {
  323:                                 var valueList = new List<long>();
  324:  
  325:                                 foreach (var s in list)
  326:                                 {
  327:                                     if (long.TryParse(s, out long l)) valueList.Add(l);
  328:                                     else text += pon.Name + ": receive: " + response.Timestamp + ": Error: can't parse s: " + s;
  329:                                 }
  330:  
  331:                                 Ia.Ftn.Cl.Models.Data.Nokia.Sdc.SaveTransactionTimestampValueListOfPon(pon, Ia.Ftn.Cl.Models.Business.Nokia.Sdc.Transaction.Receive, response.Timestamp, valueList);
  332:  
  333:                                 text += pon.Name + ": receive: " + response.Timestamp + ": " + string.Join(",", valueList);
  334:                             }
  335:                             else
  336:                             {
  337:                                 text += pon.Name + ": receive: " + response.Timestamp + ": Error: list is empty";
  338:                             }
  339:                         }
  340:                         else
  341:                         {
  342:                             text += pon.Name + ": receive: " + response.Timestamp + ": Error: gponOltSidePonUtilRxPmIntervalTotalBytesPmParameterValue is empty";
  343:                         }
  344:  
  345:                         result.AddSuccess(text);
  346:                     }
  347:                     else
  348:                     {
  349:                         text += pon.Name + ": receive: " + response.Timestamp + ": Error: response.ParameterDictionary does not contain key pmParameterValue1";
  350:  
  351:                         result.AddError(text);
  352:                     }
  353:                 }
  354:                 else
  355:                 {
  356:                     text += pon.Name + ": receive: " + response.Timestamp + ": Error: response.ParameterDictionary does not contain key pmParameterName1";
  357:  
  358:                     result.AddError(text);
  359:                 }
  360:             }
  361:             else result.AddError(text);
  362:  
  363:             return result;
  364:         }
  365:  
  366:         ////////////////////////////////////////////////////////////////////////////
  367:  
  368:         /// <summary>
  369:         ///
  370:         /// </summary>
  371:         public static List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue> AdjustTransactionTimestampHourlyValueList(Ia.Ftn.Cl.Models.Business.Nokia.Sdc.Transaction transaction, List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue> timestampValueList)
  372:         {
  373:             long l;
  374:             List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue> adjustedTimestampValueList;
  375:  
  376:             adjustedTimestampValueList = new List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue>();
  377:  
  378:             //previous = 0;
  379:  
  380:             foreach (var timestampValue in timestampValueList)
  381:             {
  382:                 if (timestampValue.Transaction == transaction)
  383:                 {
  384:                     l = ConvertHourlyByteCountToMegaBitsPerSecond(timestampValue.Value);
  385:  
  386:                     adjustedTimestampValueList.Add(new Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue(transaction, timestampValue.Timestamp, l));
  387:                 }
  388:             }
  389:  
  390:             return adjustedTimestampValueList;
  391:         }
  392:  
  393:         ////////////////////////////////////////////////////////////////////////////
  394:  
  395:         /// <summary>
  396:         ///
  397:         /// </summary>
  398:         public static long ConvertHourlyByteCountToMegaBitsPerSecond(long l)
  399:         {
  400:             // from Nokia support:.. these are byte counters and five minute interval means that you will have to divide the value with 300 to get bytes per second.
  401:             // ... one byte is eight bits, thus, 10 MB/s = 80 Mb/s.
  402:             // I say: to get the hourly *rate* in Mb/s I will need to divide by 3600 (seconds in an hour)
  403:  
  404:             return l / 3600 * 8 / 1000000;
  405:         }
  406:  
  407:         ////////////////////////////////////////////////////////////////////////////
  408:  
  409:         /// <summary>
  410:         ///
  411:         /// </summary>
  412:         public static void ReadPerformanceMonitoringDataOfEnabledPon(Ia.Ftn.Cl.Models.Client.Nokia.Sdc sdc, out Ia.Cl.Models.Result result)
  413:         {
  414:             if (ponList == null)
  415:             {
  416:                 ponList = (from p in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PonList
  417:                            where p.PonGroup.Olt.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia
  418:                            select p).ToList();
  419:             }
  420:  
  421:             var pon = ponList.Next();
  422:  
  423:             result = Ia.Ftn.Cl.Models.Business.Nokia.Sdc.ReadPerformanceMonitoringDataOfEnabledPon(sdc, pon);
  424:         }
  425:  
  426:         /*
  427:         ////////////////////////////////////////////////////////////////////////////
  428: 
  429:         /// <summary>
  430:         ///
  431:         /// </summary>
  432:         public static List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.PonNameTimestampValue> AdjusteStatisticDistributionAndCountAndAverageAccordingToTimeScaleToStatisticsListToMakeMoreResonableStorageList(List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.PonNameTimestampValue> statisticList)
  433:         {
  434:             //int i, numberOfSamplesPerTimeScale;
  435:             //TimeSpan timeSpan;
  436:             //DateTime startTime, endTime;
  437:             List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.PonNameTimestampValue> oldList, adjustedStatisticsList;
  438: 
  439:             /*
  440:             Dictionary<TimeSpan, List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>> timeSpanToStatisticListDictionary;
  441:             Dictionary<TimeSpan, List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>> timeScaleToStatisticsListDictionary;
  442: 
  443:             numberOfSamplesPerTimeScale = 100;
  444: 
  445:             timeScaleToStatisticsListDictionary = new Dictionary<TimeSpan, List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>>();
  446: 
  447:             timeSpanToStatisticListDictionary = new Dictionary<TimeSpan, List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>>();
  448:             */
  449:         //adjustedStatisticsList = new List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.PonNameTimestampValue>();
  450:  
  451:         /*
  452:         oldList = new List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>();
  453: 
  454:         foreach (var scale in Ia.Ftn.Cl.Model.Business.Nokia.Sdc.ScaleList.OrderBy(u => u.TotalSeconds))
  455:         {
  456:             timeScaleToStatisticsListDictionary[scale] = FilterAccordingToScaleTimeSpan(scale, statisticList).Except(oldList).ToList();
  457: 
  458:             oldList.AddRange(timeScaleToStatisticsListDictionary[scale]);
  459:         }
  460: 
  461: 
  462:         foreach (var timeScaleToStatisticsList in timeScaleToStatisticsListDictionary.OrderBy(u => u.Key.TotalSeconds))
  463:         {
  464:             timeSpan = new TimeSpan(timeScaleToStatisticsList.Key.Ticks / numberOfSamplesPerTimeScale);
  465: 
  466:             startTime = DateTime.UtcNow.AddHours(3) - timeScaleToStatisticsList.Key;
  467:             endTime = startTime + timeSpan;
  468: 
  469:             foreach (var statistic in timeScaleToStatisticsList.Value)
  470:             {
  471:                 for (i = 0; i < numberOfSamplesPerTimeScale; i++)
  472:                 {
  473:                     if (statistic.Timestamp >= startTime && statistic.Timestamp < endTime)
  474:                     {
  475:                         if (timeSpanToStatisticListDictionary.ContainsKey(timeSpan))
  476:                         {
  477:                             timeSpanToStatisticListDictionary[timeSpan].Add(statistic);
  478:                         }
  479:                         else
  480:                         {
  481:                             timeSpanToStatisticListDictionary[timeSpan] = new List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>();
  482: 
  483:                             timeSpanToStatisticListDictionary[timeSpan].Add(statistic);
  484:                         }
  485: 
  486:                         break;
  487:                     }
  488: 
  489:                     startTime = endTime;
  490:                     endTime = startTime + timeSpan;
  491:                 }
  492:             }
  493: 
  494:             statisticList = new List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>();
  495: 
  496:             foreach (KeyValuePair<TimeSpan, List<Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic>> timeSpanToStatisticList in timeSpanToStatisticListDictionary)
  497:             {
  498:                 if (timeScaleToStatisticsList.Value.Count > 0)
  499:                 {
  500:                     statisticList.Add(new Ia.Ftn.Cl.Model.Business.Nokia.Sdc.Statistic(timeScaleToStatisticsList.Value[0].Pon, startTime, (long)timeSpanToStatisticList.Value.Average(u => u.Count)));
  501:                 }
  502:             }
  503: 
  504:             adjustedStatisticsList.AddRange(statisticList);
  505:         }
  506:         * /
  507: 
  508:         foreach (var v in statisticList)
  509:         {
  510:             if (v.Timestamp >= DateTime.UtcNow.AddHours(3).AddDays(-7))
  511:             {
  512:                 adjustedStatisticsList.Add(v);
  513:             }
  514:         }
  515: 
  516:         return adjustedStatisticsList.OrderBy(u => u.Timestamp.Ticks).ToList();
  517:     }
  518:         */
  519:  
  520:         ////////////////////////////////////////////////////////////////////////////
  521:  
  522:         /// <summary>
  523:         ///
  524:         /// </summary>
  525:         public static List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue> FilterAndKeepDataFromNDays(List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue> timestampValuelist)
  526:         {
  527:             var dataToKeepFromPastNDays = 30;
  528:             var now = DateTime.UtcNow.AddHours(3);
  529:             var list = new List<Ia.Ftn.Cl.Models.Business.Nokia.Sdc.TransactionTimestampValue>(timestampValuelist.Count);
  530:  
  531:             foreach (var timestampValue in timestampValuelist)
  532:             {
  533:                 if (now.AddDays(-dataToKeepFromPastNDays) < timestampValue.Timestamp) list.Add(timestampValue);
  534:             }
  535:  
  536:             return list;
  537:         }
  538:  
  539:         ////////////////////////////////////////////////////////////////////////////
  540:         ////////////////////////////////////////////////////////////////////////////
  541:     }
  542:  
  543:     ////////////////////////////////////////////////////////////////////////////
  544:     ////////////////////////////////////////////////////////////////////////////
  545: }