/// <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))); } }
private IList <Resource> CreateFoldersByObjectType(EtpUri uri, string propertyName = null, string additionalObjectType = null, int childCount = 0) { if (!_contentTypes.Any()) { var contentTypes = new List <EtpContentType>(); Providers.ForEach(x => x.GetSupportedObjects(contentTypes)); contentTypes .Where(x => x.IsRelatedTo(EtpContentTypes.Eml210) || x.IsRelatedTo(EtpContentTypes.Witsml200)) .OrderBy(x => x.ObjectType) .ForEach(_contentTypes.Add); } return(_contentTypes .Select(x => new { ContentType = x, DataType = ObjectTypes.GetObjectType(x.ObjectType, DataSchemaVersion) }) .Select(x => new { x.ContentType, x.DataType, PropertyInfo = string.IsNullOrWhiteSpace(propertyName) ? null : x.DataType.GetProperty(propertyName), ReferenceInfo = x.DataType.GetProperties().FirstOrDefault(p => p.PropertyType == typeof(DataObjectReference)) }) .Where(x => { // Top level folders if (string.IsNullOrWhiteSpace(uri.ObjectId) || string.IsNullOrWhiteSpace(propertyName)) { return x.ContentType.IsRelatedTo(EtpContentTypes.Witsml200); // || x.ReferenceInfo == null; } // Data object sub folders, e.g. Well and Wellbore return (x.ContentType.IsRelatedTo(EtpContentTypes.Eml210) && x.ReferenceInfo != null) || x.PropertyInfo?.PropertyType == typeof(DataObjectReference) || x.ContentType.ObjectType.EqualsIgnoreCase(additionalObjectType) || ObjectTypes.IsDecoratorObject(x.ContentType.ObjectType); }) .Select(x => { var folderName = ObjectTypes.SingleToPlural(x.ContentType.ObjectType, false).ToPascalCase(); var dataProvider = GetDataProvider(x.ContentType.ObjectType); var hasChildren = childCount; // Query for child object count if this is not the specified "additionalObjectType" if (!x.ContentType.ObjectType.EqualsIgnoreCase(additionalObjectType)) { hasChildren = dataProvider.Count(uri); } return DiscoveryStoreProvider.NewFolder(uri, x.ContentType, folderName, hasChildren); }) .ToList()); }
/// <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); } }