コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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)));
            }
        }
コード例 #3
0
        // 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));
        }
コード例 #4
0
ファイル: Eml210Provider.cs プロジェクト: wdstest/witsml
        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);
            //}
        }
コード例 #5
0
        /// <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));
                }
            }
        }
コード例 #6
0
        /// <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);
            //}
        }
コード例 #7
0
ファイル: Eml210Provider.cs プロジェクト: smg-bg/witsml
        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);
            //}
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
ファイル: Witsml131Provider.cs プロジェクト: orri93/witsml
        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;
            }
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
ファイル: Witsml200Provider.cs プロジェクト: pyerbiz/witsml
        /// <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);
            }
        }
コード例 #12
0
ファイル: Witsml131Provider.cs プロジェクト: smg-bg/witsml
        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)));
            }
        }
コード例 #13
0
        /// <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));
        }
コード例 #14
0
 /// <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);
 }
コード例 #15
0
        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);
            }
        }
コード例 #16
0
        /// <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);
            }
        }