"use strict";
/*
 * Copyright © 2020 Atomist, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractVersionedArtifact = exports.findDeclaredManagedPlugins = exports.findDeclaredPlugins = exports.findDeclaredDependencies = void 0;
const astUtils_1 = require("@atomist/automation-client/lib/tree/ast/astUtils");
const XmldocFileParser_1 = require("../../xml/XmldocFileParser");
/**
 * Return dependencies under dependencies section
 */
async function findDeclaredDependencies(p, glob = "pom.xml") {
    return findDeclaredDependenciesWith(p, "//project/dependencies/dependency", glob, {});
}
exports.findDeclaredDependencies = findDeclaredDependencies;
/**
 * Return plugins under plugins section
 */
async function findDeclaredPlugins(p, glob = "pom.xml") {
    return findDeclaredPluginsWith(p, "//project/build/plugins/plugin", glob, {});
}
exports.findDeclaredPlugins = findDeclaredPlugins;
/**
 * Return plugins under plugin management section
 */
async function findDeclaredManagedPlugins(p, glob = "pom.xml") {
    return findDeclaredPluginsWith(p, "//project/build/pluginManagement/plugins/plugin", glob, {});
}
exports.findDeclaredManagedPlugins = findDeclaredManagedPlugins;
/**
 * Find declared dependencies using the given path expression.
 * Control over the path expression allows us to look under dependencyManagement,
 * or directly in dependencies section under project
 * @param {Project} p
 * @param {string} pathExpression
 * @param {string} glob
 * @param {FunctionRegistry} functionRegistry
 * @return {Promise<Dependencies>}
 */
async function findDeclaredDependenciesWith(p, pathExpression, glob = "pom.xml", functionRegistry) {
    const dependencies = await astUtils_1.gather(p, {
        parseWith: new XmldocFileParser_1.XmldocFileParser(),
        globPatterns: glob,
        pathExpression,
        mapper: m => {
            return extractVersionedArtifact(m);
        },
        functionRegistry,
    });
    return { dependencies };
}
/**
 * Find declared plugins using the given path expression.
 * Control over the path expression allows us to look under pluginManagement,
 * or directly in plugin section under project/build
 * @param {Project} p
 * @param {string} pathExpression
 * @param {string} glob
 * @param {FunctionRegistry} functionRegistry
 * @return {Promise<Dependencies>}
 */
async function findDeclaredPluginsWith(p, pathExpression, glob = "pom.xml", functionRegistry) {
    const plugins = await astUtils_1.gather(p, {
        parseWith: new XmldocFileParser_1.XmldocFileParser(),
        globPatterns: glob,
        pathExpression,
        mapper: m => {
            return extractPlugin(m);
        },
        functionRegistry,
    });
    return plugins;
}
/*

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

 */
function extractVersionedArtifact(n) {
    const groupId = n.$children.find(c => c.$value.startsWith("<groupId>"));
    const artifactId = n.$children.find(c => c.$value.startsWith("<artifactId>"));
    const version = n.$children.find(c => c.$value.startsWith("<version>"));
    const scope = n.$children.find(c => c.$value.startsWith("<scope>"));
    if (!(!!groupId && !!artifactId)) {
        throw new Error(`groupId and artifactId are required in [${n.$value}]`);
    }
    return {
        group: groupId.innerValue,
        artifact: artifactId.innerValue,
        name: artifactId.innerValue,
        version: !!version ? version.innerValue : undefined,
        scope: !!scope ? scope.innerValue : undefined,
    };
}
exports.extractVersionedArtifact = extractVersionedArtifact;
function extractPlugin(n) {
    const groupId = n.$children.find(c => c.$value.startsWith("<groupId>"));
    const artifactId = n.$children.find(c => c.$value.startsWith("<artifactId>"));
    const version = n.$children.find(c => c.$value.startsWith("<version>"));
    const configuration = n.$children.find(c => c.$value.startsWith("<configuration>"));
    const inherited = n.$children.find(c => c.$value.startsWith("<inherited>"));
    const extensions = n.$children.find(c => c.$value.startsWith("<extensions>"));
    // TODO we have cases, like Zipkin, where group is missing
    if (!artifactId) {
        throw new Error(`artifactId is required in [${n.$value}]`);
    }
    return {
        group: groupId ? groupId.innerValue : undefined,
        artifact: artifactId.innerValue,
        version: !!version ? version.innerValue : undefined,
        configuration: !!configuration ? parseConfiguration(configuration.$children) : undefined,
        inherited: !!inherited ? !!inherited.innerValue : undefined,
        extensions: !!extensions ? !!extensions.innerValue : undefined,
    };
}
function parseConfigurationNode(n) {
    const configurations = {};
    const configurationName = n.$name;
    if (n.$children.length === 0) {
        configurations[configurationName] = n.innerValue;
    }
    else {
        // TODO need to handle this case
        // const configurationValue = parseConfigurationNode(n);
        // configurations[configurationName] = configurationValue;
    }
    return configurations;
}
function parseConfiguration(nodes) {
    const configurations = {};
    for (const n of nodes) {
        const configurationName = n.$name;
        if (n.$children.length === 0) {
            configurations[configurationName] = n.innerValue;
        }
        else {
            const configurationValue = parseConfigurationNode(n);
            configurations[configurationName] = configurationValue;
        }
    }
    return configurations;
}
//# sourceMappingURL=fromPom.js.map