using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.IO; using System.ServiceProcess; using System.Text; using System.Timers; using System.Threading.Tasks; using log4net; using bsmd.database; using bsmd.herberg.FormService.WebReference; namespace bsmd.herberg.FormService { public partial class FormService : ServiceBase { private Timer _timer; private object _timerlock = new object(); private bool processRunning = false; private ILog _log = LogManager.GetLogger(typeof(FormService)); public FormService() { Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); InitializeComponent(); } protected override void OnStart(string[] args) { this.EventLog.Source = this.ServiceName; this.EventLog.Log = "Application"; this.Init(args); this.EventLog.WriteEntry("FormService started.", EventLogEntryType.Information); System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); string version = fvi.FileVersion; this._log.InfoFormat("Starting EU-NOAD FormService. v.{0}", version); this.DoOnce(); } protected override void OnStop() { this._log.Info("Stopping EU-NOAD FormService."); } public void Init(string[] args) { this._timer = new Timer(); this._timer.Interval = Properties.Settings.Default.SleepSeconds * 1000; this._timer.Elapsed += _timer_Elapsed; this._timer.Enabled = true; } public void DoOnce() { this._timer_Elapsed(null, null); } void _timer_Elapsed(object sender, ElapsedEventArgs e) { lock (this._timerlock) { if (this.processRunning) return; else this.processRunning = true; } if (DBManager.Instance.Connect(Properties.Settings.Default.ConnectionString)) { try { WSAPIFormData client = new WSAPIFormData(); client.Url = Properties.Settings.Default.ServerAddress; // client.Endpoint.Name = "Fleettracker Forms"; // TODO // Verbindung zu Herberg's Service aufnehmen und Formulare abfragen GetFormDataInfoListRequestData body = new GetFormDataInfoListRequestData(); body.apiIdentifier = new APIIdentifier(); // von Jan am 1.4.15: (April, April..) body.apiIdentifier.companyGuid = Properties.Settings.Default.CompanyGuid.ToString(); body.apiIdentifier.clientGuid = Properties.Settings.Default.ClientGuid.ToString(); body.ffFolderTemplateTypeTag = "NSWAD"; body.timeFrameRequestFilter = new TimeFrameRequestFilter(); body.timeFrameRequestFilter.startDate = DateTime.Now - new TimeSpan(Properties.Settings.Default.IntervalLastDay, Properties.Settings.Default.IntervalLastHour, Properties.Settings.Default.IntervalLastMinute, 0); body.timeFrameRequestFilter.startDateSpecified = true; body.timeFrameRequestFilter.endDate = DateTime.Now + new TimeSpan(1, 0, 0, 0); body.timeFrameRequestFilter.endDateSpecified = true; // Liste der verfügbaren Formulare abholen GetFormDataInfoListResponseData listReponse = client.GetFormDataInfoList(body); if (listReponse.success) { if (listReponse.formDataInfoDatasets != null) { for (int i = 0; i < listReponse.formDataInfoDatasets.Length; i++) { FormDataInfoDataset dataSet = listReponse.formDataInfoDatasets[i]; /* prüfen, ob ich das Formular schon habe? -> RS Jan > Ein Formular, identifiziert durch formGuid würde dann immer einem > Schiffsanlauf entsprechen? d.h. der nächste Hafenanlauf hätte dann > dieselbe formTemplateGuid, aber unterschiedliche formGuids? Das ist korrekt. Allerdings kann sich die FormTemplate-GUID mit der Zeit ändern, wenn wir z.B. das Template updaten. Theoretisch kann das auch zwischen Initial und Update passieren. */ // Formular abholen GetFormDataRequestData formBody = new GetFormDataRequestData(); formBody.apiIdentifier = new APIIdentifier(); formBody.apiIdentifier.companyGuid = Properties.Settings.Default.CompanyGuid.ToString(); formBody.apiIdentifier.clientGuid = Properties.Settings.Default.ClientGuid.ToString(); formBody.formGuid = dataSet.formGuid; bool successfulGet = true; GetFormDataResponseData formResponse = null; try { formResponse = client.GetFormData(formBody); } catch (Exception ex) { _log.ErrorFormat("Exception reading formBody: {0}", ex.ToString()); successfulGet = false; } if (successfulGet && formResponse.success) { // abgefragtes Formular in die DB speichern MessageCore aMessageCore = DBManager.Instance.GetHerbergFormMessage(new Guid(formBody.formGuid)); if (aMessageCore == null) { _log.InfoFormat("Creating new MessageCore for IMO {0}", formResponse.imoNumber); // neuen Anlaufeintrag (=MessageCore) erstellen aMessageCore = new MessageCore(); aMessageCore.HerbergFormGuid = new Guid(formBody.formGuid); // aMessageCore.HerbergFormTemplateGuid = formResponse. aMessageCore.IMO = formResponse.imoNumber.ToString(); aMessageCore.ReportStatus = MessageCore.ReportStatusEnum.COMPLETE; aMessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; if (aMessageCore.IMO.Length > 7) { _log.WarnFormat("IMO {0} is longer than 7 chars, truncating!", aMessageCore.IMO); aMessageCore.IMO = aMessageCore.IMO.Substring(0, 7); } DBManager.Instance.Save(aMessageCore); } else { // TODO: Status von Core prüfen (wurde schon von BSMD verändert?) _log.InfoFormat("Updating form data for IMO {0}", formResponse.imoNumber); } Util.UpdateFormCore(aMessageCore, formResponse); } else { _log.ErrorFormat("Request of form {0} failed", dataSet.formGuid); } } } else { _log.InfoFormat("nothing: {0} - {1}", body.timeFrameRequestFilter.startDate, body.timeFrameRequestFilter.endDate); } } else { _log.Error("Request of form list failed"); } DBManager.Instance.Disconnect(); } catch (Exception ex) { _log.ErrorFormat("Exception occurred: {0}", ex.ToString()); } } else { this.EventLog.WriteEntry("FormService stopped: DB connection failed", EventLogEntryType.Error); this.Stop(); } lock (this._timerlock) { this.processRunning = false; } } } }