public TransactionStatus Submit(AsyncComplexContent content, NamedEndpointVisit visit) { Activity activity = null; IList <string> newDocumentIds = null; bool isNewTransaction = false; try { // Validate inputs NodeVisit nodeVisit; MakeEndpointActivity(visit, ActivityType.Audit, NodeMethod.Submit, out nodeVisit, out activity); if (content == null) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter, "Input content is null"); } if (CollectionUtils.IsNullOrEmpty(content.Documents)) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter, "Input document list is empty"); } if (content.Transaction == null) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter, "Input transaction is null"); } if ((content.Flow == null) || string.IsNullOrEmpty(content.Flow.FlowName)) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter, "Input flow is null"); } bool isFlowProtected; string flowId = FlowManager.GetDataFlowIdByName(content.Flow.FlowName, out isFlowProtected); if (flowId == null) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidDataflow, "Flow \"{0}\" was not found", content.Flow.FlowName); } activity.FlowName = content.Flow.FlowName; activity.Operation = content.Flow.Operation; isNewTransaction = string.IsNullOrEmpty(content.Transaction.Id); string networkId = null; // Get the flow id associated with the transaction if (isNewTransaction) { } else { // Existing transaction isNewTransaction = ValidateTransaction(visit.Version, NodeMethod.Submit, content, (visit.Version != EndpointVersionType.EN11), flowId, out networkId); if (!isNewTransaction) { activity.TransactionId = content.Transaction.Id; } } DataService documentService = FlowManager.GetSubmitDocumentServiceForFlow(flowId, content.Flow.Operation); if (documentService == null) { if (!string.IsNullOrEmpty(content.Flow.Operation)) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_ServiceUnavailable, "A valid Submit service was not found for the flow \"{0}\"", content.Flow.FlowName); } // Let empty operation pass through, even without a valid service, per Mark } else if (!documentService.IsActive) { throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_ServiceUnavailable, "The Submit service is not active for the flow \"{0}\"", content.Flow.FlowName); } if (isFlowProtected) { ValidateUserPermissions(nodeVisit, content.Flow.FlowName, content.Flow.Operation, NodeMethod.Submit, activity); } if (isNewTransaction) { // Create a new transaction content.Transaction.Id = TransactionManager.CreateTransaction(NodeMethod.Submit, visit.Version, flowId, content.Flow.Operation, nodeVisit.Account.Id, CommonTransactionStatusCode.Unknown, null, content.Notifications, content.Recipients, false); activity.TransactionId = content.Transaction.Id; if (networkId != null) { TransactionManager.SetNetworkId(content.Transaction.Id, networkId, EndpointVersionType.Undefined, null, null, null); } activity.AppendFormat("Created new submit transaction id: {0}.", activity.TransactionId); } else { activity.AppendFormat("Retrieved existing submit transaction id: {0}.", activity.TransactionId); } foreach (Document document in content.Documents) { activity.AppendFormat("Adding submit document to transaction: {0}.", document); } // Add the documents to repository and DB newDocumentIds = DocumentManager.AddDocuments(content.Transaction.Id, content.Documents); #if DEBUG //NodeTransaction nodeTransaction = TransactionManager.GetTransaction(content.Transaction.Id, // CommonTransactionStatusCode.Received); #endif // DEBUG TransactionStatus rtnTransactionStatus = TransactionManager.SetTransactionStatus(content.Transaction.Id, nodeVisit.Account.Id, CommonTransactionStatusCode.Received, null, false); NotificationManager.DoSubmitNotifications(rtnTransactionStatus, flowId, content.Flow.FlowName, content.Flow.Operation, nodeVisit.Account.NaasAccount); SubmitProcessor.Wakeup(); return(rtnTransactionStatus); } catch (Exception ex) { if (newDocumentIds != null) { DocumentManager.RollbackDocuments(content.Transaction.Id, newDocumentIds); } if (isNewTransaction && !string.IsNullOrEmpty(content.Transaction.Id)) { TransactionManager.SetTransactionStatusNoThrow(content.Transaction.Id, CommonTransactionStatusCode.Failed, ex.Message, false); } if (activity != null) { activity.Append(ExceptionUtils.ToShortString(ex)); activity.Type = ActivityType.Error; } if (ex is SoapException) { throw; // Throw directly since already SoapException } else { throw FaultProvider.GetFault(visit.Version, ex); } } finally { if (activity != null) { ActivityManager.Log(activity); } } }