protected void ValidatePluginInterface <T>(DataService inDataService) where T : class { T plugin; using (IPluginDisposer disposer = LoadPluginInterfaceInstance <T>(inDataService, true, null, out plugin)) { } }
public virtual IPluginDisposer LoadPluginInterface <T>(DataService inDataService, out T plugin) where T : class { IPluginDisposer disposer = LoadPluginInterfaceInstance <T>(inDataService, true, out plugin); try { ConfigurePlugin <T>(inDataService, plugin); } catch (Exception) { DisposableBase.SafeDispose(ref disposer); throw; } return(disposer); }
protected void ProcessSolicitTransaction(string transactionId) { using (INodeProcessorMutex mutex = GetMutex(transactionId)) { if (!mutex.IsAcquired) { LOG.Debug("Exiting ProcessSolicitTransaction(), could not acquire mutex"); return; // Another thread is already working on this transaction, get out of here } // Make sure the transaction has not been processed yet string transactionModifiedBy; if (!TransactionManager.IsUnprocessed(transactionId, out transactionModifiedBy)) { LOG.Debug("Exiting ProcessSolicitTransaction(), transaction {0} has already been processed", transactionId); return; } Activity activity = new Activity(NodeMethod.Solicit, null, null, ActivityType.Info, transactionId, NetworkUtils.GetLocalIp(), "Start processing solicit transaction: \"{0}\"", transactionId); activity.ModifiedById = transactionModifiedBy; try { TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Pending, "Processing solicit transaction", false); // Get the request processing service string requestId, flowName, operation; DataService solicitService = TransactionManager.GetSolicitServiceForTransaction(transactionId, out flowName, out operation, out requestId); if ((solicitService == null) || !solicitService.IsActive) { throw new ArgumentException(string.Format("A valid solicit service was not found for the transaction \"{0}\"", transactionId)); } TimeSpan processLength; ISolicitProcessor plugin; using (IPluginDisposer disposer = PluginLoader.LoadSolicitProcessor(solicitService, out plugin)) { TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Processing, string.Format("Processing request with transaction id \"{0}\"", transactionId), true); DateTime startTime = DateTime.Now; activity.Append("Set transaction status to Processing"); activity.AppendFormat("Processing Solicit transaction for flow \"{0}\" and operation \"{1}\" using plugin \"{2}\"", flowName, operation, plugin.GetType().FullName); try { plugin.ProcessSolicit(requestId); } finally { activity.Append(plugin.GetAuditLogEvents()); } processLength = DateTime.Now - startTime; } activity.AppendFormat("Process time: {0}", processLength.ToString()); TransactionStatus transactionStatus = TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Completed, string.Format("Completed solicit request with transaction id \"{0}\"", transactionId), true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); activity.AppendFormat(TransactionManager.DoTransactionNotifications(transactionId)); } catch (Exception e) { TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.Failed, e.Message, CommonTransactionStatusCode.Received, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); activity.Append(ExceptionUtils.ToShortString(e)); activity.Type = ActivityType.Error; activity.AppendFormat(TransactionManager.DoTransactionNotifications(transactionId)); LOG.Error("ProcessSolicitTransaction() threw an exception.", e); } finally { ActivityManager.Log(activity); } } }
protected void ProcessSubmitTransaction(string transactionId) { using (INodeProcessorMutex mutex = GetMutex(transactionId)) { if (!mutex.IsAcquired) { LOG.Debug("Exiting ProcessTransactionRequest(), could not acquire mutex for transaction {0}", transactionId); return; // Another thread is already working on this transaction, get out of here } // Make sure the transaction has not been processed yet string transactionModifiedBy; if (!TransactionManager.IsUnprocessed(transactionId, out transactionModifiedBy)) { LOG.Debug("Exiting ProcessSubmitTransaction(), transaction {0} has already been processed", transactionId); return; } DateTime startTime = DateTime.Now; Activity activity = new Activity(NodeMethod.Submit, null, null, ActivityType.Info, transactionId, NetworkUtils.GetLocalIp(), "Start processing submit transaction: \"{0}\"", transactionId); activity.ModifiedById = transactionModifiedBy; try { TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Pending, "Processing submit transaction", false); // Get the document processing service string flowName, operation; DataService submitService = TransactionManager.GetSubmitDocumentServiceForTransaction(transactionId, out flowName, out operation); if (submitService == null) { if (!string.IsNullOrEmpty(operation)) { throw new ArgumentException(string.Format("A valid Submit service was not found for the flow \"{0}\" and operation \"{1}\"", flowName, operation)); } // Let empty operation pass through, even without a valid service, per Mark } else if (!submitService.IsActive) { throw new ArgumentException(string.Format("The Submit service is not active for the flow \"{0}\" and operation \"{1}\"", flowName, operation)); } if (submitService == null) { activity.Append("No service found for Submit transaction"); TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.ReceivedUnprocessed, "Received unprocessed submit transaction", CommonTransactionStatusCode.Received, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); } else { CommonTransactionStatusCode submitTransactionStatus = CommonTransactionStatusCode.Processed; string submitTransactionStatusDetail = "Finished processing submit transaction"; ISubmitProcessor submitProcessor; using (IPluginDisposer disposer = PluginLoader.LoadSubmitProcessor(submitService, out submitProcessor)) { TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Processing, "Processing submit transaction", true); activity.Append("Set transaction status to Processing"); activity.AppendFormat("Processing Submit transaction for flow \"{0}\" and operation \"{1}\" using plugin \"{2}\"", flowName, operation, submitProcessor.GetType().FullName); try { ISubmitProcessorEx submitProcessorEx = submitProcessor as ISubmitProcessorEx; if (submitProcessorEx != null) { submitTransactionStatus = submitProcessorEx.ProcessSubmitAndReturnStatus(transactionId, out submitTransactionStatusDetail); activity.AppendFormat("Submit processing plugin returned status of \"{0}\"", submitTransactionStatus.ToString()); } else { submitProcessor.ProcessSubmit(transactionId); } } finally { activity.Append(submitProcessor.GetAuditLogEvents()); } TimeSpan processLength = DateTime.Now - startTime; activity.AppendFormat("Process time: {0}", processLength.ToString()); } activity.Append("Finished processing submit transaction"); TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, submitTransactionStatus, submitTransactionStatusDetail, CommonTransactionStatusCode.Received | CommonTransactionStatusCode.Completed | CommonTransactionStatusCode.Failed, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); activity.AppendFormat(TransactionManager.DoTransactionNotifications(transactionId)); } } catch (Exception e) { LOG.Error("ProcessSubmitTransaction() threw an exception.", e); TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.Failed, e.Message, CommonTransactionStatusCode.Received, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); activity.Append(ExceptionUtils.ToShortString(e)); activity.Type = ActivityType.Error; activity.AppendFormat(TransactionManager.DoTransactionNotifications(transactionId)); } finally { ActivityManager.Log(activity); } } }
protected void ProcessNotifyTransaction(string transactionId) { using (INodeProcessorMutex mutex = GetMutex(transactionId)) { if (!mutex.IsAcquired) { LOG.Debug("Exiting ProcessNotifyTransaction(), could not acquire mutex"); return; // Another thread is already working on this transaction, get out of here } // Make sure the transaction has not been processed yet string transactionModifiedBy; if (!TransactionManager.IsUnprocessed(transactionId, out transactionModifiedBy)) { if (!TransactionManager.IsUnprocessed(transactionId)) { LOG.Debug("Exiting ProcessNotifyTransaction(), transaction {0} has already been processed", transactionId); return; } } Activity activity = new Activity(NodeMethod.Notify, null, null, ActivityType.Info, transactionId, NetworkUtils.GetLocalIp(), "Start processing notify transaction: \"{0}\"", transactionId); activity.ModifiedById = transactionModifiedBy; try { TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Pending, "Processing notify transaction", false); // Get the document processing service // TODO: No documentService means failure? string flowName, operation; DataService notifyService = TransactionManager.GetNotifyDocumentServiceForTransaction(transactionId, out flowName, out operation); if (notifyService == null) { // Let notify pass through, even without a valid service, per Mark } else if (!notifyService.IsActive) { throw new ArgumentException(string.Format("The Notify service is not active for the flow \"{0}\"", flowName)); } if (notifyService == null) { activity.Append("No service found for Notify transaction"); TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.ReceivedUnprocessed, "Received unprocessed notify transaction", CommonTransactionStatusCode.Received, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); } else { INotifyProcessor plugin; using (IPluginDisposer disposer = PluginLoader.LoadNotifyProcessor(notifyService, out plugin)) { TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Processing, "Processing notify transaction", true); activity.Append("Set transaction status to Processing"); DateTime startTime = DateTime.Now; activity.AppendFormat("Processing Notify transaction for flow \"{0}\" and operation \"{1}\" using plugin \"{2}\"", flowName, operation, plugin.GetType().FullName); try { plugin.ProcessNotify(transactionId); } finally { activity.Append(plugin.GetAuditLogEvents()); } TimeSpan processLength = DateTime.Now - startTime; activity.AppendFormat("Process time: {0}", processLength.ToString()); } activity.Append("Finished processing notify transaction"); TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.Processed, "Finished processing notify transaction", CommonTransactionStatusCode.Received, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); } } catch (Exception e) { TransactionStatus transactionStatus = TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.Failed, e.Message, CommonTransactionStatusCode.Received, true); activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString()); activity.Append(ExceptionUtils.ToShortString(e)); activity.Type = ActivityType.Error; LOG.Error("ProcessNotifyTransaction() threw an exception.", e); } finally { ActivityManager.Log(activity); } } }