PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/Source/ResourceManagement.Client/WsTransfer/WsTransferClient.cs

#
C# | 221 lines | 197 code | 17 blank | 7 comment | 30 complexity | 4e1e778965e1f771ac89b6770a953dac 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 WsTransferClient : System.ServiceModel.ClientBase<IResource>, IResource
  12. {
  13. public WsTransferClient()
  14. : base()
  15. {
  16. }
  17. public WsTransferClient(string endpointConfigurationName) :
  18. base(endpointConfigurationName)
  19. {
  20. }
  21. public WsTransferClient(string endpointConfigurationName, string remoteAddress) :
  22. base(endpointConfigurationName, remoteAddress)
  23. {
  24. }
  25. public WsTransferClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
  26. base(endpointConfigurationName, remoteAddress)
  27. {
  28. }
  29. public WsTransferClient(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. try
  37. {
  38. Message ret = channel.Get(request);
  39. ((IDisposable)channel).Dispose();
  40. return ret;
  41. }
  42. catch (Exception)
  43. {
  44. if (((ICommunicationObject)channel).State == CommunicationState.Faulted)
  45. {
  46. ((ICommunicationObject)channel).Abort();
  47. }
  48. throw;
  49. }
  50. }
  51. public GetResponse Get(GetRequest request)
  52. {
  53. if (request == null)
  54. {
  55. throw new ArgumentNullException("request");
  56. }
  57. Message getRequest = null;
  58. bool isBaseObjectSearchRequest = false;
  59. lock (request)
  60. {
  61. if (request.BaseObjectSearchRequest == null || request.BaseObjectSearchRequest.AttributeTypes.Count == 0)
  62. {
  63. getRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.GetAction);
  64. }
  65. else
  66. {
  67. isBaseObjectSearchRequest = true;
  68. getRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.GetAction, request.BaseObjectSearchRequest, new ClientSerializer(typeof(BaseObjectSearchRequest)));
  69. ClientHelper.AddImdaHeaders(request as ImdaRequest, getRequest);
  70. }
  71. ClientHelper.AddRmHeaders(request as WsTransfer.TransferRequest, getRequest);
  72. }
  73. Message getResponse = Get(getRequest);
  74. if(getResponse.IsFault)
  75. {
  76. // handle fault will throw a .NET exception
  77. ClientHelper.HandleFault(getResponse);
  78. }
  79. GetResponse getResponseTyped = new GetResponse();
  80. if(isBaseObjectSearchRequest)
  81. {
  82. BaseObjectSearchResponse baseObjectSearchResponse = getResponse.GetBody<BaseObjectSearchResponse>(new ClientSerializer(typeof(BaseObjectSearchResponse)));
  83. getResponseTyped.BaseObjectSearchResponse = baseObjectSearchResponse;
  84. }
  85. else
  86. {
  87. // we manually construct the partial attributes as if the client had selected all attributes
  88. // the purpose is to unify the API of the get request
  89. XmlNode retObject = getResponse.GetBody<XmlNode>(new ClientSerializer(typeof(XmlNode)));
  90. Dictionary<String, List<XmlNode>> seenAttributes = new Dictionary<string, List<XmlNode>>();
  91. foreach (XmlNode child in retObject.ChildNodes)
  92. {
  93. if (child.NodeType == XmlNodeType.Element)
  94. {
  95. if (seenAttributes.ContainsKey(child.Name) == false)
  96. {
  97. seenAttributes[child.Name] = new List<XmlNode>();
  98. }
  99. seenAttributes[child.Name].Add(child);
  100. }
  101. }
  102. getResponseTyped.BaseObjectSearchResponse = new BaseObjectSearchResponse();
  103. foreach (KeyValuePair<String, List<XmlNode>> item in seenAttributes)
  104. {
  105. PartialAttributeType partialAttribute = new PartialAttributeType();
  106. partialAttribute.Values.AddRange(item.Value);
  107. getResponseTyped.BaseObjectSearchResponse.PartialAttributes.Add(partialAttribute);
  108. }
  109. }
  110. return getResponseTyped;
  111. }
  112. public Message Put(Message request)
  113. {
  114. IResource channel = base.ChannelFactory.CreateChannel();
  115. try
  116. {
  117. Message ret = channel.Put(request);
  118. ((IDisposable)channel).Dispose();
  119. return ret;
  120. }
  121. catch (Exception)
  122. {
  123. if (((ICommunicationObject)channel).State == CommunicationState.Faulted)
  124. {
  125. ((ICommunicationObject)channel).Abort();
  126. }
  127. throw;
  128. }
  129. }
  130. public PutResponse Put(PutRequest request)
  131. {
  132. if (request == null)
  133. {
  134. throw new ArgumentNullException("request");
  135. }
  136. if (request.ModifyRequest == null)
  137. {
  138. throw new ArgumentNullException("ModifyRequest");
  139. }
  140. if (request.ResourceReferenceProperty == null)
  141. {
  142. throw new ArgumentNullException("ResourceReferenceProperty");
  143. }
  144. Message putRequest = null;
  145. lock (request)
  146. {
  147. putRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.PutAction, request.ModifyRequest, new ClientSerializer(typeof(ModifyRequest)));
  148. ClientHelper.AddImdaHeaders(request as ImdaRequest, putRequest);
  149. ClientHelper.AddRmHeaders(request as WsTransfer.TransferRequest, putRequest);
  150. }
  151. Message putResponse = Put(putRequest);
  152. if (putResponse.IsFault)
  153. {
  154. ClientHelper.HandleFault(putResponse);
  155. }
  156. // the response has no information if it isn't a fault
  157. // PutResponse putResponseTyped = putResponse.GetBody<PutResponse>(new ClientSerializer(typeof(PutResponse)));
  158. return new PutResponse() ;
  159. }
  160. public Message Delete(Message request)
  161. {
  162. IResource channel = base.ChannelFactory.CreateChannel();
  163. try
  164. {
  165. Message ret = channel.Delete(request);
  166. ((IDisposable)channel).Dispose();
  167. return ret;
  168. }
  169. catch (Exception)
  170. {
  171. if (((ICommunicationObject)channel).State == CommunicationState.Faulted)
  172. {
  173. ((ICommunicationObject)channel).Abort();
  174. }
  175. throw;
  176. }
  177. }
  178. public DeleteResponse Delete(DeleteRequest request)
  179. {
  180. if (request == null)
  181. {
  182. throw new ArgumentNullException("request");
  183. }
  184. if (request.ResourceReferenceProperty == null)
  185. {
  186. throw new ArgumentNullException("ResourceReferenceProperty");
  187. }
  188. Message deleteRequest = null;
  189. lock (request)
  190. {
  191. deleteRequest = Message.CreateMessage(MessageVersion.Default, Constants.WsTransfer.DeleteAction, request, new ClientSerializer(typeof(DeleteRequest)));
  192. ClientHelper.AddRmHeaders(request as WsTransfer.TransferRequest, deleteRequest);
  193. }
  194. Message deleteResponse = Delete(deleteRequest);
  195. if (deleteResponse.IsFault)
  196. {
  197. ClientHelper.HandleFault(deleteResponse);
  198. }
  199. // the response has no information if it isn't a fault
  200. // return deleteResponse.GetBody<DeleteResponse>(new ClientSerializer(typeof(DeleteResponse)));
  201. return new DeleteResponse();
  202. }
  203. }
  204. }