private string JsonToXml(Example currentExample, ResourceNode resourceTree, string json) { string xml = null; MethodInfo method = resourceTree.Find(currentExample.ClassName, currentExample.MethodName).Method; MethodDocumentationAttribute attribute = method.GetCustomAttributes<MethodDocumentationAttribute>().FirstOrDefault(); if (attribute != null) { Type objectType = null; if (currentExample.ExampleType == TMessageType.Request) { objectType = GetObjectType(attribute.RequestTypes, currentExample); } else { objectType = GetObjectType(attribute.ResponseTypes, currentExample); } if (objectType != null) { try { object deserialisedObject = JsonConvert.DeserializeObject(json, objectType); Stream stream = new MemoryStream(); XmlSerializer serializer = new XmlSerializer(objectType); XmlSerializerNamespaces xns = new XmlSerializerNamespaces(); xns.Add(string.Empty, string.Empty); serializer.Serialize(stream, deserialisedObject, xns); stream.Position = 0; using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { reader.ReadLine(); // skip <?xml version="1.0"?> xml = reader.ReadToEnd().Replace("+json", "+xml"); } } catch (InvalidOperationException) { SerialisationLog.Warning(string.Concat("Failed to serialise XML example for ", currentExample.ClassName, ".", currentExample.MethodName)); } catch (Exception ex) { if (ex is JsonReaderException || ex is JsonSerializationException) { SerialisationLog.Warning(string.Concat("Failed to deserialise JSON example for ", currentExample.ClassName, ".", currentExample.MethodName)); } else { throw; } } } else { SerialisationLog.Warning(string.Concat("No ", currentExample.ExampleType.ToString().ToLower(), " type for ", currentExample.ClassName, ".", currentExample.MethodName)); } } else { SerialisationLog.Warning(string.Concat("Could not convert JSON example to XML due to no method documentation for ", currentExample.ClassName, ".", currentExample.MethodName)); } return xml; }
private Type GetObjectType(Type[] types, Example example) { Type matchingType = null; if (types != null) { if (types.Length == 1) { matchingType = types[0]; } else { if (example.MimeType != null) { foreach (Type type in types) { if (type.GetCustomAttributes<ContentTypeAttribute>().Any(a => a.ContentType.Equals(example.MimeType))) { matchingType = type; break; } } } if (matchingType == null) { SerialisationLog.Warning(string.Concat("There are multiple request or response types for ", example.ClassName, ".", example.MethodName, " ", example.ExampleType, " but no mimetype specified in the example tag in ", example.DocFilename)); } } } return matchingType; }
public void ReadExamples(string baseDirectory, string filename, ResourceNode resourceTree) { Example currentExample = null; StringBuilder currentExampleBody = null; TDataExchangeFormat currentExampleFormat = TDataExchangeFormat.None; bool inExample = false; string lastHeading = null; bool generateXml = true; foreach (string line in File.ReadLines(filename)) { string trimmed = line.Trim(); if (trimmed.StartsWith("#")) { lastHeading = trimmed.Replace("#", "").Trim().Replace(" ", "-").ToLower(); } else if (trimmed.StartsWith("[]: [!generateXml]")) { generateXml = false; } if (trimmed.StartsWith("```")) { if (currentExample != null) { string exampleFormat = trimmed.Substring("```".Length); if (exampleFormat.Equals(TDataExchangeFormat.Json.ToString().ToLower())) { currentExampleFormat = TDataExchangeFormat.Json; inExample = true; } else if (exampleFormat.Equals(FORM_EXAMPLE)) { currentExampleFormat = TDataExchangeFormat.FormUrlEncoded; inExample = true; } else if (inExample && exampleFormat.Length == 0) { if (currentExampleFormat == TDataExchangeFormat.FormUrlEncoded) { currentExample.Content.Add(currentExampleFormat, currentExampleBody.ToString()); } else { currentExample.Content.Add(TDataExchangeFormat.Json, currentExampleBody.ToString()); if (generateXml) { currentExample.Content.Add(TDataExchangeFormat.Xml, JsonToXml(currentExample, resourceTree, currentExampleBody.ToString())); } } currentExample = null; inExample = false; generateXml = true; } } } else { if (inExample) { if (line.Trim().Length > 0) { currentExampleBody.Append(line);// string.Concat(line, "\r\n")); } } else { MatchCollection matches = EXAMPLE_NAME_REGEX.Matches(trimmed); if (matches.Count == 1) { string fullExampleName = matches[0].Value; string prefix = "[]: ["; string suffix = "]"; string withoutSquareBrackets = fullExampleName.Substring(prefix.Length, matches[0].Value.Length - prefix.Length - suffix.Length); string[] parts = withoutSquareBrackets.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); string className = parts[0]; string methodName = parts[1]; string mimeType = trimmed.Substring(fullExampleName.Length); if (mimeType.Length > 0) { if (mimeType.StartsWith("[") && mimeType.EndsWith("]")) { mimeType = mimeType.Substring(1, mimeType.Length - 2); } else { SerialisationLog.Warning(string.Concat("Invalid mimetype on example tag: ", trimmed, " in ", filename)); mimeType = ""; } } if (resourceTree.Find(className, methodName) != null) { TMessageType messageType = (TMessageType)Enum.Parse(typeof(TMessageType), parts[2]); string exampleFilename = filename.Substring(baseDirectory.Length); currentExample = new Example(exampleFilename, lastHeading, className, methodName, messageType, mimeType); currentExampleBody = new StringBuilder(); string key = string.Concat(currentExample.ClassName, currentExample.MethodName, currentExample.ExampleType.ToString(), mimeType); if (!_Examples.ContainsKey(key)) { _Examples.Add(key, currentExample); } else { SerialisationLog.Error(string.Concat("An example already exists for ", currentExample.ClassName, ".", currentExample.MethodName, ".", currentExample.ExampleType.ToString(), "files: [", currentExample.DocFilename, ", ", _Examples[key].DocFilename, "]")); } } else { SerialisationLog.Error(string.Concat("The method ", className, ".", methodName, " in ", filename, " does not exist")); } } } } } }
public void ReadExamples(string baseDirectory, string filename, ResourceNode resourceTree) { Example currentExample = null; StringBuilder currentExampleBody = null; TDataExchangeFormat currentExampleFormat = TDataExchangeFormat.None; bool inExample = false; string lastHeading = null; bool generateXml = true; foreach (string line in File.ReadLines(filename)) { string trimmed = line.Trim(); if (trimmed.StartsWith("#")) { lastHeading = trimmed.Replace("#", "").Trim().Replace(" ", "-").ToLower(); } else if (trimmed.StartsWith("[]: [!generateXml]")) { generateXml = false; } if (trimmed.StartsWith("```")) { if (currentExample != null) { string exampleFormat = trimmed.Substring("```".Length); if (exampleFormat.Equals(TDataExchangeFormat.Json.ToString().ToLower())) { currentExampleFormat = TDataExchangeFormat.Json; inExample = true; } else if (exampleFormat.Equals(FORM_EXAMPLE)) { currentExampleFormat = TDataExchangeFormat.FormUrlEncoded; inExample = true; } else if (inExample && exampleFormat.Length == 0) { if (currentExampleFormat == TDataExchangeFormat.FormUrlEncoded) { currentExample.Content.Add(currentExampleFormat, currentExampleBody.ToString()); } else { currentExample.Content.Add(TDataExchangeFormat.Json, currentExampleBody.ToString()); if (generateXml) currentExample.Content.Add(TDataExchangeFormat.Xml, JsonToXml(currentExample, resourceTree, currentExampleBody.ToString())); } currentExample = null; inExample = false; generateXml = true; } } } else { if (inExample) { if (line.Trim().Length > 0) { currentExampleBody.Append(line);// string.Concat(line, "\r\n")); } } else { MatchCollection matches = EXAMPLE_NAME_REGEX.Matches(trimmed); if (matches.Count == 1) { string fullExampleName = matches[0].Value; string prefix = "[]: ["; string suffix = "]"; string withoutSquareBrackets = fullExampleName.Substring(prefix.Length, matches[0].Value.Length - prefix.Length - suffix.Length); string[] parts = withoutSquareBrackets.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); string className = parts[0]; string methodName = parts[1]; string mimeType = trimmed.Substring(fullExampleName.Length); if (mimeType.Length > 0) { if (mimeType.StartsWith("[") && mimeType.EndsWith("]")) { mimeType = mimeType.Substring(1, mimeType.Length - 2); } else { SerialisationLog.Warning(string.Concat("Invalid mimetype on example tag: ", trimmed, " in ", filename)); mimeType = ""; } } if (resourceTree.Find(className, methodName) != null) { TMessageType messageType = (TMessageType)Enum.Parse(typeof(TMessageType), parts[2]); string exampleFilename = filename.Substring(baseDirectory.Length); currentExample = new Example(exampleFilename, lastHeading, className, methodName, messageType, mimeType); currentExampleBody = new StringBuilder(); string key = string.Concat(currentExample.ClassName, currentExample.MethodName, currentExample.ExampleType.ToString(), mimeType); if (!_Examples.ContainsKey(key)) { _Examples.Add(key, currentExample); } else { SerialisationLog.Error(string.Concat("An example already exists for ", currentExample.ClassName, ".", currentExample.MethodName, ".", currentExample.ExampleType.ToString(), "files: [", currentExample.DocFilename, ", ", _Examples[key].DocFilename, "]")); } } else { SerialisationLog.Error(string.Concat("The method ", className, ".", methodName, " in ", filename, " does not exist")); } } } } } }
private string JsonToXml(Example currentExample, ResourceNode resourceTree, string json) { string xml = null; MethodInfo method = resourceTree.Find(currentExample.ClassName, currentExample.MethodName).Method; MethodDocumentationAttribute attribute = method.GetCustomAttributes <MethodDocumentationAttribute>().FirstOrDefault(); if (attribute != null) { Type objectType = null; if (currentExample.ExampleType == TMessageType.Request) { objectType = GetObjectType(attribute.RequestTypes, currentExample); } else { objectType = GetObjectType(attribute.ResponseTypes, currentExample); } if (objectType != null) { try { object deserialisedObject = JsonConvert.DeserializeObject(json, objectType); Stream stream = new MemoryStream(); XmlSerializer serializer = new XmlSerializer(objectType); XmlSerializerNamespaces xns = new XmlSerializerNamespaces(); xns.Add(string.Empty, string.Empty); serializer.Serialize(stream, deserialisedObject, xns); stream.Position = 0; using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { reader.ReadLine(); // skip <?xml version="1.0"?> xml = reader.ReadToEnd().Replace("+json", "+xml"); } } catch (InvalidOperationException) { SerialisationLog.Warning(string.Concat("Failed to serialise XML example for ", currentExample.ClassName, ".", currentExample.MethodName)); } catch (Exception ex) { if (ex is JsonReaderException || ex is JsonSerializationException) { SerialisationLog.Warning(string.Concat("Failed to deserialise JSON example for ", currentExample.ClassName, ".", currentExample.MethodName)); } else { throw; } } } else { SerialisationLog.Warning(string.Concat("No ", currentExample.ExampleType.ToString().ToLower(), " type for ", currentExample.ClassName, ".", currentExample.MethodName)); } } else { SerialisationLog.Warning(string.Concat("Could not convert JSON example to XML due to no method documentation for ", currentExample.ClassName, ".", currentExample.MethodName)); } return(xml); }