/// <summary> /// Gets the capablities from the <see cref="IEdmModel"/> for the given <see cref="IEdmVocabularyAnnotatable"/>. /// </summary> /// <param name="model">The Edm model.</param> /// <param name="target">The target.</param> /// <param name="kind">Thye Capabilites kind.</param> /// <returns>The capabilities restrictions or null.</returns> private static ICapablitiesRestrictions GetCapabilities(this IEdmModel model, IEdmVocabularyAnnotatable target, CapabilitesTermKind kind) { if (model == null || target == null) { return(null); } lock (_objectLock) { if (!ReferenceEquals(_savedModel, model)) { if (_capabilitesRestrictions != null) { _capabilitesRestrictions.Clear(); } _savedModel = model; } if (_capabilitesRestrictions == null) { _capabilitesRestrictions = new Dictionary <IEdmVocabularyAnnotatable, IDictionary <CapabilitesTermKind, ICapablitiesRestrictions> >(); } ICapablitiesRestrictions restriction; if (_capabilitesRestrictions.TryGetValue(target, out IDictionary <CapabilitesTermKind, ICapablitiesRestrictions> value)) { // Here means we visited target before and we are sure that the value is not null. if (value.TryGetValue(kind, out restriction)) { return(restriction); } else { restriction = CreateCapabilitesRestrictions(model, target, kind); value[kind] = restriction; return(restriction); } } // It's first time to query this target, create new dictionary and restriction. value = new Dictionary <CapabilitesTermKind, ICapablitiesRestrictions>(); _capabilitesRestrictions[target] = value; restriction = CreateCapabilitesRestrictions(model, target, kind); value[kind] = restriction; return(restriction); } }
/// <summary> /// Create the capabiliites restriction /// </summary> /// <param name="model">The Edm model.</param> /// <param name="target">The Target.</param> /// <param name="kind">The Capabiliites kind.</param> /// <returns>The <see cref="ICapablitiesRestrictions"/>.</returns> public static ICapablitiesRestrictions CreateCapabilitesRestrictions(this IEdmModel model, IEdmVocabularyAnnotatable target, CapabilitesTermKind kind) { Debug.Assert(model != null); Debug.Assert(target != null); ICapablitiesRestrictions capabilitiesRestrictions = null; switch (kind) { case CapabilitesTermKind.DeleteRestrictions: // DeleteRestrictions capabilitiesRestrictions = new DeleteRestrictions(); break; case CapabilitesTermKind.UpdateRestrictions: // UpdateRestrictions capabilitiesRestrictions = new UpdateRestrictions(); break; case CapabilitesTermKind.InsertRestrictions: // InsertRestrictions capabilitiesRestrictions = new InsertRestrictions(); break; case CapabilitesTermKind.SearchRestrictions: // SearchRestrictions capabilitiesRestrictions = new SearchRestrictions(); break; case CapabilitesTermKind.ExpandRestrictions: // ExpandRestrictions capabilitiesRestrictions = new ExpandRestrictions(); break; case CapabilitesTermKind.SortRestrictions: // SortRestrictions capabilitiesRestrictions = new SortRestrictions(); break; case CapabilitesTermKind.FilterRestrictions: // FilterRestrictions capabilitiesRestrictions = new FilterRestrictions(); break; case CapabilitesTermKind.NavigationRestrictions: // NavigationRestrictions capabilitiesRestrictions = new NavigationRestrictions(); break; case CapabilitesTermKind.CountRestrictions: // CountRestrictions capabilitiesRestrictions = new CountRestrictions(); break; case CapabilitesTermKind.BatchSupported: // BatchSupported capabilitiesRestrictions = new BatchSupported(); break; case CapabilitesTermKind.SkipSupported: // SkipSupported capabilitiesRestrictions = new SkipSupported(); break; case CapabilitesTermKind.TopSupported: // TopSupported capabilitiesRestrictions = new TopSupported(); break; case CapabilitesTermKind.KeyAsSegmentSupported: // KeyAsSegmentSupported capabilitiesRestrictions = new KeyAsSegmentSupported(); break; case CapabilitesTermKind.IndexableByKey: // IndexableByKey capabilitiesRestrictions = new IndexableByKey(); break; case CapabilitesTermKind.ChangeTracking: // ChangeTracking case CapabilitesTermKind.CrossJoinSupported: // CrossJoinSupported case CapabilitesTermKind.CallbackSupported: // CallbackSupported case CapabilitesTermKind.FilterFunctions: // FilterFunctions case CapabilitesTermKind.BatchContinueOnErrorSupported: // BatchContinueOnErrorSupported case CapabilitesTermKind.AsynchronousRequestsSupported: // AsynchronousRequestsSupported case CapabilitesTermKind.Isolation: // Isolation case CapabilitesTermKind.AcceptableEncodings: // AcceptableEncodings case CapabilitesTermKind.SupportedFormats: // SupportedFormats default: throw Error.NotSupported(String.Format(SRResource.CapabilitiesKindNotSupported, kind)); } // load the annotation value if (!capabilitiesRestrictions.Load(model, target)) { return(null); } return(capabilitiesRestrictions); }