PageRenderTime 50ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/Atlassian.Jira/Remote/RemoteWorklogPatchBehavior.cs

https://bitbucket.org/gassies/atlassian.net-sdk
C# | 92 lines | 78 code | 14 blank | 0 comment | 8 complexity | 5f1d0d014c3aa92ec946c6debfeed68c MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel.Description;
  6. using System.ServiceModel.Dispatcher;
  7. using System.IO;
  8. using System.Xml;
  9. using System.ServiceModel.Channels;
  10. using System.ServiceModel;
  11. namespace Atlassian.Jira.Remote
  12. {
  13. internal class RemoteWorklogPatchBehavior : IEndpointBehavior
  14. {
  15. public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
  16. {
  17. }
  18. public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
  19. {
  20. clientRuntime.MessageInspectors.Add(new RemoteWorklogMessageInspector());
  21. }
  22. public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
  23. {
  24. }
  25. public void Validate(ServiceEndpoint endpoint)
  26. {
  27. }
  28. private class RemoteWorklogMessageInspector : IClientMessageInspector
  29. {
  30. private static string _correlationState = "worklog";
  31. public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
  32. {
  33. if(correlationState != null
  34. && String.Equals(correlationState, _correlationState)
  35. && !reply.ToString().Contains("<soapenv:Fault>"))
  36. {
  37. var memoryStream = new MemoryStream();
  38. var writer = XmlWriter.Create(memoryStream);
  39. reply.WriteMessage(writer);
  40. writer.Flush();
  41. memoryStream.Position = 0;
  42. var doc = new XmlDocument();
  43. doc.Load(memoryStream);
  44. UpdateMessage(doc);
  45. memoryStream.SetLength(0);
  46. writer = XmlWriter.Create(memoryStream);
  47. doc.WriteTo(writer);
  48. writer.Flush();
  49. memoryStream.Position = 0;
  50. var reader = XmlReader.Create(memoryStream);
  51. reply = Message.CreateMessage(reader, int.MaxValue, reply.Version);
  52. }
  53. }
  54. private void UpdateMessage(XmlDocument doc)
  55. {
  56. var ns = new XmlNamespaceManager(doc.NameTable);
  57. ns.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
  58. foreach(XmlElement multiRefElement in doc.SelectNodes("//soapenv:Body/multiRef", ns))
  59. {
  60. multiRefElement.SetAttribute("xsi:type", "ns2:RemoteWorklog");
  61. multiRefElement.SetAttribute("xmlns:ns2", "http://beans.soap.rpc.jira.atlassian.com");
  62. }
  63. }
  64. public object BeforeSendRequest(ref Message request, IClientChannel channel)
  65. {
  66. var requestContent = request.ToString();
  67. if (requestContent.Contains("addWorklogAndAutoAdjustRemainingEstimate")
  68. || requestContent.Contains("addWorklogAndRetainRemainingEstimate")
  69. || requestContent.Contains("addWorklogWithNewRemainingEstimate")
  70. || requestContent.Contains("getWorklogs"))
  71. {
  72. return _correlationState;
  73. }
  74. return null;
  75. }
  76. }
  77. }
  78. }