Exemplo n.º 1
0
        public static async Task BinderateAsync(BindingConfig config)
        {
            MavenRepository maven;

            if (config.MavenRepositoryType == MavenRepoType.Directory)
            {
                maven = MavenRepository.FromDirectory(config.MavenRepositoryLocation);
            }
            else if (config.MavenRepositoryType == MavenRepoType.Url)
            {
                maven = MavenRepository.FromUrl(config.MavenRepositoryLocation);
            }
            else if (config.MavenRepositoryType == MavenRepoType.MavenCentral)
            {
                maven = MavenRepository.FromMavenCentral();
            }
            else
            {
                maven = MavenRepository.FromGoogle();
            }

            await maven.Refresh(config.MavenArtifacts.Where(ma => !ma.DependencyOnly).Select(ma => ma.GroupId).Distinct().ToArray());

            if (config.DownloadExternals)
            {
                var artifactDir = Path.Combine(config.BasePath, config.ExternalsDir);
                if (!Directory.Exists(artifactDir))
                {
                    Directory.CreateDirectory(artifactDir);
                }
            }

            await ProcessConfig(maven, config);
        }
Exemplo n.º 2
0
        public static MavenRepository GetMavenRepository(BindingConfig config, MavenArtifactConfig artifact)
        {
            var(type, location) = GetMavenInfoForArtifact(config, artifact);
            var repo = GetOrCreateRepository(type, location);

            return(repo);
        }
Exemplo n.º 3
0
        static bool ShouldIncludeDependency(BindingConfig config, MavenArtifactConfig artifact, Dependency dependency, List <Exception> exceptions)
        {
            // We always care about 'compile' scoped dependencies
            if (dependency.IsCompileDependency())
            {
                return(true);
            }

            // If we're not processing Runtime dependencies then ignore the rest
            if (!config.StrictRuntimeDependencies)
            {
                return(false);
            }

            // The only other thing we may care about is 'runtime', bail if this isn't 'runtime'
            if (!dependency.IsRuntimeDependency())
            {
                return(false);
            }

            // Check 'artifact' list
            if (artifact.ExcludedRuntimeDependencies.OrEmpty().Split(',').Contains(dependency.GroupAndArtifactId(), StringComparer.OrdinalIgnoreCase))
            {
                return(false);
            }

            // Check 'global' list
            if (config.ExcludedRuntimeDependencies.OrEmpty().Split(',').Contains(dependency.GroupAndArtifactId(), StringComparer.OrdinalIgnoreCase))
            {
                return(false);
            }

            return(true);
        }
Exemplo n.º 4
0
        public static async Task Initialize(BindingConfig config)
        {
            var artifact_mavens = new List <(MavenRepository, MavenArtifactConfig)>();

            foreach (var artifact in config.MavenArtifacts.Where(ma => !ma.DependencyOnly))
            {
                var(type, location) = GetMavenInfoForArtifact(config, artifact);
                var repo = GetOrCreateRepository(type, location);

                artifact_mavens.Add((repo, artifact));
            }

            foreach (var maven_group in artifact_mavens.GroupBy(a => a.Item1))
            {
                var maven     = maven_group.Key;
                var artifacts = maven_group.Select(a => a.Item2);

                foreach (var artifact_group in artifacts.GroupBy(a => a.GroupId))
                {
                    var gid          = artifact_group.Key;
                    var artifact_ids = artifact_group.Select(a => a.ArtifactId).ToArray();

                    await maven.Populate(gid, artifact_ids);
                }
            }
        }
        public string GetOutputFile(BindingConfig config, BindingProjectModel model)
        {
            var p = OutputFileRule
                    .Replace("{generated}", config.GeneratedDir)
                    .Replace("{groupid}", model.MavenGroupId)
                    .Replace("{artifactid}", model.MavenArtifacts?.FirstOrDefault()?.MavenArtifactId ?? "")
                    .Replace("{name}", model.Name)
                    .Replace("{nugetid}", model.NuGetPackageId);

            return(System.IO.Path.Combine(config.BasePath, p));
        }
Exemplo n.º 6
0
        static (MavenRepoType type, string location) GetMavenInfoForArtifact(BindingConfig config, MavenArtifactConfig artifact)
        {
            var template = config.GetTemplateSet(artifact.TemplateSet);

            if (template.MavenRepositoryType.HasValue)
            {
                return(template.MavenRepositoryType.Value, template.MavenRepositoryLocation);
            }

            return(config.MavenRepositoryType, config.MavenRepositoryLocation);
        }
Exemplo n.º 7
0
        public static async Task BinderateAsync(BindingConfig config)
        {
            // Prime our Maven repositories
            await MavenFactory.Initialize(config);

            if (config.DownloadExternals)
            {
                var artifactDir = Path.Combine(config.BasePath, config.ExternalsDir);
                if (!Directory.Exists(artifactDir))
                {
                    Directory.CreateDirectory(artifactDir);
                }
            }

            await ProcessConfig(config);
        }
Exemplo n.º 8
0
        static async Task ProcessConfig(MavenRepository maven, BindingConfig config)
        {
            var mavenProjects = new Dictionary <string, Project>();
            var mavenGroups   = new List <MavenGroup>();

            foreach (var artifact in config.MavenArtifacts)
            {
                if (artifact.DependencyOnly)
                {
                    continue;
                }

                var mavenGroup = maven.Groups.FirstOrDefault(g => g.Id == artifact.GroupId);

                Project project = null;

                project = await maven.GetProjectAsync(artifact.GroupId, artifact.ArtifactId, artifact.Version);

                if (project != null)
                {
                    mavenProjects.Add($"{artifact.GroupId}/{artifact.ArtifactId}-{artifact.Version}", project);
                }
            }

            if (config.DownloadExternals)
            {
                await DownloadArtifacts(maven, config, mavenProjects);
            }

            var slnProjModels = new Dictionary <string, BindingProjectModel>();

            foreach (var template in config.Templates)
            {
                var models = BuildProjectModels(config, template, mavenProjects);

                var json = Newtonsoft.Json.JsonConvert.SerializeObject(models);

                if (config.Debug.DumpModels)
                {
                    File.WriteAllText(Path.Combine(config.BasePath, "models.json"), json);
                }

                var inputTemplateFile = Path.Combine(config.BasePath, template.TemplateFile);
                var templateSrc       = File.ReadAllText(inputTemplateFile);

                var engine = new RazorLightEngineBuilder()
                             .UseMemoryCachingProvider()
                             .Build();

                foreach (var model in models)
                {
                    var outputFile = new FileInfo(template.GetOutputFile(config, model));
                    if (!outputFile.Directory.Exists)
                    {
                        outputFile.Directory.Create();
                    }

                    string result = await engine.CompileRenderAsync(inputTemplateFile, templateSrc, model);

                    File.WriteAllText(outputFile.FullName, result);

                    // We want to collect all the models for the .csproj's so we can add them to a .sln file after
                    if (!slnProjModels.ContainsKey(outputFile.FullName) && template.OutputFileRule.EndsWith(".csproj"))
                    {
                        slnProjModels.Add(outputFile.FullName, model);
                    }
                }
            }

            if (!string.IsNullOrEmpty(config.SolutionFile))
            {
                var slnPath = Path.Combine(config.BasePath ?? AppDomain.CurrentDomain.BaseDirectory, config.SolutionFile);
                var sln     = SolutionFileBuilder.Build(config, slnProjModels);
                File.WriteAllText(slnPath, sln);
            }
        }
Exemplo n.º 9
0
        static List <BindingProjectModel> BuildProjectModels(BindingConfig config, TemplateConfig template, Dictionary <string, Project> mavenProjects)
        {
            var projectModels = new List <BindingProjectModel>();

            var baseMetadata = new Dictionary <string, string>();

            MergeValues(baseMetadata, config.Metadata);
            MergeValues(baseMetadata, template.Metadata);

            foreach (var mavenArtifact in config.MavenArtifacts)
            {
                if (mavenArtifact.DependencyOnly)
                {
                    continue;
                }

                if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject))
                {
                    continue;
                }

                var artifactMetadata = new Dictionary <string, string>();
                MergeValues(artifactMetadata, baseMetadata);
                MergeValues(artifactMetadata, mavenArtifact.Metadata);

                var projectModel = new BindingProjectModel
                {
                    Name               = mavenArtifact.ArtifactId,
                    NuGetPackageId     = mavenArtifact.NugetPackageId,
                    NuGetVersionBase   = mavenArtifact.NugetVersion,
                    NuGetVersionSuffix = config.NugetVersionSuffix,
                    MavenGroupId       = mavenArtifact.GroupId,
                    AssemblyName       = mavenArtifact.AssemblyName,
                    Metadata           = artifactMetadata,
                    Config             = config
                };
                projectModels.Add(projectModel);


                var artifactDir        = Path.Combine(config.BasePath, config.ExternalsDir, mavenArtifact.GroupId);
                var artifactFile       = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}");
                var md5File            = artifactFile + ".md5";
                var sha256File         = artifactFile + ".sha256";
                var md5                = File.Exists(md5File) ? File.ReadAllText(md5File) : string.Empty;
                var sha256             = File.Exists(sha256File) ? File.ReadAllText(sha256File) : string.Empty;
                var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId);

                var proguardFile = Path.Combine(artifactExtractDir, "proguard.txt");

                projectModel.MavenArtifacts.Add(new MavenArtifactModel
                {
                    MavenGroupId           = mavenArtifact.GroupId,
                    MavenArtifactId        = mavenArtifact.ArtifactId,
                    MavenArtifactPackaging = mavenProject.Packaging,
                    MavenArtifactVersion   = mavenArtifact.Version,
                    MavenArtifactMd5       = md5,
                    MavenArtifactSha256    = sha256,
                    ProguardFile           = File.Exists(proguardFile) ? GetRelativePath(proguardFile, config.BasePath).Replace("/", "\\") : null,
                    Metadata = artifactMetadata,
                });


                // Gather maven dependencies to try and map out nuget dependencies
                foreach (var mavenDep in mavenProject.Dependencies)
                {
                    // We only really care about 'compile' scoped dependencies (also null/blank means compile)
                    if (!string.IsNullOrEmpty(mavenDep.Scope) && !mavenDep.Scope.ToLowerInvariant().Equals("compile"))
                    {
                        continue;
                    }

                    mavenDep.Version = FixVersion(mavenDep.Version);

                    var depMapping = config.MavenArtifacts.FirstOrDefault(
                        ma => !string.IsNullOrEmpty(ma.Version) &&
                        ma.GroupId == mavenDep.GroupId &&
                        ma.ArtifactId == mavenDep.ArtifactId &&
                        mavenDep.Satisfies(ma.Version));

                    if (depMapping == null)
                    {
                        throw new Exception($"No matching artifact config found for: {mavenDep.GroupId}.{mavenDep.ArtifactId}:{mavenDep.Version} to satisfy dependency of: {mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}:{mavenArtifact.Version}");
                    }

                    var dependencyMetadata = new Dictionary <string, string>();
                    MergeValues(dependencyMetadata, baseMetadata);
                    MergeValues(dependencyMetadata, depMapping.Metadata);

                    projectModel.NuGetDependencies.Add(new NuGetDependencyModel
                    {
                        IsProjectReference = !depMapping.DependencyOnly,
                        NuGetPackageId     = depMapping.NugetPackageId,
                        NuGetVersionBase   = depMapping.NugetVersion,
                        NuGetVersionSuffix = config.NugetVersionSuffix,
                        Metadata           = dependencyMetadata,

                        MavenArtifact = new MavenArtifactModel
                        {
                            MavenGroupId         = mavenDep.GroupId,
                            MavenArtifactId      = mavenDep.ArtifactId,
                            MavenArtifactVersion = mavenDep.Version,
                            MavenArtifactMd5     = md5,
                            MavenArtifactSha256  = sha256,
                            DownloadedArtifact   = artifactFile,
                            Metadata             = dependencyMetadata,
                        }
                    });
                }
            }

            return(projectModels);
        }
Exemplo n.º 10
0
        static async Task DownloadArtifacts(MavenRepository maven, BindingConfig config, Dictionary <string, Project> mavenProjects)
        {
            var httpClient = new HttpClient();

            foreach (var mavenArtifact in config.MavenArtifacts)
            {
                // Skip downloading dependencies
                if (mavenArtifact.DependencyOnly)
                {
                    continue;
                }

                var version = mavenArtifact.Version;

                if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject))
                {
                    continue;
                }

                var artifactDir = Path.Combine(
                    config.BasePath,
                    config.ExternalsDir,
                    mavenArtifact.GroupId);
                var artifactFile = Path.Combine(artifactDir, config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}.{mavenProject.Packaging}"
                                        : $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}");
                var md5File     = artifactFile + ".md5";
                var sha256File  = artifactFile + ".sha256";
                var sourcesFile = Path.Combine(artifactDir, config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}-sources.jar"
                                        : $"{mavenArtifact.ArtifactId}-sources.jar");
                var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId);

                if (!Directory.Exists(artifactDir))
                {
                    Directory.CreateDirectory(artifactDir);
                }
                if (!Directory.Exists(artifactExtractDir))
                {
                    Directory.CreateDirectory(artifactExtractDir);
                }

                var mvnArt = maven.Groups.FirstOrDefault(g => g.Id == mavenArtifact.GroupId)?.Artifacts?.FirstOrDefault(a => a.Id == mavenArtifact.ArtifactId);

                // Download artifact
                using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging))
                    using (var sw = File.Create(artifactFile))
                        await astrm.CopyToAsync(sw);

                // Determine MD5
                try
                {
                    // First try download
                    using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".md5"))
                        using (var sw = File.Create(md5File))
                            await astrm.CopyToAsync(sw);
                }
                catch
                {
                    // Then hash the downloaded artifact
                    using (var file = File.OpenRead(artifactFile))
                        File.WriteAllText(md5File, Util.HashMd5(file));
                }

                // Determine Sha256
                try
                {
                    // First try download, this almost certainly won't work
                    // but in case Maven ever starts supporting sha256 it should start
                    // they currently support .sha1 so there's no reason to believe the naming
                    // convention should be any different, and one day .sha256 may exist
                    using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".sha256"))
                        using (var sw = File.Create(sha256File))
                            await astrm.CopyToAsync(sw);
                }
                catch
                {
                    // Create Sha256 hash if we couldn't download
                    using (var file = File.OpenRead(artifactFile))
                        File.WriteAllText(sha256File, Util.HashSha256(file));
                }

                if (config.DownloadJavaSourceJars)
                {
                    try
                    {
                        using (var astrm = await maven.OpenArtifactSourcesFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version))
                            using (var sw = File.Create(sourcesFile))
                                await astrm.CopyToAsync(sw);
                    }
                    catch { }
                }

                if (Directory.Exists(artifactExtractDir))
                {
                    Directory.Delete(artifactExtractDir, true);
                }

                // Unzip artifact into externals
                if (mavenProject.Packaging.ToLowerInvariant() == "aar")
                {
                    ZipFile.ExtractToDirectory(artifactFile, artifactExtractDir);
                }
            }
        }
Exemplo n.º 11
0
        static async Task DownloadArtifacts(MavenRepository maven, BindingConfig config, Dictionary <string, Project> mavenProjects)
        {
            var httpClient = new HttpClient();

            foreach (var mavenArtifact in config.MavenArtifacts)
            {
                // Skip downloading dependencies
                if (mavenArtifact.DependencyOnly)
                {
                    continue;
                }

                var version = mavenArtifact.Version;

                if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject))
                {
                    continue;
                }

                var artifactDir = Path.Combine(
                    config.BasePath,
                    config.ExternalsDir,
                    mavenArtifact.GroupId);
                var artifactFile       = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}");
                var md5File            = artifactFile + ".md5";
                var sourcesFile        = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}-sources.jar");
                var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId);

                if (!Directory.Exists(artifactDir))
                {
                    Directory.CreateDirectory(artifactDir);
                }
                if (!Directory.Exists(artifactExtractDir))
                {
                    Directory.CreateDirectory(artifactExtractDir);
                }

                var mvnArt = maven.Groups.FirstOrDefault(g => g.Id == mavenArtifact.GroupId)?.Artifacts?.FirstOrDefault(a => a.Id == mavenArtifact.ArtifactId);

                // Download artifact
                using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging))
                    using (var sw = File.Create(artifactFile))
                        await astrm.CopyToAsync(sw);

                // Determine MD5
                try
                {
                    // First try download
                    using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".md5"))
                        using (var sw = File.Create(md5File))
                            await astrm.CopyToAsync(sw);
                }
                catch
                {
                    // Then hash the downloaded artifact
                    using (var file = File.OpenRead(artifactFile))
                        File.WriteAllText(md5File, HashMd5(file));
                }

                if (config.DownloadJavaSourceJars)
                {
                    try
                    {
                        using (var astrm = await maven.OpenArtifactSourcesFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version))
                            using (var sw = File.Create(sourcesFile))
                                await astrm.CopyToAsync(sw);
                    }
                    catch { }
                }

                if (Directory.Exists(artifactExtractDir))
                {
                    Directory.Delete(artifactExtractDir, true);
                }

                // Unzip artifact into externals
                if (mavenProject.Packaging.ToLowerInvariant() == "aar")
                {
                    ZipFile.ExtractToDirectory(artifactFile, artifactExtractDir);
                }
            }
        }
Exemplo n.º 12
0
        static List <BindingProjectModel> BuildProjectModels(BindingConfig config, TemplateConfig template, Dictionary <string, Project> mavenProjects)
        {
            var projectModels = new List <BindingProjectModel>();
            var exceptions    = new List <Exception>();

            var baseMetadata = new Dictionary <string, string>();

            MergeValues(baseMetadata, config.Metadata);
            MergeValues(baseMetadata, template.Metadata);

            foreach (var mavenArtifact in config.MavenArtifacts)
            {
                if (mavenArtifact.DependencyOnly)
                {
                    continue;
                }

                if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject))
                {
                    continue;
                }

                var artifactMetadata = new Dictionary <string, string>();
                MergeValues(artifactMetadata, baseMetadata);
                MergeValues(artifactMetadata, mavenArtifact.Metadata);

                var projectModel = new BindingProjectModel
                {
                    Name               = mavenArtifact.ArtifactId,
                    NuGetPackageId     = mavenArtifact.NugetPackageId,
                    NuGetVersionBase   = mavenArtifact.NugetVersion,
                    NuGetVersionSuffix = config.NugetVersionSuffix,
                    MavenGroupId       = mavenArtifact.GroupId,
                    AssemblyName       = mavenArtifact.AssemblyName,
                    Metadata           = artifactMetadata,
                    Config             = config
                };
                projectModels.Add(projectModel);


                var artifactDir        = Path.Combine(config.BasePath, config.ExternalsDir, mavenArtifact.GroupId);
                var artifactFile       = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}");
                var md5File            = artifactFile + ".md5";
                var sha256File         = artifactFile + ".sha256";
                var md5                = File.Exists(md5File) ? File.ReadAllText(md5File) : string.Empty;
                var sha256             = File.Exists(sha256File) ? File.ReadAllText(sha256File) : string.Empty;
                var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId);

                var proguardFile = Path.Combine(artifactExtractDir, "proguard.txt");

                projectModel.MavenArtifacts.Add(new MavenArtifactModel
                {
                    MavenGroupId           = mavenArtifact.GroupId,
                    MavenArtifactId        = mavenArtifact.ArtifactId,
                    MavenArtifactPackaging = mavenProject.Packaging,
                    MavenArtifactVersion   = mavenArtifact.Version,
                    MavenArtifactMd5       = md5,
                    MavenArtifactSha256    = sha256,
                    ProguardFile           = File.Exists(proguardFile) ? GetRelativePath(proguardFile, config.BasePath).Replace("/", "\\") : null,
                    Metadata = artifactMetadata,
                });


                // Gather maven dependencies to try and map out nuget dependencies
                foreach (var mavenDep in mavenProject.Dependencies)
                {
                    if (!ShouldIncludeDependency(config, mavenArtifact, mavenDep, exceptions))
                    {
                        continue;
                    }

                    mavenDep.Version = FixVersion(mavenDep.Version);

                    var depMapping = config.MavenArtifacts.FirstOrDefault(
                        ma => !string.IsNullOrEmpty(ma.Version) &&
                        ma.GroupId == mavenDep.GroupId &&
                        ma.ArtifactId == mavenDep.ArtifactId &&
                        mavenDep.Satisfies(ma.Version));

                    if (depMapping is null && mavenDep.IsRuntimeDependency())
                    {
                        exceptions.Add(new Exception($"Artifact '{mavenArtifact.GroupAndArtifactId}' has unknown 'Runtime' dependency '{mavenDep.GroupAndArtifactId()}'. Either fulfill or exclude this dependency."));
                        continue;
                    }

                    if (depMapping == null)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendLine($"");
                        sb.AppendLine($"No matching artifact config found for: ");
                        sb.AppendLine($"			{mavenDep.GroupId}.{mavenDep.ArtifactId}:{mavenDep.Version}");
                        sb.AppendLine($"to satisfy dependency of: ");
                        sb.AppendLine($"			{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}:{mavenArtifact.Version}");
                        sb.AppendLine($"");
                        sb.AppendLine($"	Please add following json snippet to config.json:");
                        sb.AppendLine($"");
                        sb.AppendLine
                            ($@"
      {{
        ""groupId"": ""{mavenDep.GroupId}"",
        ""artifactId"": ""{mavenDep.ArtifactId}"",
        ""version"": ""{mavenDep.Version}"",
        ""nugetVersion"": ""CHECK NUGET ID"",
        ""nugetId"": ""CHECK PREFIX {mavenDep.Version}"",
        ""dependencyOnly"": true/false
      }}
						"                        );
                        sb.AppendLine($"");
                        exceptions.Add(new Exception(sb.ToString()));
                        continue;
                    }

                    var dependencyMetadata = new Dictionary <string, string>();
                    MergeValues(dependencyMetadata, baseMetadata);
                    MergeValues(dependencyMetadata, depMapping.Metadata);

                    projectModel.NuGetDependencies.Add(new NuGetDependencyModel
                    {
                        IsProjectReference = !depMapping.DependencyOnly,
                        NuGetPackageId     = depMapping.NugetPackageId,
                        NuGetVersionBase   = depMapping.NugetVersion,
                        NuGetVersionSuffix = config.NugetVersionSuffix,
                        Metadata           = dependencyMetadata,

                        MavenArtifact = new MavenArtifactModel
                        {
                            MavenGroupId         = mavenDep.GroupId,
                            MavenArtifactId      = mavenDep.ArtifactId,
                            MavenArtifactVersion = mavenDep.Version,
                            MavenArtifactMd5     = md5,
                            MavenArtifactSha256  = sha256,
                            DownloadedArtifact   = artifactFile,
                            Metadata             = dependencyMetadata,
                        }
                    });
                }
            }

            if (exceptions.Any())
            {
                throw new AggregateException(exceptions.ToArray());
            }


            return(projectModels);
        }
Exemplo n.º 13
0
        public static string Build(BindingConfig config, Dictionary <string, BindingProjectModel> projects)
        {
            var csprojNamespaces = new XmlNamespaceManager(new NameTable());

            csprojNamespaces.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003");

            var slnFileInfo = new FileInfo(config.SolutionFile);

            // Collect all the projects to be added to the .sln
            var allProjects = new List <(string guid, string name, string key)>();

            // First go through additional projects specified in the config
            foreach (var ap in config.AdditionalProjects)
            {
                var prjPath         = Path.Combine(config.BasePath, ap);
                var prjPathFileInfo = new FileInfo(prjPath);

                if (!File.Exists(prjPath))
                {
                    throw new FileNotFoundException(prjPath);
                }

                var prjName = Path.GetFileNameWithoutExtension(prjPathFileInfo.Name);

                // Try and find an existing project guid in the .csproj
                // which might not exist if it's an SDK style project
                var xml   = XDocument.Load(prjPath);
                var xelem = xml.XPathSelectElement("/ns:Project/ns:PropertyGroup/ns:ProjectGuid", csprojNamespaces);

                var prjGuid = xelem?.Value ?? Guid.NewGuid().ToString("B");
                var prjKey  = GetRelativePath(slnFileInfo.DirectoryName, prjPathFileInfo.FullName).Replace("/", "\\");

                allProjects.Add((prjGuid, prjName, prjKey));
            }

            // Add all of the generated projects
            foreach (var p in projects)
            {
                var groupId = p.Value.MavenGroupId;
                var prjName = groupId + "." + p.Value.Name;
                var prjKey  = GetRelativePath(slnFileInfo.DirectoryName, p.Key).Replace("/", "\\");
                var prjGuid = "{" + p.Value.Id + "}";

                allProjects.Add((prjGuid, prjName, prjKey));
            }

            var s = new StringBuilder();

            s.AppendLine();
            s.AppendLine("Microsoft Visual Studio Solution File, Format Version 12.00");
            s.AppendLine("# Visual Studio 2012");

            //Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "@(project.Name)", "@(project.Name)\@(project.Name).csproj", "@(project.Id)"
            foreach (var project in allProjects)
            {
                s.AppendLine("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"" + project.name + "\", \"" + project.key + "\", \"" + project.guid + "\"");
                s.AppendLine("EndProject");
            }

            s.AppendLine("Global");

            s.AppendLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution");
            s.AppendLine("\t\tDebug|Any CPU = Debug|Any CPU");
            s.AppendLine("\t\tRelease|Any CPU = Release|Any CPU");
            s.AppendLine("\tEndGlobalSection");

            s.AppendLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution");
            foreach (var project in allProjects)
            {
                s.AppendLine("\t\t" + project.guid + ".Debug|Any CPU.ActiveCfg = Debug|Any CPU");
                s.AppendLine("\t\t" + project.guid + ".Debug|Any CPU.Build.0 = Debug|Any CPU");
                s.AppendLine("\t\t" + project.guid + ".Release|Any CPU.ActiveCfg = Release|Any CPU");
                s.AppendLine("\t\t" + project.guid + ".Release|Any CPU.Build.0 = Release|Any CPU");
            }
            s.AppendLine("\tEndGlobalSection");

            s.AppendLine("EndGlobal");

            return(s.ToString());
        }
Exemplo n.º 14
0
        // Returns artifact output path
        static async Task <string> DownloadPayload(Artifact mvnArt, MavenArtifactConfig mavenArtifact, Project mavenProject, string artifactDir, BindingConfig config)
        {
            var package_prefix = config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}." : string.Empty;

            package_prefix += $"{mavenArtifact.ArtifactId}.";

            var base_path = Path.Combine(artifactDir, package_prefix);

            if (mavenProject.Packaging == "jar" || mavenProject.Packaging == "aar")
            {
                var func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging));
                await TryDownloadFile(func, base_path + mavenProject.Packaging, ErrorLevel.Error);

                return(base_path + mavenProject.Packaging);
            }

            // Sometimes the "Packaging" isn't useful, like "bundle" for Guava or "pom" for KotlinX Coroutines.
            // In this case we're going to try "jar" and "aar" to try to find the real payload

            // Try jar
            var jar_func   = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, "jar"));
            var jar_result = await TryDownloadFile(jar_func, base_path + "jar", ErrorLevel.Ignore);

            if (jar_result)
            {
                mavenProject.Packaging = "jar";
                return(base_path + "jar");
            }

            // Try aar
            var aar_func   = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, "aar"));
            var aar_result = await TryDownloadFile(aar_func, base_path + "aar", ErrorLevel.Ignore);

            if (aar_result)
            {
                mavenProject.Packaging = "aar";
                return(base_path + "aar");
            }

            throw new Exception($"Could not find artifact payload {base_path + "jar"}. [Packaging was {mavenProject.Packaging}.]");
        }
Exemplo n.º 15
0
        static async Task DownloadArtifacts(BindingConfig config, Dictionary <string, Project> mavenProjects)
        {
            var httpClient = new HttpClient();

            foreach (var mavenArtifact in config.MavenArtifacts)
            {
                // Skip downloading dependencies
                if (mavenArtifact.DependencyOnly)
                {
                    continue;
                }

                var maven   = MavenFactory.GetMavenRepository(config, mavenArtifact);
                var version = mavenArtifact.Version;

                if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject))
                {
                    continue;
                }

                var artifactDir = Path.Combine(
                    config.BasePath,
                    config.ExternalsDir,
                    mavenArtifact.GroupId);

                var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId);

                Directory.CreateDirectory(artifactDir);
                Directory.CreateDirectory(artifactExtractDir);

                var mvnArt = maven.Groups.FirstOrDefault(g => g.Id == mavenArtifact.GroupId)?.Artifacts?.FirstOrDefault(a => a.Id == mavenArtifact.ArtifactId);

                // Download artifact
                var artifactFile = await DownloadPayload(mvnArt, mavenArtifact, mavenProject, artifactDir, config);

                // Determine MD5
                var md5File  = artifactFile + ".md5";
                var md5_func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".md5"));

                if (!(await TryDownloadFile(md5_func, md5File, ErrorLevel.Info)))
                {
                    // Then hash the downloaded artifact
                    using (var file = File.OpenRead(artifactFile))
                        File.WriteAllText(md5File, Util.HashMd5(file));
                }

                // Determine Sha256
                var sha256File = artifactFile + ".sha256";
                var sha_func   = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".sha256"));

                // First try download, this almost certainly won't work
                // but in case Maven ever starts supporting sha256 it should start
                // they currently support .sha1 so there's no reason to believe the naming
                // convention should be any different, and one day .sha256 may exist
                if (!(await TryDownloadFile(sha_func, sha256File, ErrorLevel.Ignore)))
                {
                    // Create Sha256 hash if we couldn't download
                    using (var file = File.OpenRead(artifactFile))
                        File.WriteAllText(sha256File, Util.HashSha256(file));
                }

                var base_file_name = Path.Combine(artifactDir, config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}" : $"{mavenArtifact.ArtifactId}");

                if (config.DownloadJavaSourceJars)
                {
                    var source_file = base_file_name + "-sources.jar";
                    var source_func = new Func <Task <Stream> >(() => maven.OpenArtifactSourcesFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version));
                    await TryDownloadFile(source_func, source_file, ErrorLevel.Info);
                }

                if (config.DownloadPoms)
                {
                    var pom_file = base_file_name + ".pom";
                    var pom_func = new Func <Task <Stream> >(() => maven.OpenArtifactPomFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version));
                    await TryDownloadFile(pom_func, pom_file, ErrorLevel.Info);
                }

                if (config.DownloadJavaDocJars)
                {
                    var javadoc_file = base_file_name + "-javadoc.jar";
                    var javadoc_func = new Func <Task <Stream> > (() => maven.OpenArtifactDocsFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version));
                    await TryDownloadFile(javadoc_func, javadoc_file, ErrorLevel.Info);
                }

                if (config.DownloadMetadataFiles)
                {
                    var metadata_file = base_file_name + "-metadata.xml";
                    var metadata_func = new Func <Task <Stream> >(() => maven.OpenMavenMetadataFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId));
                    await TryDownloadFile(metadata_func, metadata_file, ErrorLevel.Info);
                }

                if (Directory.Exists(artifactExtractDir))
                {
                    Directory.Delete(artifactExtractDir, true);
                }

                // Unzip artifact into externals
                if (mavenProject.Packaging.ToLowerInvariant() == "aar")
                {
                    ZipFile.ExtractToDirectory(artifactFile, artifactExtractDir);
                }
            }
        }