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

/Source/ResourceManagement.Client/WsTransfer/AlternateClient.cs

#
C# | 181 lines | 157 code | 17 blank | 7 comment | 24 complexity | 8490ee119bb576c2c892a622e5af995c MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ServiceModel;
  4. using System.ServiceModel.Channels;
  5. using System.Xml;
  6. using Microsoft.ResourceManagement.Client.WsTransfer;
  7. using Microsoft.ResourceManagement.Client.Faults;
  8. using System.Text;
  9. namespace Microsoft.ResourceManagement.Client.WsTransfer
  10. {
  11. public class AlternateClient : System.ServiceModel.ClientBase<IAlternate>, IAlternate
  12. {
  13. public AlternateClient()
  14. : base()
  15. {
  16. }
  17. public AlternateClient(string endpointConfigurationName) :
  18. base(endpointConfigurationName)
  19. {
  20. }
  21. public AlternateClient(string endpointConfigurationName, string remoteAddress) :
  22. base(endpointConfigurationName, remoteAddress)
  23. {
  24. }
  25. public AlternateClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
  26. base(endpointConfigurationName, remoteAddress)
  27. {
  28. }
  29. public AlternateClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
  30. base(binding, remoteAddress)
  31. {
  32. }
  33. public Message Get(Message request)
  34. {
  35. IResource channel = base.ChannelFactory.CreateChannel();
  36. return channel.Get(request);
  37. }
  38. public GetResponse Get(GetRequest request)
  39. {
  40. if (request == null)
  41. {
  42. throw new ArgumentNullException("request");
  43. }
  44. Message getRequest = null;
  45. bool isBaseObjectSearchRequest = false;
  46. lock (request)
  47. {
  48. if (request.BaseObjectSearchRequest == null || request.BaseObjectSearchRequest.AttributeTypes.Count == 0)
  49. {
  50. getRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.GetAction);
  51. }
  52. else
  53. {
  54. isBaseObjectSearchRequest = true;
  55. getRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.GetAction, request.BaseObjectSearchRequest, new ClientSerializer(typeof(BaseObjectSearchRequest)));
  56. ClientHelper.AddImdaHeaders(request as ImdaRequest, getRequest);
  57. }
  58. ClientHelper.AddRmHeaders(request as WsTransfer.TransferRequest, getRequest);
  59. }
  60. Message getResponse = Get(getRequest);
  61. if(getResponse.IsFault)
  62. {
  63. // handle fault will throw a .NET exception
  64. ClientHelper.HandleFault(getResponse);
  65. }
  66. GetResponse getResponseTyped = new GetResponse();
  67. if(isBaseObjectSearchRequest)
  68. {
  69. BaseObjectSearchResponse baseObjectSearchResponse = getResponse.GetBody<BaseObjectSearchResponse>(new ClientSerializer(typeof(BaseObjectSearchResponse)));
  70. getResponseTyped.BaseObjectSearchResponse = baseObjectSearchResponse;
  71. }
  72. else
  73. {
  74. // we manually construct the partial attributes as if the client had selected all attributes
  75. // the purpose is to unify the API of the get request
  76. XmlNode retObject = getResponse.GetBody<XmlNode>(new ClientSerializer(typeof(XmlNode)));
  77. Dictionary<String, List<XmlNode>> seenAttributes = new Dictionary<string, List<XmlNode>>();
  78. foreach (XmlNode child in retObject.ChildNodes)
  79. {
  80. if (child.NodeType == XmlNodeType.Element)
  81. {
  82. if (seenAttributes.ContainsKey(child.Name) == false)
  83. {
  84. seenAttributes[child.Name] = new List<XmlNode>();
  85. }
  86. seenAttributes[child.Name].Add(child);
  87. }
  88. }
  89. getResponseTyped.BaseObjectSearchResponse = new BaseObjectSearchResponse();
  90. foreach (KeyValuePair<String, List<XmlNode>> item in seenAttributes)
  91. {
  92. PartialAttributeType partialAttribute = new PartialAttributeType();
  93. partialAttribute.Values.AddRange(item.Value);
  94. }
  95. }
  96. return getResponseTyped;
  97. }
  98. public Message Put(Message request)
  99. {
  100. IResource channel = base.ChannelFactory.CreateChannel();
  101. return channel.Put(request);
  102. }
  103. public PutResponse Put(PutRequest request)
  104. {
  105. if (request == null)
  106. {
  107. throw new ArgumentNullException("request");
  108. }
  109. if (request.ModifyRequest == null)
  110. {
  111. throw new ArgumentNullException("ModifyRequest");
  112. }
  113. if (request.ResourceReferenceProperty == null)
  114. {
  115. throw new ArgumentNullException("ResourceReferenceProperty");
  116. }
  117. Message putRequest = null;
  118. lock (request)
  119. {
  120. putRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.PutAction, request.ModifyRequest, new ClientSerializer(typeof(ModifyRequest)));
  121. ClientHelper.AddImdaHeaders(request as ImdaRequest, putRequest);
  122. ClientHelper.AddRmHeaders(request as WsTransfer.TransferRequest, putRequest);
  123. }
  124. Message putResponse = Put(putRequest);
  125. if (putResponse.IsFault)
  126. {
  127. ClientHelper.HandleFault(putResponse);
  128. }
  129. // the response has no information if it isn't a fault
  130. // PutResponse putResponseTyped = putResponse.GetBody<PutResponse>(new ClientSerializer(typeof(PutResponse)));
  131. return new PutResponse() ;
  132. }
  133. public Message Delete(Message request)
  134. {
  135. IResource channel = base.ChannelFactory.CreateChannel();
  136. return channel.Delete(request);
  137. }
  138. public DeleteResponse Delete(DeleteRequest request)
  139. {
  140. if (request == null)
  141. {
  142. throw new ArgumentNullException("request");
  143. }
  144. if (request.ResourceReferenceProperty == null)
  145. {
  146. throw new ArgumentNullException("ResourceReferenceProperty");
  147. }
  148. Message deleteRequest = null;
  149. lock (request)
  150. {
  151. deleteRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.DeleteAction, request, new ClientSerializer(typeof(DeleteRequest)));
  152. ClientHelper.AddRmHeaders(request as WsTransfer.TransferRequest, deleteRequest);
  153. }
  154. Message deleteResponse = Delete(deleteRequest);
  155. if (deleteResponse.IsFault)
  156. {
  157. ClientHelper.HandleFault(deleteResponse);
  158. }
  159. // the response has no information if it isn't a fault
  160. // return deleteResponse.GetBody<DeleteResponse>(new ClientSerializer(typeof(DeleteResponse)));
  161. return new DeleteResponse();
  162. }
  163. }
  164. }