using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; using GeneralApi.IntegrationUtility.Common; using log4net; using Microsoft.Practices.ServiceLocation; using Taloyhtio.GeneralApi.Common.Extensions; using Taloyhtio.GeneralApi.IntegrationUtility.TaloyhtioIntegration; using Condo = Taloyhtio.GeneralApi.Common.DTO.Condo; namespace Taloyhtio.GeneralApi.IntegrationUtility.Services.Impl { public class FileProcessor : IFileProcessor where T : class { private ILog logger = ServiceLocator.Current.GetInstance(); private IFileParser parser; private ISettingsProvider settingsProvider; private ISender sender; public FileProcessor(IFileParser parser, ISettingsProvider settingsProvider, ISender sender) { this.parser = parser; this.sender = sender; this.settingsProvider = settingsProvider; this.sender = sender; } public bool ProcessFile(string filePath) { try { return this.processFile(filePath); } catch (Exception x) { this.logger.ErrorFormat(string.Format("{0}\n{1}", x.Message, x.StackTrace)); return false; } } private bool processFile(string filePath) { if (string.IsNullOrEmpty(filePath)) { this.logger.WarnFormat("File path is null or empty"); return false; } var items = this.parser.Parse(filePath); if (items.IsNullOrEmpty()) { this.logger.WarnFormat("No items were found in the file '{0}'", filePath); return true; } this.logger.InfoFormat("'{0}' item(s) were found in the file '{1}'", items.Count, filePath); var proxy = new TaloyhtioIntegrationClient(); using (new OperationContextScope(proxy.InnerChannel)) { string loginName = this.settingsProvider.Get(Constants.Settings.LOGIN_NAME_SETTING_KEY); string pwd = this.settingsProvider.Get(Constants.Settings.PASSWORD_SETTING_KEY); WebOperationContext.Current.OutgoingRequest.Headers.Add( Taloyhtio.GeneralApi.Common.Constants.HttpHeaders.Username, loginName); WebOperationContext.Current.OutgoingRequest.Headers.Add( Taloyhtio.GeneralApi.Common.Constants.HttpHeaders.Password, pwd); this.logger.Info("Start processing items..."); // pairs of (original index, result) var results = new List>(); int count = items.Count; for (int i = 0; i < count; i++) { var item = items[i]; if (item == null) { this.logger.WarnFormat("Item with index '{0}' is null. Skip it", i); continue; } this.logger.InfoFormat("Send item with index '{0}': {1}...", i, item.ToString()); bool result = this.send(item, proxy); results.Add(new KeyValuePair(i, result)); this.logger.InfoFormat("Complete sending item with index '{0}'", i); } this.logger.Info("Finish processing items"); bool commonResult = results.All(r => r.Value); this.logger.InfoFormat("Common result is '{0}'", commonResult); this.logger.Info("Detailed result:"); for (int i = 0; i < results.Count; i++) { this.logger.InfoFormat("Index {0}: {1}", results[i].Key, results[i].Value); } this.logger.Info("End of detailed result"); return commonResult; } } private bool send(T item, TaloyhtioIntegrationClient proxy) { try { if (item == null) { this.logger.Error("Item is null. It will not be sent"); return false; } if (proxy == null) { this.logger.Error("Proxy is null. Item will not be sent"); return false; } this.logger.InfoFormat("Sending item information to Taloyhtio..."); //proxy.SaveCondoInformation(item); this.sender.Send(item, proxy); this.logger.Info("Item information was successfully sent"); return true; } catch (Exception x) { this.logger.ErrorFormat(string.Format("Error occured during sending item information:\n{0}\n{1}", x.Message, x.StackTrace)); return false; } } } }