public CreateOutputResponse CreateOutput(CreateOutputRequest request) { lock (_createOutputActionLock) { if (_createOutputAction == null) { _createOutputAction = PolicyInjection.Create <CreateOutputAction>(); } } CreateOutputResultCollection result = _createOutputAction.Execute(request.CreateOutputParametersCollection); CreateOutputResponse response = new CreateOutputResponse(); response.CreateOutputResult = result; return(response); }
private void UpdateDb(string omId, double printJobId, string almId, string fallback, CreateOutputResultCollection createOutputResultCollection) { StartTransaction(); try { string outputJobIdentity = string.Empty; string printerName = string.Empty; string printerId = string.Empty; bool isError = false; bool isErrorOnDocument = false; if (!string.IsNullOrEmpty(almId)) { isError = true; } if (createOutputResultCollection != null) { foreach (CreateOutputResult createOutputResult in createOutputResultCollection) { const string DocumentTypeIDKey = "DOCTYPE"; const string SubDocumentTypeIDKey = "SUBDOCTYPE"; const string PrinterIDKey = "PRINTERID"; const string TerminalIDKey = "TERMINALID"; const string PrinterDeviceNameKey = "PRINTERNAME"; const string UserIDKey = "USERID"; const string NumberOfCopiesKey = "NUMCOPIES"; const string ReportIDKey = "REPORTID"; const string BinaryResultKey = "BINARY"; outputJobIdentity = createOutputResult.OutputJobIdentity; int jobIndentity; if (!int.TryParse(outputJobIdentity, out jobIndentity)) { jobIndentity = 0; } int outputJobSequenceNumber = createOutputResult.OutputJobSequenceNumber; byte[] PDF = null; string docTyp = string.Empty; string docSubTyp = string.Empty; string terId = string.Empty; string numberOfCopies = string.Empty; string reportId = string.Empty; string empId = string.Empty; int noCopies = 0; isErrorOnDocument = false; string errorData = createOutputResult.ErrorDescription; if (!string.IsNullOrEmpty(errorData)) { almId = "OMS001"; isError = true; isErrorOnDocument = true; } foreach (CreateOutputResultProperty createOutputResultProperty in createOutputResult.ResultProperties) { if (createOutputResultProperty.PropertyName.Equals(BinaryResultKey)) { PDF = (byte[])createOutputResultProperty.PropertyValue; } if (createOutputResultProperty.PropertyName.Equals(PrinterDeviceNameKey)) { printerName = createOutputResultProperty.PropertyValue.ToString(); } if (createOutputResultProperty.PropertyName.Equals(PrinterIDKey)) { printerId = createOutputResultProperty.PropertyValue.ToString(); } if (createOutputResultProperty.PropertyName.Equals(TerminalIDKey)) { terId = createOutputResultProperty.PropertyValue.ToString(); } if (createOutputResultProperty.PropertyName.Equals(UserIDKey)) { empId = createOutputResultProperty.PropertyValue.ToString(); } if (createOutputResultProperty.PropertyName.Equals(NumberOfCopiesKey)) { numberOfCopies = createOutputResultProperty.PropertyValue.ToString(); if (!int.TryParse(numberOfCopies, out noCopies)) { noCopies = 0; } } if (createOutputResultProperty.PropertyName.Equals(DocumentTypeIDKey)) { docTyp = createOutputResultProperty.PropertyValue.ToString(); } if (createOutputResultProperty.PropertyName.Equals(SubDocumentTypeIDKey)) { docSubTyp = createOutputResultProperty.PropertyValue.ToString(); } if (createOutputResultProperty.PropertyName.Equals(ReportIDKey)) { reportId = createOutputResultProperty.PropertyValue.ToString(); } } /* uppdatera PrintQueeDocument */ if (isErrorOnDocument) { _printQueue.PrintDocError(printJobId, outputJobSequenceNumber, errorData, PDF, docTyp, docSubTyp, terId, printerId, printerName, empId, noCopies, reportId); } else { _printQueue.PrintDocFinished(printJobId, outputJobSequenceNumber, PDF, docTyp, docSubTyp, terId, printerId, printerName, empId, noCopies, reportId); } } } if (!isError) { _printQueue.PrintFinished(printJobId, omId, fallback); } else { _printQueue.PrintError(printJobId, almId, fallback); } Commit(); } catch (Exception ex) { Rollback(); Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error updating database for Job: {0}\r\n{1}", printJobId, ex.Message)); } }
private void SendPrintJob(double printJobId, CreateOutputParametersCollection documentCollection, string omId, string urlMain, string fallbackUrl) { string almId = string.Empty; string currentUrl = string.Empty; string fallback = "0"; CreateOutputResultCollection createOutputResultCollection = null; OutputManagerService.OutputHandlerServiceClient client = null; List <string> urls = new List <string>() { urlMain }; if (!string.IsNullOrEmpty(fallbackUrl)) { urls.Add(fallbackUrl); } try { int iteration = 0; client = new OutputManagerService.OutputHandlerServiceClient(_endpointName); while (iteration < urls.Count) { almId = string.Empty; if (client.State != CommunicationState.Created) { try { client.Close(); } catch { try { client.Abort(); } catch { } } client = new OutputManagerService.OutputHandlerServiceClient(_endpointName); } try { if (iteration == 1) { fallback = "1"; } currentUrl = urls[iteration]; Tracing.TraceEvent(TraceEventType.Verbose, 0, String.Format("Sending print job {0} to {1}...", printJobId, currentUrl)); EndpointAddress currentEndpoint = client.Endpoint.Address; EndpointAddress address = new EndpointAddress(new Uri(currentUrl), currentEndpoint.Identity, currentEndpoint.Headers); client.Endpoint.Address = address; createOutputResultCollection = client.CreateOutput(documentCollection); iteration = urls.Count; Tracing.TraceEvent(TraceEventType.Verbose, 0, String.Format("Dequeuing print job {0} to {1}...", printJobId, currentUrl)); } catch (UriFormatException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Incorrect Url format: job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS002"; iteration++; } catch (ActionNotSupportedException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS003"; iteration++; } catch (ServerTooBusyException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS004"; iteration++; } catch (EndpointNotFoundException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS005"; iteration++; } catch (CommunicationException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS006"; iteration++; } catch (ArgumentException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS007"; iteration++; } catch (TimeoutException ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS008"; iteration = urls.Count; //Do not use fallback for Timeout. To avoid double print outs. } catch (Exception ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message)); almId = "OMS009"; iteration++; } } } catch (Exception ex) { Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} \r\n\r\n{1}\r\n\r\n", printJobId, ex.Message)); almId = "OMS010"; } finally { if (_jobsPerOMCounter.ContainsKey(omId)) { _jobsPerOMCounter[omId]--; } if (client.State == CommunicationState.Opened || client.State == CommunicationState.Opening) { try { client.Close(); } catch { try { client.Abort(); } catch { } } } lock (_printQueue) { UpdateDb(omId, printJobId, almId, fallback, createOutputResultCollection); } _totalNumOfConcurrentJobs--; } }
public CreateOutputResultCollection Execute(CreateOutputParametersCollection parameters) { List <OutputDocument> documentsToExecute = new List <OutputDocument>(); List <OutputDocument> documentsNotExecuted = new List <OutputDocument>(); foreach (CreateOutputParameters parameter in parameters) { OutputDocument newDoc = new OutputDocument(); newDoc.OutputJobId = parameter.OutputJobIdentity; newDoc.OutputJobSequence = parameter.OutputJobSequenceNumber; XmlDocument doc = new XmlDocument(); doc.LoadXml(parameter.OutputXML); newDoc.MetaParameters = new Dictionary <string, string>(); newDoc.Parameters = new Dictionary <string, string>(); newDoc.Data = new MemoryStream(); StreamWriter writer = new StreamWriter(newDoc.Data); writer.Write(parameter.OutputXML); writer.Flush(); for (int i = 0; i < doc.ChildNodes.Count; i++) { if (doc.ChildNodes[i].NodeType == XmlNodeType.Element) { newDoc.MetaParameters.Add(StdMetaParamNames.DocumentIDKey, doc.ChildNodes[i].Name); foreach (XmlNode node in doc.ChildNodes[i].ChildNodes) { switch (node.Name) { case "MetaData": foreach (XmlAttribute attribute in node.Attributes) { newDoc.MetaParameters.Add(attribute.Name.ToUpper(), attribute.Value.Trim()); } break; case "Data": break; case "Parameters": foreach (XmlNode paramNode in node.ChildNodes) { if (paramNode.Name == "Parameter") { newDoc.Parameters.Add(paramNode.Attributes["name"].Value, paramNode.Attributes["value"].Value); } } break; } } } } //Get configuration string configErrorText; if (newDoc.MetaParameters.ContainsKey(StdMetaParamNames.DocumentTypeIDKey) && newDoc.MetaParameters.ContainsKey(StdMetaParamNames.SubDocumentTypeIDKey) && newDoc.MetaParameters.ContainsKey(StdMetaParamNames.TerminalIDKey) && newDoc.MetaParameters.ContainsKey(StdMetaParamNames.PrinterIDKey)) { string reportID; byte[] reportFile; string printerDeviceName; string printerID; List <string> adapterIDs; adapterIDs = _configDataHandler.GetAdapterID_PrinterDeviceName_PrinterID_ReportID_ReportFile(newDoc.MetaParameters[StdMetaParamNames.TerminalIDKey] , newDoc.MetaParameters[StdMetaParamNames.DocumentTypeIDKey] , newDoc.MetaParameters[StdMetaParamNames.SubDocumentTypeIDKey] , newDoc.MetaParameters[StdMetaParamNames.PrinterIDKey] , out printerID, out printerDeviceName, out reportID, out reportFile, out configErrorText); newDoc.AdapterIDs = adapterIDs; newDoc.PrinterID = printerID; newDoc.PrinterDeviceName = printerDeviceName; newDoc.ReportID = reportID; newDoc.ReportFile = reportFile; } else { configErrorText = "\r\n\r\nDocument Type, Sub Document Type, TerminalID or PrinterID are missing from the document meta data."; } if (string.IsNullOrEmpty(configErrorText)) { string nonExistingAdapters = string.Empty; bool allAdaptersExists = true; foreach (string adapterId in newDoc.AdapterIDs) { if (!_adapters.ContainsKey(adapterId)) { allAdaptersExists = false; nonExistingAdapters += " [" + adapterId + "] "; } } if (allAdaptersExists) { documentsToExecute.Add(newDoc); } else { newDoc.ErrorDescription = "Adapter(s):" + nonExistingAdapters + "do not exsist."; documentsNotExecuted.Add(newDoc); } } else { newDoc.ErrorDescription += configErrorText; documentsNotExecuted.Add(newDoc); } } Dictionary <string, int> numOfDocsPerPrinter = new Dictionary <string, int>(); List <string> usedAdapters = new List <string>(); foreach (OutputDocument doc in documentsToExecute) { //Collect the printers used. if (numOfDocsPerPrinter.ContainsKey(doc.PrinterDeviceName)) { numOfDocsPerPrinter[doc.PrinterDeviceName]++; } else { numOfDocsPerPrinter.Add(doc.PrinterDeviceName, 1); } //Get all adapters used in job foreach (string adapterId in doc.AdapterIDs) { if (!usedAdapters.Contains(adapterId)) { usedAdapters.Add(adapterId); } } } //Set sufficient adapter locks foreach (string adapterId in usedAdapters) { AcquireLock(adapterId, false, _adapterLockDictionary); } try { //Set sufficient printer locks foreach (string printerDeviceName in numOfDocsPerPrinter.Keys) { bool exclusive = (numOfDocsPerPrinter[printerDeviceName] > 1); AcquireLock(printerDeviceName, exclusive, _printerLockDictionary); } try { CreateOutputResultCollection resultCollection = new CreateOutputResultCollection(); //Process each document foreach (OutputDocument doc in documentsToExecute) { Dictionary <string, object> results = new Dictionary <string, object>(); try { //Adding overall results results.Add(StdResultParamNames.PrinterDeviceNameKey, doc.PrinterDeviceName); results.Add(StdResultParamNames.ReportIDKey, doc.ReportID); results.Add(StdResultParamNames.PrinterIDKey, doc.PrinterID); if (doc.MetaParameters.ContainsKey(StdMetaParamNames.UserIdentityKey)) { results.Add(StdResultParamNames.UserIDKey, doc.MetaParameters[StdMetaParamNames.UserIdentityKey]); } results.Add(StdResultParamNames.TerminalIDKey, doc.MetaParameters[StdMetaParamNames.TerminalIDKey]); if (doc.MetaParameters.ContainsKey(StdMetaParamNames.NumberOfCopiesKey)) { results.Add(StdResultParamNames.NumberOfCopiesKey, doc.MetaParameters[StdMetaParamNames.NumberOfCopiesKey]); } results.Add(StdResultParamNames.SubDocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.SubDocumentTypeIDKey]); results.Add(StdResultParamNames.DocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.DocumentTypeIDKey]); foreach (string adapterId in doc.AdapterIDs) { Dictionary <string, object> adapterResults = _adapters[adapterId].Execute(doc, results); if (results.Count == 0) { results = adapterResults; } else { foreach (string key in adapterResults.Keys) { if (results.ContainsKey(key)) { results[key] = adapterResults[key]; } else { results.Add(key, adapterResults[key]); } } } } doc.Data.Close(); } catch (Exception ex) { doc.ErrorDescription += "\r\nError while executing adapters.\r\n" + ex.Message; } CreateOutputResult documentResult = new CreateOutputResult(); documentResult.OutputJobIdentity = doc.OutputJobId; documentResult.OutputJobSequenceNumber = doc.OutputJobSequence; documentResult.ErrorDescription = doc.ErrorDescription; documentResult.ResultProperties = new List <CreateOutputResultProperty>(); foreach (KeyValuePair <string, object> result in results) { CreateOutputResultProperty resultProperty = new CreateOutputResultProperty(result.Key, result.Value); documentResult.ResultProperties.Add(resultProperty); } resultCollection.Add(documentResult); } //Return error for non processed documents foreach (OutputDocument doc in documentsNotExecuted) { CreateOutputResult documentResult = new CreateOutputResult(); documentResult.OutputJobIdentity = doc.OutputJobId; documentResult.OutputJobSequenceNumber = doc.OutputJobSequence; documentResult.ErrorDescription = doc.ErrorDescription; documentResult.ResultProperties = new List <CreateOutputResultProperty>(); //Adding overall results documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.PrinterIDKey, doc.PrinterID)); documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.PrinterDeviceNameKey, doc.PrinterDeviceName)); documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.ReportIDKey, doc.ReportID)); if (doc.MetaParameters.ContainsKey(StdMetaParamNames.UserIdentityKey)) { documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.UserIDKey, doc.MetaParameters[StdMetaParamNames.UserIdentityKey])); } if (doc.MetaParameters.ContainsKey(StdMetaParamNames.TerminalIDKey)) { documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.TerminalIDKey, doc.MetaParameters[StdMetaParamNames.TerminalIDKey])); } if (doc.MetaParameters.ContainsKey(StdMetaParamNames.NumberOfCopiesKey)) { documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.NumberOfCopiesKey, doc.MetaParameters[StdMetaParamNames.NumberOfCopiesKey])); } if (doc.MetaParameters.ContainsKey(StdMetaParamNames.SubDocumentTypeIDKey)) { documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.SubDocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.SubDocumentTypeIDKey])); } if (doc.MetaParameters.ContainsKey(StdMetaParamNames.DocumentTypeIDKey)) { documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.DocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.DocumentTypeIDKey])); } resultCollection.Add(documentResult); } return(resultCollection); } finally { //Release printer locks foreach (string printerDeviceName in numOfDocsPerPrinter.Keys) { bool exclusive = (numOfDocsPerPrinter[printerDeviceName] > 1); ReleaseLock(printerDeviceName, exclusive, _printerLockDictionary); } } } finally { foreach (string adapterId in usedAdapters) { ReleaseLock(adapterId, false, _adapterLockDictionary); } } }