Esempio n. 1
0
        public static bool TryParseMetadataNames(IEnumerable<string> values, out ImmutableArray<MetadataName> metadataNames)
        {
            ImmutableArray<MetadataName>.Builder builder = null;

            foreach (string value in values)
            {
                if (!MetadataName.TryParse(value, out MetadataName metadataName))
                {
                    WriteLine($"Unable to parse metadata name '{value}'.", Verbosity.Quiet);
                    return false;
                }

                (builder ?? (builder = ImmutableArray.CreateBuilder<MetadataName>())).Add(metadataName);
            }

            metadataNames = builder?.ToImmutableArray() ?? ImmutableArray<MetadataName>.Empty;

            return true;
        }
Esempio n. 2
0
        public static void TestTryParse3()
        {
            const string x = "+Foo";

            Assert.False(MetadataName.TryParse(x, out MetadataName _));
        }
Esempio n. 3
0
        public static void TestTryParse_Null()
        {
            const string x = null;

            Assert.False(MetadataName.TryParse(x, out MetadataName _));
        }
Esempio n. 4
0
        public static void TestTryParse6()
        {
            const string x = "A+B.C+D";

            Assert.False(MetadataName.TryParse(x, out MetadataName _));
        }
Esempio n. 5
0
        // TODO: Put strings into the resources.
        // TODO_HIGH: Use SubjectMaterializer component to load metadata.
        //
        protected override async Task <IVh <IMetadata> > DoLoadMetadataAsync(IMetadataLoadContext loadCtx)
        {
            loadCtx.EnsureNotNull(nameof(loadCtx));
            //
            loadCtx.ThrowIfCancellationRequested();
            await Task.CompletedTask;

            return(doLoad());

            //
            IVh <IMetadata> doLoad()
            {
                var locDeserializedObjectAsIDisposable = default(IDisposable);

                try {
                    var locFormatMediaTypeName = FormatMediaTypeName;
                    var locLocationUri         = LocationUri;
                    //
                    string locLoadFilePath;
                    if (locLocationUri.IsAbsoluteUri)
                    {
                        locLoadFilePath = locLocationUri.LocalPath;
                    }
                    else
                    {
                        var    locBaseUri = loadCtx.BaseUri;
                        string locBaseUriValidationErrorMessage;
                        if (!locBaseUri.IsAbsoluteUri)
                        {
                            throw
                                new EonException(
                                    message: $"Базовый URI контекста загрузки метаданных не может быть использован для разрешения полного пути к файлу загрузки метаданных '{locLocationUri}'.{Environment.NewLine}{FormatXResource(typeof(Uri), "NotAbsoluteUri", locBaseUri.FmtStr().G())}{Environment.NewLine}\tКонтекст загрузки:{loadCtx.FmtStr().GNLI()}");
                        }
                        else if (!P_IsLocationUriValid(locBaseUri, out locBaseUriValidationErrorMessage))
                        {
                            throw
                                new EonException(
                                    message: $"Базовый URI контекста загрузки метаданных не может быть использован для разрешения полного пути к файлу загрузки метаданных '{locLocationUri}'.{Environment.NewLine}{locBaseUriValidationErrorMessage}{Environment.NewLine}\tКонтекст загрузки:{loadCtx.FmtStr().GNLI2()}");
                        }
                        locLoadFilePath = Path.Combine(Path.GetDirectoryName(locBaseUri.LocalPath), locLocationUri.ToString());
                    }
                    var locLoadFile = new FileInfo(locLoadFilePath);
                    if (!locLoadFile.Exists)
                    {
                        throw new FileNotFoundException(FormatXResource(locator: typeof(FileNotFoundException), subpath: null, args: new[] { locLoadFile.FullName }), locLoadFile.FullName);
                    }
                    //
                    IMetadata locLoadedMetadata;
                    object    locDeserializedObject;
                    if (IsXmlMediaType(locFormatMediaTypeName))
                    {
                        try {
                            using (var locFileStream = locLoadFile.OpenRead())
                                using (var locXmlReader = XmlReader.Create(locFileStream, loadCtx.CreateXmlReaderSettings())) {
                                    var locSerializer = loadCtx.CreateXmlObjectSerializer(typeof(object));
                                    locDeserializedObjectAsIDisposable = (locDeserializedObject = locSerializer.ReadObject(reader: locXmlReader, verifyObjectName: false)) as IDisposable;
                                }
                            if (locDeserializedObject is IMetadata locMetadata)
                            {
                                if (locMetadata.IsAutoName && MetadataName.TryParse(value: Path.GetFileNameWithoutExtension(path: locLoadFile.Name), result: out var metadataName))
                                {
                                    locMetadata.Name = metadataName;
                                }
                                locLoadedMetadata = locMetadata;
                            }
                            else if (!(locDeserializedObject is null))
                            {
                                throw new EonException(message: $"Десериализованный объект имеет тип '{locDeserializedObject.GetType()}', который не совместим с типом '{typeof(IMetadata)}'.");
                            }
                            else
                            {
                                locLoadedMetadata = null;
                            }
                        }
                        catch (Exception exception) {
                            throw new EonException(message: $"Ошибка загрузки объекта из файла.{Environment.NewLine}\tФайл:{locLoadFile.FullName.FmtStr().GNLI2()}.", innerException: exception);
                        }
                    }