All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jkube.kit.build.maven.MavenBuildContext Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2019 Red Hat, Inc.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at:
 *
 *     https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Red Hat, Inc. - initial API and implementation
 */
package org.eclipse.jkube.kit.build.maven;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.jkube.kit.build.api.BuildContext;
import org.eclipse.jkube.kit.build.api.RegistryContext;
import org.eclipse.jkube.kit.build.maven.assembly.DockerAssemblyConfigurationSource;
import org.eclipse.jkube.kit.build.maven.config.MavenBuildConfiguration;
import org.eclipse.jkube.kit.common.KitLogger;
import org.eclipse.jkube.kit.config.image.build.BuildConfiguration;
import org.apache.maven.archiver.MavenArchiveConfiguration;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugins.assembly.interpolation.AssemblyInterpolator;
import org.apache.maven.plugins.assembly.io.DefaultAssemblyReader;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
import org.apache.maven.shared.filtering.MavenFileFilter;
import org.apache.maven.shared.filtering.MavenReaderFilter;
import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;

/**
 * @author roland
 * @since 16.10.18
 */
public class MavenBuildContext implements BuildContext {

    private String sourceDirectory;
    private String outputDirectory;
    private MavenProject project;
    private MavenSession session;
    private MavenFileFilter mavenFileFilter;
    private MavenReaderFilter mavenReaderFilter;
    private Settings settings;
    private List reactorProjects;
    private MavenArchiveConfiguration archiveConfiguration;
    private MavenArchiveService archiveService;
    private RegistryContext registryContext;

    private MavenBuildContext() { }


    public String getSourceDirectory() {
        return sourceDirectory;
    }

    public String getOutputDirectory() {
        return outputDirectory;
    }


    public File getBasedir() {
        return project.getBasedir();
    }

    @Override
    public Properties getProperties() {
        return project.getProperties();
    }

    @Override
    public Function createInterpolator(String filter) {
        FixedStringSearchInterpolator interpolator = createMavenInterpolator(this, filter);
        return interpolator::interpolate;
    }

    @Override
    public File createImageContentArchive(String imageName, MavenBuildConfiguration buildConfig, KitLogger log)
            throws IOException {

        try {
            return archiveService.createArchive(imageName, buildConfig, this, log);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    @Override
    public RegistryContext getRegistryContext() {
        return registryContext;
    }

    @Override
    public File inOutputDir(String path) {
        return inDir(getOutputDirectory(), path);
    }

    @Override
    public File inSourceDir(String path) {
        return inDir(getSourceDirectory(), path);
    }

    @Override
    public File inDir(String dir, String path) {
        File file = new File(path);
        if (file.isAbsolute()) {
            return file;
        }
        File absoluteSourceDir = new File(getBasedir(), dir);
        return new File(absoluteSourceDir, path);
    }

    // =======================================================================================
    // Maven specific method not available via interface

    public MavenProject getProject() {
        return project;
    }

    public MavenSession getSession() {
        return session;
    }

    public MavenFileFilter getMavenFileFilter() {
        return mavenFileFilter;
    }

    public MavenReaderFilter getMavenReaderFilter() {
        return mavenReaderFilter;
    }

    public Settings getSettings() {
        return settings;
    }

	public List getReactorProjects() {
		return reactorProjects;
	}

    public MavenArchiveConfiguration getArchiveConfiguration() {
        return archiveConfiguration;
    }

    // =======================================================================================

    /**
     * Create an interpolator for the given maven parameters and filter configuration.
     *
     * @param ctx The maven parameters.
     * @param filter The filter configuration.
     * @return An interpolator for replacing maven properties.
     */
    private FixedStringSearchInterpolator createMavenInterpolator(MavenBuildContext ctx, String filter) {
        String[] delimiters = extractDelimiters(filter);
        if (delimiters == null) {
            // Don't interpolate anything
            return FixedStringSearchInterpolator.create();
        }

        DockerAssemblyConfigurationSource configSource = new DockerAssemblyConfigurationSource(ctx, null, null);
        // Patterned after org.apache.maven.plugins.assembly.interpolation.AssemblyExpressionEvaluator
        return AssemblyInterpolator
                .fullInterpolator(ctx.getProject(),
                                  DefaultAssemblyReader.createProjectInterpolator(ctx.getProject())
                                                       .withExpressionMarkers(delimiters[0], delimiters[1]), configSource)
                .withExpressionMarkers(delimiters[0], delimiters[1]);
    }

    private static String[] extractDelimiters(String filter) {
        if (filter == null) {
            // Default interpolation scheme
            return new String[] { "${", "}" };
        }
        if (filter.equalsIgnoreCase("false") ||
            filter.equalsIgnoreCase("none")) {
            return null;
        }
        if (filter.contains("*")) {
            Matcher matcher = Pattern.compile("^(?[^*]+)\\*(?.*)$").matcher(filter);
            if (matcher.matches()) {
                return new String[] { matcher.group("start"), matcher.group("end") };
            }
        }
        return new String[] { filter, filter };
    }


    // =======================================================================================

    public static class Builder {

        private MavenBuildContext context;

        public Builder() {
            this.context = new MavenBuildContext();
        }

        public Builder(MavenBuildContext context) {
            this.context = context;
        }

        public Builder sourceDirectory(String sourceDirectory) {
            context.sourceDirectory = sourceDirectory;
            return this;
        }

        public Builder outputDirectory(String outputDirectory) {
            context.outputDirectory = outputDirectory;
            return this;
        }

        public Builder registryContext(RegistryContext registryContext) {
            context.registryContext = registryContext;
            return this;
        }

        // ===============================================================================
        // Maven specific calls

        public Builder project(MavenProject project) {
            context.project = project;
            return this;
        }

        public Builder session(MavenSession session) {
            context.session = session;
            return this;
        }

        public Builder settings(Settings settings) {
            context.settings = settings;
            return this;
        }

        public Builder mavenReaderFilter(MavenReaderFilter mavenReaderFilter) {
            context.mavenReaderFilter = mavenReaderFilter;
            return this;
        }

        public Builder mavenFileFilter(MavenFileFilter mavenFileFilter) {
            context.mavenFileFilter = mavenFileFilter;
            return this;
        }

        public Builder reactorProjects(List reactorProjects) {
            context.reactorProjects = reactorProjects;
            return this;
        }

        public Builder archiveConfiguration(MavenArchiveConfiguration archiveConfiguration) {
            context.archiveConfiguration = archiveConfiguration;
            return this;
        }

        public Builder archiveService(MavenArchiveService archiveService) {
            context.archiveService = archiveService;
            return this;
        }

        // ================================================================================
        public MavenBuildContext build() {
            return context;
        }

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy