/// <summary> /// Returns whether the provided URIs reference the same object. /// Two uri are the "same" if their hierarchies match (1.3.1.1/1.4.1.1) or if their object ids are equal (2.0). /// </summary> /// <param name="u"></param> /// <param name="v"></param> /// <returns></returns> public static bool AreSame(EtpUri u, EtpUri v) { if (!u.IsRelatedTo(v)) { return(false); } if (u.IsRelatedTo(EtpUris.Witsml200) && u.ObjectType.EqualsIgnoreCase(v.ObjectType) && !string.IsNullOrEmpty(u.ObjectId) && u.ObjectId.EqualsIgnoreCase(v.ObjectId)) { return(true); } return(u.Equals(v)); }
/// <summary> /// Gets a collection of resources associated to the specified URI. /// </summary> /// <param name="args">The <see cref="ProtocolEventArgs{GetResources, IList}"/> instance containing the event data.</param> public void GetResources(ProtocolEventArgs <GetResources, IList <Resource> > args) { if (EtpUri.IsRoot(args.Message.Uri)) { args.Context.Add(DiscoveryStoreProvider.NewProtocol(EtpUris.Witsml131, "WITSML Store (1.3.1.1)")); return; } var uri = new EtpUri(args.Message.Uri); var parentUri = uri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(uri.Query)) { parentUri = new EtpUri(parentUri + uri.Query); } if (!uri.IsRelatedTo(EtpUris.Witsml131)) { return; } if (uri.IsBaseUri || (string.IsNullOrWhiteSpace(uri.ObjectId) && ObjectTypes.Well.EqualsIgnoreCase(uri.ObjectType))) { _wellDataProvider.GetAll(uri) .ForEach(x => args.Context.Add(ToResource(x))); } else if (string.IsNullOrWhiteSpace(uri.ObjectId) && ObjectTypes.Wellbore.EqualsIgnoreCase(parentUri.ObjectType)) { var objectType = ObjectTypes.PluralToSingle(uri.ObjectType); var dataProvider = _container.Resolve <IEtpDataProvider>(new ObjectName(objectType, uri.Version)); dataProvider .GetAll(parentUri) .Cast <IWellboreObject>() .ForEach(x => args.Context.Add(ToResource(x))); } else if (ObjectTypes.Well.EqualsIgnoreCase(uri.ObjectType)) { _wellboreDataProvider.GetAll(uri) .ForEach(x => args.Context.Add(ToResource(x))); } else if (ObjectTypes.Wellbore.EqualsIgnoreCase(uri.ObjectType)) { var wellboreObjectType = typeof(IWellboreObject); Providers .OfType <IWitsmlDataAdapter>() .Where(x => wellboreObjectType.IsAssignableFrom(x.DataObjectType)) .Select(x => ObjectTypes.GetObjectType(x.DataObjectType)) .OrderBy(x => x) .ForEach(x => args.Context.Add(DiscoveryStoreProvider.NewFolder(uri, x, ObjectTypes.SingleToPlural(x, false)))); } else if (ObjectTypes.Log.EqualsIgnoreCase(uri.ObjectType)) { var log = _logDataProvider.Get(uri); log?.LogCurveInfo?.ForEach(x => args.Context.Add(ToResource(log, x))); } }
// TODO: Remove this method when the corresponding EtpUriExtension in base submodule has been pushed through /// <summary> /// Converts a full path 2.x EtpUri into a top level EtpUri /// </summary> /// <param name="uri">The specified URI.</param> /// <returns>A top level EtpUri</returns> public static EtpUri ToTopLevelUri(this EtpUri uri) { // If this is a root, base, 131 or 141 URI, just return it without any changes if (uri.IsRootUri || uri.IsBaseUri || uri.IsRelatedTo(EtpUris.Witsml131) || uri.IsRelatedTo(EtpUris.Witsml141)) { return(uri); } return(EtpUris.Witsml200 .Append(uri.ObjectType, uri.ObjectId)); }
private void GetResources <T>(IEtpAdapter etpAdapter, string uri, IList <T> resources, out string serverSortOrder) where T : IResource { // Default to Name in IResource serverSortOrder = ObjectTypes.NameProperty; if (EtpUris.IsRootUri(uri)) { var childCount = CreateFoldersByObjectType(etpAdapter, EtpUris.Eml210).Count; resources.Add(etpAdapter.NewProtocol(EtpUris.Eml210, "EML Common (2.1)", childCount)); return; } var etpUri = new EtpUri(uri); var parentUri = etpUri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(etpUri.Query)) { parentUri = new EtpUri(parentUri + etpUri.Query); } if (!etpUri.IsRelatedTo(EtpUris.Eml210)) { return; } if (etpUri.IsBaseUri) { CreateFoldersByObjectType(etpAdapter, etpUri) .ForEach(resources.Add); } else if (string.IsNullOrWhiteSpace(etpUri.ObjectId)) { var objectType = ObjectTypes.GetObjectType(etpUri.ObjectType, etpUri.Family, etpUri.Version); var contentType = EtpContentTypes.GetContentType(objectType); var hasChildren = contentType.IsRelatedTo(EtpContentTypes.Eml210) ? 0 : -1; var dataProvider = GetDataProvider(etpUri.ObjectType); serverSortOrder = dataProvider.ServerSortOrder; dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri, hasChildren))); } //else //{ // var propertyName = uri.ObjectType.ToPascalCase(); // // CreateFoldersByObjectType(uri, propertyName) // .ForEach(resources.Add); //} }
/// <summary> /// Deletes all child objects related to the specified URI. /// </summary> /// <param name="uri">The URI.</param> protected virtual void DeleteAll(EtpUri uri) { var adapters = new List <IWitsmlDataAdapter>(); if (uri.IsRelatedTo(EtpUris.Witsml200) || uri.IsRelatedTo(EtpUris.Eml210)) { // Cascade delete not defined for WITSML 2.0 / ETP return; } if (ObjectTypes.Well.EqualsIgnoreCase(uri.ObjectType)) { adapters.Add(Container.Resolve <IWitsmlDataAdapter>(new ObjectName(ObjectTypes.Wellbore, uri.Version))); } else if (ObjectTypes.Wellbore.EqualsIgnoreCase(uri.ObjectType)) { var exclude = new[] { ObjectTypes.Well, ObjectTypes.Wellbore, ObjectTypes.ChangeLog }; var type = OptionsIn.DataVersion.Version141.Equals(uri.Version) ? typeof(IWitsml141Configuration) : typeof(IWitsml131Configuration); Container .ResolveAll(type) .Cast <IWitsmlDataAdapter>() .Where(x => !exclude.ContainsIgnoreCase(ObjectTypes.GetObjectType(x.DataObjectType))) .ForEach(adapters.Add); } foreach (var adapter in adapters) { var dataObjects = adapter.GetAll(uri); foreach (var dataObject in dataObjects) { adapter.Delete(adapter.GetUri(dataObject)); } } }
/// <summary> /// Gets a collection of resources associated to the specified URI. /// </summary> /// <param name="args">The <see cref="ProtocolEventArgs{GetResources, IList}"/> instance containing the event data.</param> public void GetResources(ProtocolEventArgs <GetResources, IList <Resource> > args) { if (EtpUris.IsRootUri(args.Message.Uri)) { // NOTE: This entry added by the Witsml200Provider so that it appears at the end of the list //args.Context.Add(DiscoveryStoreProvider.NewProtocol(EtpUris.Eml210, "EML Common (2.1)")); return; } var uri = new EtpUri(args.Message.Uri); var parentUri = uri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(uri.Query)) { parentUri = new EtpUri(parentUri + uri.Query); } if (!uri.IsRelatedTo(EtpUris.Eml210)) { return; } if (uri.IsBaseUri) { CreateFoldersByObjectType(uri) .ForEach(args.Context.Add); } else if (string.IsNullOrWhiteSpace(uri.ObjectId)) { var objectType = ObjectTypes.GetObjectType(uri.ObjectType, uri.Version); var contentType = EtpContentTypes.GetContentType(objectType); var hasChildren = contentType.IsRelatedTo(EtpContentTypes.Eml210) ? 0 : -1; var dataProvider = GetDataProvider(uri.ObjectType); dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => args.Context.Add(ToResource(x, hasChildren))); } //else //{ // var propertyName = uri.ObjectType.ToPascalCase(); // // CreateFoldersByObjectType(uri, propertyName) // .ForEach(args.Context.Add); //} }
private void GetResources <T>(IEtpAdapter etpAdapter, string uri, IList <T> resources) where T : IResource { if (EtpUris.IsRootUri(uri)) { // NOTE: This entry added by the Witsml200Provider so that it appears at the end of the list //resources.Add(etpAdapter.NewProtocol(EtpUris.Eml210, "EML Common (2.1)")); return; } var etpUri = new EtpUri(uri); var parentUri = etpUri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(etpUri.Query)) { parentUri = new EtpUri(parentUri + etpUri.Query); } if (!etpUri.IsRelatedTo(EtpUris.Eml210)) { return; } if (etpUri.IsBaseUri) { CreateFoldersByObjectType(etpAdapter, etpUri) .ForEach(resources.Add); } else if (string.IsNullOrWhiteSpace(etpUri.ObjectId)) { var objectType = ObjectTypes.GetObjectType(etpUri.ObjectType, etpUri.Version); var contentType = EtpContentTypes.GetContentType(objectType); var hasChildren = contentType.IsRelatedTo(EtpContentTypes.Eml210) ? 0 : -1; var dataProvider = GetDataProvider(etpUri.ObjectType); dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => resources.Add(ToResource(etpAdapter, x, hasChildren))); } //else //{ // var propertyName = uri.ObjectType.ToPascalCase(); // // CreateFoldersByObjectType(uri, propertyName) // .ForEach(resources.Add); //} }
/// <summary> /// Gets the uri /// </summary> /// <param name="uri"></param> /// <param name="other"></param> /// <returns></returns> public static EtpUri GetResolvedHierarchyUri(this EtpUri uri, EtpUri other) { var resolvedUri = new EtpUri(); if (other.IsRootUri) { return(uri); } if (!uri.IsRelatedTo(other)) { return(resolvedUri); } var uriHierarchy = uri.GetObjectIds().ToList(); var otherHierarchy = other.GetObjectIds().ToList(); resolvedUri = uri.GetUriFamily(); var otherHierarchyMap = otherHierarchy .ToLookup(x => x.ObjectType, x => x.ObjectId, StringComparer.InvariantCultureIgnoreCase) .ToDictionary(x => x.Key, x => x.First(), StringComparer.InvariantCultureIgnoreCase); uriHierarchy.ForEach(segment => { var objectType = segment.ObjectType; var objectId = segment.ObjectId; if (string.IsNullOrWhiteSpace(objectId)) { otherHierarchyMap.TryGetValue(objectType, out objectId); } resolvedUri.Append(objectType, objectId); }); return(resolvedUri); }
private void GetResources <T>(IEtpAdapter etpAdapter, string uri, IList <T> resources, out string serverSortOrder) where T : IResource { // Default to Name in IResource serverSortOrder = ObjectTypes.NameProperty; var etpUri = new EtpUri(uri); var parentUri = etpUri.Parent; if (EtpUris.IsRootUri(uri)) { resources.Add(etpAdapter.NewProtocol(EtpUris.Witsml131, "WITSML Store (1.3.1.1)", _wellDataProvider.Count(etpUri))); return; } // Append query string, if any if (!string.IsNullOrWhiteSpace(etpUri.Query)) { parentUri = new EtpUri(parentUri + etpUri.Query); } if (!etpUri.IsRelatedTo(EtpUris.Witsml131)) { return; } if (etpUri.IsBaseUri || (string.IsNullOrWhiteSpace(etpUri.ObjectId) && ObjectTypes.Well.EqualsIgnoreCase(etpUri.ObjectType))) { _wellDataProvider.GetAll(etpUri) .ForEach(x => resources.Add(ToResource(etpAdapter, x))); serverSortOrder = _wellDataProvider.ServerSortOrder; } else if (string.IsNullOrWhiteSpace(etpUri.ObjectId) && ObjectTypes.Wellbore.EqualsIgnoreCase(parentUri.ObjectType)) { var dataProvider = _container.Resolve <IEtpDataProvider>(new ObjectName(etpUri.ObjectType, etpUri.Version)); serverSortOrder = dataProvider.ServerSortOrder; dataProvider .GetAll(parentUri) .Cast <IWellboreObject>() .ForEach(x => resources.Add(ToResource(etpAdapter, x))); } else if (ObjectTypes.Well.EqualsIgnoreCase(etpUri.ObjectType)) { _wellboreDataProvider.GetAll(etpUri) .ForEach(x => resources.Add(ToResource(etpAdapter, x))); serverSortOrder = _wellboreDataProvider.ServerSortOrder; } else if (ObjectTypes.Wellbore.EqualsIgnoreCase(etpUri.ObjectType)) { foreach (var adapter in GetWellboreDataAdapters()) { var type = EtpContentTypes.GetContentType(adapter.DataObjectType); var count = adapter.Count(etpUri); resources.Add(etpAdapter.NewFolder(etpUri, type, type.ObjectType, count)); } } else if (ObjectTypes.Log.EqualsIgnoreCase(etpUri.ObjectType)) { var log = _logDataProvider.Get(etpUri); log?.LogCurveInfo?.ForEach(x => resources.Add(ToResource(etpAdapter, log, x))); serverSortOrder = string.Empty; } }
private void GetResources <T>(IEtpAdapter etpAdapter, string uri, IList <T> resources, out string serverSortOrder) where T : IResource { // Default to Name in IResource serverSortOrder = ObjectTypes.NameProperty; if (EtpUris.IsRootUri(uri)) { var childCount = CreateFoldersByObjectType(etpAdapter, EtpUris.Witsml200, skipChildCount: true).Count; resources.Add(etpAdapter.NewProtocol(EtpUris.Witsml200, "WITSML Store (2.0)", childCount)); return; } var etpUri = new EtpUri(uri); var parentUri = etpUri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(etpUri.Query)) { parentUri = new EtpUri(parentUri + etpUri.Query); } if (!etpUri.IsRelatedTo(EtpUris.Witsml200) || !IsValidUri(etpUri)) { return; } if (etpUri.IsBaseUri) { CreateFoldersByObjectType(etpAdapter, etpUri) .ForEach(resources.Add); } else if (string.IsNullOrWhiteSpace(etpUri.ObjectId)) { var isChannelDataAdapterEnabled = WitsmlSettings.IsChannelDataAdapterEnabled; if (!isChannelDataAdapterEnabled && ObjectTypes.ChannelSet.EqualsIgnoreCase(etpUri.ObjectType) && ObjectTypes.Log.EqualsIgnoreCase(parentUri.ObjectType)) { var log = _logDataProvider.Get(parentUri); log?.ChannelSet?.OrderBy(x => x.Citation.Title).ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri))); serverSortOrder = _channelSetDataProvider.ServerSortOrder; } else if (!isChannelDataAdapterEnabled && ObjectTypes.Channel.EqualsIgnoreCase(etpUri.ObjectType) && ObjectTypes.ChannelSet.EqualsIgnoreCase(parentUri.ObjectType)) { var set = _channelSetDataProvider.Get(parentUri); set?.Channel?.OrderBy(x => x.Citation.Title).ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri))); serverSortOrder = _channelSetDataProvider.ServerSortOrder; } else { var objectType = ObjectTypes.GetObjectType(etpUri.ObjectType, etpUri.Family, etpUri.Version); var contentType = EtpContentTypes.GetContentType(objectType); var hasChildren = contentType.IsRelatedTo(EtpContentTypes.Eml210) ? 0 : -1; var dataProvider = GetDataProvider(etpUri.ObjectType); serverSortOrder = dataProvider.ServerSortOrder; dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri, hasChildren))); } } else if (ObjectTypes.Log.EqualsIgnoreCase(etpUri.ObjectType)) { var log = _logDataProvider.Get(etpUri); var hasChildren = log?.ChannelSet?.Count ?? 0; CreateFoldersByObjectType(etpAdapter, etpUri, "Log", ObjectTypes.ChannelSet, hasChildren) .ForEach(resources.Add); } else if (ObjectTypes.ChannelSet.EqualsIgnoreCase(etpUri.ObjectType)) { var set = _channelSetDataProvider.Get(etpUri); var hasChildren = set?.Channel?.Count ?? 0; CreateFoldersByObjectType(etpAdapter, etpUri, "ChannelSet", ObjectTypes.Channel, hasChildren) .ForEach(resources.Add); } else if (ObjectTypes.WellboreGeology.EqualsIgnoreCase(etpUri.ObjectType)) { const int childCount = 0; resources.Add(etpAdapter.NewFolder(etpUri, EtpContentTypes.GetContentType(typeof(CuttingsGeology)), ObjectTypes.CuttingsGeology.ToPascalCase(), childCount)); resources.Add(etpAdapter.NewFolder(etpUri, EtpContentTypes.GetContentType(typeof(InterpretedGeology)), ObjectTypes.InterpretedGeology.ToPascalCase(), childCount)); resources.Add(etpAdapter.NewFolder(etpUri, EtpContentTypes.GetContentType(typeof(ShowEvaluation)), ObjectTypes.ShowEvaluation.ToPascalCase(), childCount)); } else { var propertyName = etpUri.ObjectType.ToPascalCase(); CreateFoldersByObjectType(etpAdapter, etpUri, propertyName) .ForEach(resources.Add); } }
/// <summary> /// Gets a collection of resources associated to the specified URI. /// </summary> /// <param name="args">The <see cref="ProtocolEventArgs{GetResources, IList}"/> instance containing the event data.</param> public void GetResources(ProtocolEventArgs <GetResources, IList <Resource> > args) { if (EtpUris.IsRootUri(args.Message.Uri)) { args.Context.Add(DiscoveryStoreProvider.NewProtocol(EtpUris.Witsml200, "WITSML Store (2.0)")); args.Context.Add(DiscoveryStoreProvider.NewProtocol(EtpUris.Eml210, "EML Common (2.1)")); return; } var uri = new EtpUri(args.Message.Uri); var parentUri = uri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(uri.Query)) { parentUri = new EtpUri(parentUri + uri.Query); } if (!uri.IsRelatedTo(EtpUris.Witsml200)) { return; } if (uri.IsBaseUri) { CreateFoldersByObjectType(uri) .ForEach(args.Context.Add); } else if (string.IsNullOrWhiteSpace(uri.ObjectId)) { if (ObjectTypes.ChannelSet.EqualsIgnoreCase(uri.ObjectType) && ObjectTypes.Log.EqualsIgnoreCase(parentUri.ObjectType)) { var log = _logDataProvider.Get(parentUri); log?.ChannelSet?.ForEach(x => args.Context.Add(ToResource(x))); } else if (ObjectTypes.Channel.EqualsIgnoreCase(uri.ObjectType) && ObjectTypes.ChannelSet.EqualsIgnoreCase(parentUri.ObjectType)) { var set = _channelSetDataProvider.Get(parentUri); set?.Channel?.ForEach(x => args.Context.Add(ToResource(set, x))); } else { var objectType = ObjectTypes.GetObjectType(uri.ObjectType, uri.Version); var contentType = EtpContentTypes.GetContentType(objectType); var hasChildren = contentType.IsRelatedTo(EtpContentTypes.Eml210) ? 0 : -1; var dataProvider = GetDataProvider(uri.ObjectType); dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => args.Context.Add(ToResource(x, hasChildren))); } } else if (ObjectTypes.Log.EqualsIgnoreCase(uri.ObjectType)) { var log = _logDataProvider.Get(uri); var hasChildren = log?.ChannelSet?.Count ?? 0; CreateFoldersByObjectType(uri, "Log", ObjectTypes.ChannelSet, hasChildren) .ForEach(args.Context.Add); } else if (ObjectTypes.ChannelSet.EqualsIgnoreCase(uri.ObjectType)) { var set = _channelSetDataProvider.Get(uri); var hasChildren = set?.Channel?.Count ?? 0; CreateFoldersByObjectType(uri, "ChannelSet", ObjectTypes.Channel, hasChildren) .ForEach(args.Context.Add); } else { var propertyName = uri.ObjectType.ToPascalCase(); CreateFoldersByObjectType(uri, propertyName) .ForEach(args.Context.Add); } }
private void GetResources <T>(IEtpAdapter etpAdapter, string uri, IList <T> resources) where T : IResource { if (EtpUris.IsRootUri(uri)) { resources.Add(etpAdapter.NewProtocol(EtpUris.Witsml131, "WITSML Store (1.3.1.1)")); return; } var etpUri = new EtpUri(uri); var parentUri = etpUri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(etpUri.Query)) { parentUri = new EtpUri(parentUri + etpUri.Query); } if (!etpUri.IsRelatedTo(EtpUris.Witsml131)) { return; } if (etpUri.IsBaseUri || (string.IsNullOrWhiteSpace(etpUri.ObjectId) && ObjectTypes.Well.EqualsIgnoreCase(etpUri.ObjectType))) { _wellDataProvider.GetAll(etpUri) .ForEach(x => resources.Add(ToResource(etpAdapter, x))); } else if (string.IsNullOrWhiteSpace(etpUri.ObjectId) && ObjectTypes.Wellbore.EqualsIgnoreCase(parentUri.ObjectType)) { var dataProvider = _container.Resolve <IEtpDataProvider>(new ObjectName(etpUri.ObjectType, etpUri.Version)); dataProvider .GetAll(parentUri) .Cast <IWellboreObject>() .ForEach(x => resources.Add(ToResource(etpAdapter, x))); } else if (ObjectTypes.Well.EqualsIgnoreCase(etpUri.ObjectType)) { _wellboreDataProvider.GetAll(etpUri) .ForEach(x => resources.Add(ToResource(etpAdapter, x))); } else if (ObjectTypes.Wellbore.EqualsIgnoreCase(etpUri.ObjectType)) { var wellboreObjectType = typeof(IWellboreObject); Providers .OfType <IWitsmlDataAdapter>() .Where(x => wellboreObjectType.IsAssignableFrom(x.DataObjectType)) .Select(x => EtpContentTypes.GetContentType(x.DataObjectType)) .OrderBy(x => x.ObjectType) .ForEach(x => { var hasChildren = ObjectTypes.Log.EqualsIgnoreCase(x.ObjectType) ? _logDataProvider.Count(etpUri) : -1; resources.Add(etpAdapter.NewFolder(etpUri, x, x.ObjectType, hasChildren)); }); } else if (ObjectTypes.Log.EqualsIgnoreCase(etpUri.ObjectType)) { var log = _logDataProvider.Get(etpUri); log?.LogCurveInfo?.ForEach(x => resources.Add(ToResource(etpAdapter, log, x))); } }
/// <summary> /// Gets whether an URI is relative to another URI. /// </summary> /// <param name="uri">The child URI (E.g. {eml://witsml20/Well(1234)/Wellbore(5678)/Trajectory(91011)}).</param> /// <param name="other">The parent URI (E.g. {eml://witsml20/Trajectory}).</param> /// <returns></returns> public static bool IsRelativeTo(this EtpUri uri, EtpUri other) { if (!uri.IsValid || !other.IsValid) { return(false); } if (other.IsRootUri) { return(true); } if (!uri.IsRelatedTo(other)) { return(false); } var uriHierarchy = uri.GetObjectIds().ToList(); var otherHierarchy = other.GetObjectIds().ToList(); var getObjectType = new Func <List <EtpUri.Segment>, int, EtpUri.Segment>((h, i) => { return(i >= 0 && i < h.Count ? h[i] : new EtpUri.Segment()); }); var isBaseUri = new Func <EtpUri.Segment, bool>((o) => { return(string.IsNullOrWhiteSpace(o.ObjectType) && string.IsNullOrWhiteSpace(o.ObjectId)); }); var uriIndex = uriHierarchy.Count - 1; var otherIndex = otherHierarchy.Count - 1; var uriTemp = getObjectType(uriHierarchy, uriIndex); var otherTemp = getObjectType(otherHierarchy, otherIndex); var valid = false; while (!string.IsNullOrWhiteSpace(uriTemp.ObjectType)) { if (uriTemp.ObjectType.EqualsIgnoreCase(otherTemp.ObjectType)) { valid = true; break; } uriTemp = getObjectType(uriHierarchy, --uriIndex); } if (isBaseUri(uriTemp) && isBaseUri(otherTemp)) { return(true); } if (!valid) { return(false); } while (!string.IsNullOrWhiteSpace(uriTemp.ObjectType) || !string.IsNullOrWhiteSpace(otherTemp.ObjectType)) { var objectTypeMatch = uriTemp.ObjectType.EqualsIgnoreCase(otherTemp.ObjectType); var objectIdMatch = objectTypeMatch && (uriTemp.ObjectId?.IsMatch(otherTemp.ObjectId) ?? string.IsNullOrWhiteSpace(otherTemp.ObjectId)); if (!objectIdMatch) { valid = false; break; } uriTemp = getObjectType(uriHierarchy, --uriIndex); otherTemp = getObjectType(otherHierarchy, --otherIndex); } return(valid || isBaseUri(uriTemp) && isBaseUri(otherTemp)); }
/// <summary> /// Gets the data schema version for the specified uri. /// </summary> /// <param name="uri">The URI.</param> /// <returns>The data schema version.</returns> public static string GetDataSchemaVersion(this EtpUri uri) { return(uri.IsRelatedTo(Eml210) ? Witsml200.Version : uri.Version); }
private void GetResources <T>(IEtpAdapter etpAdapter, string uri, IList <T> resources) where T : IResource { if (EtpUris.IsRootUri(uri)) { resources.Add(etpAdapter.NewProtocol(EtpUris.Witsml200, "WITSML Store (2.0)")); resources.Add(etpAdapter.NewProtocol(EtpUris.Eml210, "EML Common (2.1)")); return; } var etpUri = new EtpUri(uri); var parentUri = etpUri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(etpUri.Query)) { parentUri = new EtpUri(parentUri + etpUri.Query); } if (!etpUri.IsRelatedTo(EtpUris.Witsml200)) { return; } if (etpUri.IsBaseUri) { CreateFoldersByObjectType(etpAdapter, etpUri) .ForEach(resources.Add); } else if (string.IsNullOrWhiteSpace(etpUri.ObjectId)) { var isChannelDataAdapterEnabled = WitsmlSettings.IsChannelDataAdapterEnabled; if (!isChannelDataAdapterEnabled && ObjectTypes.ChannelSet.EqualsIgnoreCase(etpUri.ObjectType) && ObjectTypes.Log.EqualsIgnoreCase(parentUri.ObjectType)) { var log = _logDataProvider.Get(parentUri); log?.ChannelSet?.ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri))); } else if (!isChannelDataAdapterEnabled && ObjectTypes.Channel.EqualsIgnoreCase(etpUri.ObjectType) && ObjectTypes.ChannelSet.EqualsIgnoreCase(parentUri.ObjectType)) { var set = _channelSetDataProvider.Get(parentUri); set?.Channel?.ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri))); } else { var objectType = ObjectTypes.GetObjectType(etpUri.ObjectType, etpUri.Version); var contentType = EtpContentTypes.GetContentType(objectType); var hasChildren = contentType.IsRelatedTo(EtpContentTypes.Eml210) ? 0 : -1; var dataProvider = GetDataProvider(etpUri.ObjectType); dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => resources.Add(ToResource(etpAdapter, x, parentUri, hasChildren))); } } else if (ObjectTypes.Log.EqualsIgnoreCase(etpUri.ObjectType)) { var log = _logDataProvider.Get(etpUri); var hasChildren = log?.ChannelSet?.Count ?? 0; CreateFoldersByObjectType(etpAdapter, etpUri, "Log", ObjectTypes.ChannelSet, hasChildren) .ForEach(resources.Add); } else if (ObjectTypes.ChannelSet.EqualsIgnoreCase(etpUri.ObjectType)) { var set = _channelSetDataProvider.Get(etpUri); var hasChildren = set?.Channel?.Count ?? 0; CreateFoldersByObjectType(etpAdapter, etpUri, "ChannelSet", ObjectTypes.Channel, hasChildren) .ForEach(resources.Add); } else { var propertyName = etpUri.ObjectType.ToPascalCase(); CreateFoldersByObjectType(etpAdapter, etpUri, propertyName) .ForEach(resources.Add); } }
/// <summary> /// Gets a collection of resources associated to the specified URI. /// </summary> /// <param name="args">The <see cref="ProtocolEventArgs{GetResources, IList}"/> instance containing the event data.</param> public void GetResources(ProtocolEventArgs <GetResources, IList <Resource> > args) { if (EtpUri.IsRoot(args.Message.Uri)) { args.Context.Add(DiscoveryStoreProvider.NewProtocol(EtpUris.Witsml200, "WITSML Store (2.0)")); return; } var uri = new EtpUri(args.Message.Uri); var parentUri = uri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(uri.Query)) { parentUri = new EtpUri(parentUri + uri.Query); } if (!uri.IsRelatedTo(EtpUris.Witsml200) && !uri.IsRelatedTo(EtpUris.Eml210)) { return; } if (uri.IsBaseUri) { CreateFoldersByObjectType(uri) .ForEach(args.Context.Add); } else if (string.IsNullOrWhiteSpace(uri.ObjectId)) { var wellboreUri = parentUri.Parent; // Append query string, if any if (!string.IsNullOrWhiteSpace(uri.Query)) { wellboreUri = new EtpUri(wellboreUri + uri.Query); } if (ObjectFolders.Logs.EqualsIgnoreCase(uri.ObjectType)) { var logs = _logDataProvider.GetAll(wellboreUri); var timeCount = logs.Count(x => ObjectFolders.Time.EqualsIgnoreCase(x.TimeDepth)); var depthCount = logs.Count(x => ObjectFolders.Depth.EqualsIgnoreCase(x.TimeDepth)); var otherCount = logs.Count - (timeCount + depthCount); args.Context.Add(DiscoveryStoreProvider.NewFolder(uri, ObjectTypes.Log, ObjectFolders.Time, timeCount)); args.Context.Add(DiscoveryStoreProvider.NewFolder(uri, ObjectTypes.Log, ObjectFolders.Depth, depthCount)); if (otherCount > 0) { args.Context.Add(DiscoveryStoreProvider.NewFolder(uri, ObjectTypes.Log, ObjectFolders.Other, otherCount)); } } else if (ObjectFolders.Logs.EqualsIgnoreCase(parentUri.ObjectType) && (ObjectFolders.Time.EqualsIgnoreCase(uri.ObjectType) || ObjectFolders.Depth.EqualsIgnoreCase(uri.ObjectType) || ObjectFolders.Other.EqualsIgnoreCase(uri.ObjectType))) { var logs = _logDataProvider.GetAll(wellboreUri).AsEnumerable(); logs = ObjectFolders.Other.EqualsIgnoreCase(uri.ObjectType) ? logs.Where(x => !ObjectFolders.Time.EqualsIgnoreCase(x.TimeDepth) && !ObjectFolders.Depth.EqualsIgnoreCase(x.TimeDepth)) : logs.Where(x => x.TimeDepth.EqualsIgnoreCase(uri.ObjectType)); logs.ForEach(x => args.Context.Add(ToResource(x))); } else if (ObjectFolders.ChannelSets.EqualsIgnoreCase(uri.ObjectType) && ObjectTypes.Log.EqualsIgnoreCase(parentUri.ObjectType)) { var log = _logDataProvider.Get(parentUri); log?.ChannelSet?.ForEach(x => args.Context.Add(ToResource(x))); } else if (ObjectFolders.Channels.EqualsIgnoreCase(uri.ObjectType) && ObjectTypes.ChannelSet.EqualsIgnoreCase(parentUri.ObjectType)) { var set = _channelSetDataProvider.Get(parentUri); set?.Channel?.ForEach(x => args.Context.Add(ToResource(set, x))); } else { var dataProvider = GetDataProvider(uri.ObjectType); var hasChildren = uri.IsRelatedTo(EtpUris.Eml210) ? 0 : -1; dataProvider .GetAll(parentUri) .Cast <AbstractObject>() .ForEach(x => args.Context.Add(ToResource(x, hasChildren))); } } else if (ObjectTypes.Log.EqualsIgnoreCase(uri.ObjectType)) { var log = _logDataProvider.Get(uri); var hasChildren = log?.ChannelSet?.Count ?? 0; CreateFoldersByObjectType(uri, "Log", ObjectTypes.ChannelSet, hasChildren) .ForEach(args.Context.Add); } else if (ObjectTypes.ChannelSet.EqualsIgnoreCase(uri.ObjectType)) { var set = _channelSetDataProvider.Get(uri); var hasChildren = set?.Channel?.Count ?? 0; CreateFoldersByObjectType(uri, "ChannelSet", ObjectTypes.Channel, hasChildren) .ForEach(args.Context.Add); } else { var propertyName = ObjectTypes.PluralToSingle(uri.ObjectType).ToPascalCase(); CreateFoldersByObjectType(uri, propertyName) .ForEach(args.Context.Add); } }