Esempio n. 1
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);
                        }
                    }
Esempio n. 2
0
        // TODO: Put strings into the resources.
        // TODO_HIGH: Реализовать поддержку переменных среды (%var%).
        //
        protected virtual DirectoryInfo GetLocationDirectory(IMetadataLoadContext loadCtx)
        {
            loadCtx.EnsureNotNull(nameof(loadCtx));
            //
            var locationUri = LocationUri;

            if (locationUri.IsAbsoluteUri)
            {
                return(new DirectoryInfo(locationUri.LocalPath));
            }
            else
            {
                var path = locationUri.ExpandEnvironmentVariables();
                if (Path.IsPathRooted(path))
                {
                    return(new DirectoryInfo(path));
                }
                else
                {
                    Uri baseUri;
                    try {
                        baseUri = loadCtx.BaseUri;
                        baseUri.Arg($"{nameof(loadCtx)}.{nameof(loadCtx.BaseUri)}").EnsureFileScheme().EnsureLoopbackOrUnc();
                    }
                    catch (Exception exception) {
                        throw
                            new EonException(
                                message: $"Базовый URI контекста загрузки метаданных не может быть использован для разрешения полного пути к требуемой директории расположения метаданных.{Environment.NewLine}\tКонтекст загрузки:{loadCtx.FmtStr().GNLI2()}{Environment.NewLine}\tТребуемая директория: '{locationUri.FmtStr().G()}'.",
                                innerException: exception);
                    }
                    return(new DirectoryInfo(Path.Combine(path1: Path.GetDirectoryName(baseUri.LocalPath), path2: path)));
                }
            }
        }