private SwaggerObjectBase ResolveReferences(SwaggerObjectBase swaggerBase) { if (swaggerBase.ReferencesResolved) { return(swaggerBase); } swaggerBase.ReferencesResolved = true; switch (swaggerBase.ObjectType) { case SwaggerObjectType.ReferenceObject: { var swagger = (SwaggerReferenceObject)swaggerBase; if (!string.IsNullOrEmpty(swagger.DeferredReference)) { if (swagger.DeferredReference[0] != '#') { throw new JsonException($"reference \"{swagger.DeferredReference}\" is not supported. Reference must be inside current schema document starting with #"); } SwaggerObject referencedObject; if (!_documentObjectCache.TryGetValue(swagger.DeferredReference, out referencedObject)) { throw new JsonException($"Could not resolve reference '{swagger.DeferredReference}' in the document."); } swagger.Reference = referencedObject; } return(swagger); } case SwaggerObjectType.Object: { var swagger = (SwaggerObject)swaggerBase; foreach (var key in swagger.Dictionary.Keys.ToList()) { swagger.Dictionary[key] = ResolveReferences(swagger.Dictionary[key]); } return(swagger); } case SwaggerObjectType.Array: { var swagger = (SwaggerArray)swaggerBase; for (int i = 0; i < swagger.Array.Count; i++) { swagger.Array[i] = ResolveReferences(swagger.Array[i]); } return(swagger); } case SwaggerObjectType.ValueType: return(swaggerBase); default: throw new NotSupportedException(swaggerBase.ObjectType.ToString()); } }
private static SwaggerObject ResolveSwaggerObject(SwaggerObjectBase swaggerObjectBase) { if (swaggerObjectBase is SwaggerObject swaggerObject) { return(swaggerObject); } if (swaggerObjectBase is SwaggerReferenceObject swaggerReferenceObject) { return(swaggerReferenceObject.Reference); } throw new ArgumentException($"When resolving reference for {nameof(SwaggerReferenceObject)}, only support {nameof(SwaggerObject)} and {nameof(SwaggerReferenceObject)} as parameter."); }
private SwaggerObjectBase ResolveReferences(SwaggerObjectBase swaggerBase, Stack <string> refStack) { if (swaggerBase.ReferencesResolved) { return(swaggerBase); } swaggerBase.ReferencesResolved = true; switch (swaggerBase.ObjectType) { case SwaggerObjectType.ReferenceObject: { var swagger = (SwaggerReferenceObject)swaggerBase; if (!string.IsNullOrEmpty(swagger.DeferredReference)) { if (swagger.DeferredReference[0] != '/') { throw new JsonException($"reference \"{swagger.DeferredReference}\" is not supported. Reference must be inside current schema document starting with /"); } SwaggerObject referencedObject; if (!_documentObjectCache.TryGetValue(swagger.DeferredReference, out referencedObject)) { throw new JsonException($"Could not resolve reference '{swagger.DeferredReference}' in the document."); } if (refStack.Contains(referencedObject.Location)) { var loopRef = new SwaggerLoopReferenceObject(); loopRef.Dictionary.Add(InternalLoopRefNameKey, new SwaggerValue { Token = swagger.ReferenceName }); return(loopRef); } SwaggerObject existingObject; if (_resolvedObjectCache.TryGetValue(swagger.DeferredReference, out existingObject)) { return(existingObject); } // Clone to avoid change the reference object in _documentObjectCache refStack.Push(referencedObject.Location); var swaggerObj = (SwaggerObject)ResolveReferences(referencedObject.Clone(), refStack); if (!swaggerObj.Dictionary.ContainsKey(InternalRefNameKey)) { swaggerObj.Dictionary.Add(InternalRefNameKey, new SwaggerValue { Token = swagger.ReferenceName }); } swagger.Reference = swaggerObj; refStack.Pop(); if (refStack.Count == 0) { _resolvedObjectCache.Add(swagger.DeferredReference, swagger.Reference); } } return(swagger); } case SwaggerObjectType.Object: { var swagger = (SwaggerObject)swaggerBase; foreach (var key in swagger.Dictionary.Keys.ToList()) { swagger.Dictionary[key] = ResolveReferences(swagger.Dictionary[key], refStack); } return(swagger); } case SwaggerObjectType.Array: { var swagger = (SwaggerArray)swaggerBase; for (int i = 0; i < swagger.Array.Count; i++) { swagger.Array[i] = ResolveReferences(swagger.Array[i], refStack); } return(swagger); } case SwaggerObjectType.ValueType: return(swaggerBase); default: throw new NotSupportedException(swaggerBase.ObjectType.ToString()); } }
private SwaggerObjectBase ResolveReferences(SwaggerObjectBase swaggerBase, string swaggerPath, Stack <JsonLocationInfo> refStack) { if (swaggerBase.ReferencesResolved) { return(swaggerBase); } swaggerBase.ReferencesResolved = true; switch (swaggerBase.ObjectType) { case SwaggerObjectType.ReferenceObject: { var swagger = (SwaggerReferenceObject)swaggerBase; if (!string.IsNullOrEmpty(swagger.DeferredReference)) { if (swagger.DeferredReference[0] != '/') { throw new JsonException($"reference \"{swagger.DeferredReference}\" is not supported. Reference must be inside current schema document starting with /"); } var jsonLocationInfo = new JsonLocationInfo(swagger.ExternalFilePath ?? swaggerPath, swagger.DeferredReference); if (!_documentObjectCache.TryGetValue(jsonLocationInfo, out SwaggerObjectBase referencedObjectBase)) { if (swagger.ExternalFilePath == null) { throw new JsonException($"Could not resolve reference '{swagger.DeferredReference}' in the document."); } // Load external swagger, to fill in the document cache. Load(swagger.ExternalFilePath); if (!_documentObjectCache.TryGetValue(jsonLocationInfo, out referencedObjectBase)) { throw new JsonException($"Could not resolve reference '{swagger.DeferredReference}' in the document."); } } if (refStack.Contains(jsonLocationInfo)) { var loopRef = new SwaggerLoopReferenceObject(); loopRef.Dictionary.Add(InternalLoopRefNameKey, new SwaggerValue { Token = swagger.ReferenceName }); loopRef.Dictionary.Add(InternalLoopTokenKey, new SwaggerValue { Token = swagger.Token }); return(loopRef); } // Clone to avoid change the reference object in _documentObjectCache refStack.Push(jsonLocationInfo); if (!_resolvedObjectCache.TryGetValue(jsonLocationInfo, out var resolvedObject)) { resolvedObject = ResolveReferences(referencedObjectBase.Clone(), jsonLocationInfo.FilePath, refStack); _resolvedObjectCache.Add(jsonLocationInfo, resolvedObject); } var swaggerObject = ResolveSwaggerObject(resolvedObject); if (!swaggerObject.Dictionary.ContainsKey(InternalRefNameKey)) { swaggerObject.Dictionary.Add(InternalRefNameKey, new SwaggerValue { Token = swagger.ReferenceName }); } swagger.Reference = swaggerObject; refStack.Pop(); } return(swagger); } case SwaggerObjectType.Object: { var swagger = (SwaggerObject)swaggerBase; foreach (var key in swagger.Dictionary.Keys.ToList()) { swagger.Dictionary[key] = ResolveReferences(swagger.Dictionary[key], swaggerPath, refStack); } return(swagger); } case SwaggerObjectType.Array: { var swagger = (SwaggerArray)swaggerBase; for (int i = 0; i < swagger.Array.Count; i++) { swagger.Array[i] = ResolveReferences(swagger.Array[i], swaggerPath, refStack); } return(swagger); } case SwaggerObjectType.ValueType: return(swaggerBase); default: throw new NotSupportedException(swaggerBase.ObjectType.ToString()); } }
private static SwaggerObject ResolveSwaggerObject(SwaggerObjectBase swaggerObjectBase) { var swaggerObject = swaggerObjectBase as SwaggerObject; if (swaggerObject != null) { return swaggerObject; } var swaggerReferenceObject = swaggerObjectBase as SwaggerReferenceObject; if (swaggerReferenceObject != null) { return swaggerReferenceObject.Reference; } throw new ArgumentException($"When resolving reference for {nameof(SwaggerReferenceObject)}, only support {nameof(SwaggerObject)} and {nameof(SwaggerReferenceObject)} as parameter."); }
private SwaggerObjectBase ResolveReferences(SwaggerObjectBase swaggerBase, Stack<string> refStack) { if (swaggerBase.ReferencesResolved) { return swaggerBase; } swaggerBase.ReferencesResolved = true; switch (swaggerBase.ObjectType) { case SwaggerObjectType.ReferenceObject: { var swagger = (SwaggerReferenceObject)swaggerBase; if (!string.IsNullOrEmpty(swagger.DeferredReference)) { if (swagger.DeferredReference[0] != '/') { throw new JsonException($"reference \"{swagger.DeferredReference}\" is not supported. Reference must be inside current schema document starting with /"); } SwaggerObjectBase referencedObjectBase; if (!_documentObjectCache.TryGetValue(swagger.DeferredReference, out referencedObjectBase)) { throw new JsonException($"Could not resolve reference '{swagger.DeferredReference}' in the document."); } if (refStack.Contains(referencedObjectBase.Location)) { var loopRef = new SwaggerLoopReferenceObject(); loopRef.Dictionary.Add(InternalLoopRefNameKey, new SwaggerValue { Token = swagger.ReferenceName }); return loopRef; } // Clone to avoid change the reference object in _documentObjectCache refStack.Push(referencedObjectBase.Location); var resolved = ResolveReferences(referencedObjectBase.Clone(), refStack); var swaggerObject = ResolveSwaggerObject(resolved); if (!swaggerObject.Dictionary.ContainsKey(InternalRefNameKey)) { swaggerObject.Dictionary.Add(InternalRefNameKey, new SwaggerValue { Token = swagger.ReferenceName }); } swagger.Reference = swaggerObject; refStack.Pop(); } return swagger; } case SwaggerObjectType.Object: { var swagger = (SwaggerObject)swaggerBase; foreach (var key in swagger.Dictionary.Keys.ToList()) { swagger.Dictionary[key] = ResolveReferences(swagger.Dictionary[key], refStack); } return swagger; } case SwaggerObjectType.Array: { var swagger = (SwaggerArray)swaggerBase; for (int i = 0; i < swagger.Array.Count; i++) { swagger.Array[i] = ResolveReferences(swagger.Array[i], refStack); } return swagger; } case SwaggerObjectType.ValueType: return swaggerBase; default: throw new NotSupportedException(swaggerBase.ObjectType.ToString()); } }