internal PackageResourceDependencies(PackageExplorer packageExplorer, PackageResourceMetadataModel metadataModel)
        {
            this.packageExplorer = packageExplorer;
            dependencies         = new List <PackageResourceDependency>();

            if (metadataModel.Dependencies != null)
            {
                foreach (var importerDependency in metadataModel.Dependencies)
                {
                    dependencies.Add(
                        new PackageResourceDependency(packageExplorer, importerDependency));
                }
            }
        }
Example #2
0
        public void PerformBuild(IArchiveDirectory destination)
        {
            var serializer = new JsonSerializer()
            {
                Formatting = Formatting.None
            };

            var manifest = destination.Files.GetFile("definition.json");

            using (var zipStream = manifest.OpenWrite())
            {
                var packageDefinition = new PackageDefinition(new PackageDefinitionProperties()
                {
                    Name    = Project.Definition?.Properties.Name,
                    Version = Project.Definition?.Properties.Version
                });

                string json  = JsonConvert.SerializeObject(packageDefinition);
                byte[] bytes = Encoding.UTF8.GetBytes(json);
                zipStream.Write(bytes, 0, bytes.Length);
            }

            var tagsEntry    = destination.Files.GetFile("tags.json");
            var tagsDocument = new Dictionary <string, List <string> >();

            foreach (var projectTagCategory in Project.Tags)
            {
                if (!tagsDocument.TryGetValue(projectTagCategory.Key, out var taggedResources))
                {
                    taggedResources = new List <string>();
                    tagsDocument[projectTagCategory.Key] = taggedResources;
                }
                taggedResources.AddRange(projectTagCategory.Value.Select(tag => tag.FullName));
            }
            WriteJsonDocument(tagsEntry, tagsDocument);

            long currentProgress = 0;

            var maxThread = new SemaphoreSlim(destination.Archive.MaximumWriteThreads);
            var tasks     = new List <Task>();
            int failed    = 0;

            foreach (var resource in Project.Resources)
            {
                maxThread.Wait();
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    var exporter        = Pipeline.GetExporter(resource);
                    string contentName  = $"data/{resource.FullName}";
                    string metadataName = $"data/{resource.FullName}.pkgmeta";

                    Pipeline.BuildActions.OnBeforeExportResource(this, resource);

                    if (exporter == null)
                    {
                        // contentEntry = archive.CreateEntryFromFile(resource.Content.ArchiveEntry.FullName, contentName, CompressionLevel.Optimal);

                        var contentEntry = destination.Files.GetFile(contentName);

                        using var stream    = resource.Content.LoadStream();
                        using var zipStream = contentEntry.OpenWrite();

                        stream.CopyTo(zipStream);
                    }
                    else
                    {
                        try
                        {
                            exporter.BuildResource(resource, destination);
                        }
                        catch (Exception exception)
                        {
                            Console.WriteLine($"ERROR: Failed to export {resource.FullName}: {exception}");
                            failed++;
                        }
                    }

                    var dependencies = new PackageResourceMetadataDependencyModel[resource.Dependencies.Count];
                    for (int i = 0; i < dependencies.Length; i++)
                    {
                        var dependency  = resource.Dependencies[i];
                        dependencies[i] = new PackageResourceMetadataDependencyModel()
                        {
                            Resource = dependency.Key
                        };
                    }
                    var metadata = new PackageResourceMetadataModel()
                    {
                        Dependencies = dependencies
                    };

                    var metadataEntry = destination.Files.GetFile(metadataName);
                    using (var zipStream = metadataEntry.OpenWrite())
                        using (var streamWriter = new StreamWriter(zipStream))
                        {
                            serializer.Serialize(streamWriter, metadata);
                        }

                    currentProgress += resource.UncompressedSize;
                    Progress         = currentProgress / (double)Project.UncompressedSize;

                    Pipeline.BuildActions.OnAfterExportResource(this, resource);
                }, TaskCreationOptions.LongRunning)
                          .ContinueWith((task) =>
                {
                    tasks.Remove(task);
                    return(maxThread.Release());
                }));
            }
            Task.WaitAll(tasks.ToArray());

            if (failed > 0)
            {
                throw new InvalidOperationException($"Failed to export {failed} resources.");
            }
        }
Example #3
0
        internal PackageResource(PackageExplorer packageExplorer, PackageDirectory directory, IReadOnlyArchiveFile contentEntry, PackageResourceMetadataModel metadataModel)
        {
            Explorer     = packageExplorer;
            Directory    = directory;
            Dependencies = new PackageResourceDependencies(packageExplorer, metadataModel);
            Tags         = new PackageResourceTags();

            Name = contentEntry.Name;

            string withoutData = contentEntry.FullName.Substring(5);

            FullName = withoutData;

            Content = new PackageResourceContent(packageExplorer, contentEntry.FullName, contentEntry);

            int dotIndex = contentEntry.FullName.LastIndexOf('.');

            Extension = dotIndex != -1
                                ? contentEntry.FullName.Substring(dotIndex)
                                : null;
        }