private void ValidateProtocolProvider(IProtocolProvider provider) { if (provider == null) { throw new InvalidProtocolProviderException("External protocol provider cannot be null"); } if (string.IsNullOrWhiteSpace(provider.ProtocolIdentifier)) { throw new InvalidProtocolProviderException($"Invalid protocol provider '{provider.GetType().GetRESTableTypeName()}'. " + "ProtocolIdentifier cannot be null or whitespace"); } if (!Regex.IsMatch(provider.ProtocolIdentifier, "^[a-zA-Z]+$")) { throw new InvalidProtocolProviderException($"Invalid protocol provider '{provider.GetType().GetRESTableTypeName()}'. " + "ProtocolIdentifier can only contain letters a-z and A-Z"); } if (provider.ExternalContentTypeProviderSettings == ExternalContentTypeProviderSettings.DontAllow) { var contentProviders = provider.GetCustomContentTypeProviders()?.ToList(); if (contentProviders?.Any() != true) { throw new InvalidProtocolProviderException($"Invalid protocol provider '{provider.GetType().GetRESTableTypeName()}'. " + "The protocol provider allows no external content type providers " + "and does not provide any content type providers of its own."); } if (contentProviders.All(p => !p.CanRead) && contentProviders.All(p => !p.CanWrite)) { throw new InvalidProtocolProviderException($"Invalid protocol provider '{provider.GetType().GetRESTableTypeName()}'. " + "The protocol provider allows no external content type providers " + "and none of the provided content type providers can read or write."); } } }
private CachedProtocolProvider GetCachedProtocolProvider(IProtocolProvider provider) { var cProvider = new CachedProtocolProvider(provider); var contentTypeProviders = provider.GetCustomContentTypeProviders()?.ToList() ?? new List <IContentTypeProvider>(); foreach (var contentTypeProvider in contentTypeProviders.Where(p => p.MatchStrings != null)) { if (contentTypeProvider.CanRead) { foreach (var mimeType in contentTypeProvider.MatchStrings) { cProvider.InputMimeBindings[mimeType] = contentTypeProvider; } } if (contentTypeProvider.CanWrite) { foreach (var mimeType in contentTypeProvider.MatchStrings) { cProvider.OutputMimeBindings[mimeType] = contentTypeProvider; } } } switch (provider.ExternalContentTypeProviderSettings) { case ExternalContentTypeProviderSettings.AllowAll: foreach (var pair in ContentTypeProviderManager.InputContentTypeProviders.Where(p => !cProvider.InputMimeBindings.ContainsKey(p.Key))) { cProvider.InputMimeBindings.Add(pair); } foreach (var pair in ContentTypeProviderManager.OutputContentTypeProviders.Where(p => !cProvider.OutputMimeBindings.ContainsKey(p.Key))) { cProvider.OutputMimeBindings.Add(pair); } break; case ExternalContentTypeProviderSettings.AllowInput: foreach (var pair in ContentTypeProviderManager.InputContentTypeProviders.Where(p => !cProvider.InputMimeBindings.ContainsKey(p.Key))) { cProvider.InputMimeBindings.Add(pair); } break; case ExternalContentTypeProviderSettings.AllowOutput: foreach (var pair in ContentTypeProviderManager.OutputContentTypeProviders.Where(p => !cProvider.OutputMimeBindings.ContainsKey(p.Key))) { cProvider.OutputMimeBindings.Add(pair); } break; } return(cProvider); }