com.redhat.rcm.maven.plugin.buildmetadata.data.MavenMetaDataProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.redhat.rcm.maven.plugin.buildmetadata.data.MavenMetaDataProvider.java

Source

/*
 * Copyright 2006-2014 smartics, Kronseder & Reiner GmbH
 *
 * 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.
 */
package com.redhat.rcm.maven.plugin.buildmetadata.data;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.RuntimeInformation;
import org.apache.maven.model.Profile;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.StringUtils;
import com.redhat.rcm.maven.plugin.buildmetadata.common.Constant;
import com.redhat.rcm.maven.plugin.buildmetadata.common.MojoUtils;
import com.redhat.rcm.maven.plugin.buildmetadata.common.Property;
import com.redhat.rcm.maven.plugin.buildmetadata.maven.MavenPropertyHelper;

/**
 * Extracts information from the Maven project, session, and runtime
 * information.
 *
 * @author <a href="mailto:robert.reiner@smartics.de">Robert Reiner</a>
 * @version $Revision:591 $
 */
public final class MavenMetaDataProvider extends AbstractMetaDataProvider { // NOPMD
                                                                            // ********************************* Fields *********************************

    // --- constants ------------------------------------------------------------

    // --- members --------------------------------------------------------------

    /**
     * The selection of properties to be added or hidden.
     */
    private final MavenMetaDataSelection selection;

    // ****************************** Initializer *******************************

    // ****************************** Constructors ******************************

    /**
     * Constructor.
     *
     * @param project the Maven project.
     * @param session the Maven session instance.
     * @param runtime the runtime information of the Maven instance being executed
     *          for the build.
     * @param selection the selection of properties to be added or hidden.
     * @see com.redhat.rcm.maven.plugin.buildmetadata.data.AbstractMetaDataProvider#AbstractMetaDataProvider()
     */
    public MavenMetaDataProvider(final MavenProject project, final MavenSession session,
            final RuntimeInformation runtime, final MavenMetaDataSelection selection) {
        this.project = project;
        this.session = session;
        this.runtime = runtime;
        this.selection = selection;
    }

    // ****************************** Inner Classes *****************************

    // ********************************* Methods ********************************

    // --- init -----------------------------------------------------------------

    // --- get&set --------------------------------------------------------------

    // --- business -------------------------------------------------------------

    /**
     * Adds the information of the Maven runtime as build properties.
     *
     * @param buildMetaDataProperties the build meta data properties.
     */
    @Override
    public void provideBuildMetaData(final Properties buildMetaDataProperties) {
        if (runtime != null) {
            provideRuntimeInfo(buildMetaDataProperties);
        }

        if (session != null) {
            provideSessionInfo(buildMetaDataProperties);
        }

        if (project != null) {
            provideProjectInfo(buildMetaDataProperties);
        }

        final List<Property> selectedProperties = selection.getSelectedSystemProperties();
        if (selectedProperties != null && !selectedProperties.isEmpty()) {
            provideSelectedProperties(buildMetaDataProperties, selectedProperties);
        }
    }

    private void provideRuntimeInfo(final Properties buildMetaDataProperties) {
        final ArtifactVersion mavenVersion = runtime.getApplicationVersion();
        final String mavenVersionString = mavenVersion.toString();
        buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_VERSION, mavenVersionString);

        if (selection.isAddJavaRuntimeInfo()) {
            providePropertyIfExists(buildMetaDataProperties, "java.runtime.name",
                    Constant.PROP_NAME_JAVA_RUNTIME_NAME);
            providePropertyIfExists(buildMetaDataProperties, "java.runtime.version",
                    Constant.PROP_NAME_JAVA_RUNTIME_VERSION);
            providePropertyIfExists(buildMetaDataProperties, "java.vendor", Constant.PROP_NAME_JAVA_VENDOR);
            providePropertyIfExists(buildMetaDataProperties, "java.vm.name", Constant.PROP_NAME_JAVA_VM);
            providePropertyIfExists(buildMetaDataProperties, "sun.management.compiler",
                    Constant.PROP_NAME_JAVA_COMPILER);
        }

        if (selection.isAddOsInfo()) {
            providePropertyIfExists(buildMetaDataProperties, "os.name", Constant.PROP_NAME_OS_NAME);
            providePropertyIfExists(buildMetaDataProperties, "os.arch", Constant.PROP_NAME_OS_ARCH);
            providePropertyIfExists(buildMetaDataProperties, "os.version", Constant.PROP_NAME_OS_VERSION);
        }
    }

    private void providePropertyIfExists(final Properties buildMetaDataProperties, final String systemPropertyName,
            final String propName) {
        final String value = System.getProperty(systemPropertyName);
        if (StringUtils.isNotBlank(value)) {
            buildMetaDataProperties.setProperty(propName, value);
        }
    }

    private void provideSelectedProperties(final Properties buildMetaDataProperties,
            final List<Property> selectedProperties) {
        final MavenPropertyHelper helper = new MavenPropertyHelper(project);
        for (final Property property : selectedProperties) {
            final String name = property.getName();

            final String fixedValue = property.getValue();
            if (fixedValue != null) {
                setProperty(buildMetaDataProperties, property, fixedValue);
            } else {
                final String mavenPropertyValue = helper.getProperty(name);
                if (mavenPropertyValue != null) {
                    setProperty(buildMetaDataProperties, property, mavenPropertyValue);
                } else {
                    final String value = System.getProperty(name);
                    if (StringUtils.isNotBlank(value)) {
                        setProperty(buildMetaDataProperties, property, value);
                    } else {
                        final String envValue = System.getenv(name);
                        // CHECKSTYLE:OFF
                        if (StringUtils.isNotBlank(envValue)) {
                            setProperty(buildMetaDataProperties, property, envValue);
                        }
                        // CHECKSTYLE:ON
                    }
                }
            }
        }
    }

    private static void setProperty(final Properties buildMetaDataProperties, final Property property,
            final String value) {
        final String name = property.getMappedName();
        buildMetaDataProperties.setProperty(name, value);
    }

    private void provideSessionInfo(final Properties buildMetaDataProperties) {
        final Properties executionProperties = provideExecutionProperties(buildMetaDataProperties);
        if (selection.isAddMavenExecutionInfo()) {
            provideGoals(buildMetaDataProperties);
        }
        provideSpecialEnvVars(buildMetaDataProperties, executionProperties);
    }

    private void provideProjectInfo(final Properties buildMetaDataProperties) {
        if (selection.isAddMavenExecutionInfo()) {
            provideActiveProfiles(buildMetaDataProperties);
            provideExecutedProjectInfo(buildMetaDataProperties);
            final String filters = MojoUtils.toPrettyString(project.getFilters());
            if (StringUtils.isNotBlank(filters)) {
                buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_FILTERS, filters);
            }
        }

        if (selection.isAddProjectInfo()) {
            final String projectUrl = project.getUrl();
            if (StringUtils.isNotBlank(projectUrl)) {
                buildMetaDataProperties.setProperty(Constant.PROP_NAME_PROJECT_HOMEPAGE, projectUrl);
            }

            final Properties projectProperties = project.getProperties();
            if (projectProperties != null) {
                providePropertiesProperty(buildMetaDataProperties, projectProperties,
                        Constant.PROP_NAME_PROJECT_OPS);
                providePropertiesProperty(buildMetaDataProperties, projectProperties,
                        Constant.PROP_NAME_PROJECT_CATEGORY);
                providePropertiesProperty(buildMetaDataProperties, projectProperties,
                        Constant.PROP_NAME_PROJECT_SUBCATEGORY);
                providePropertiesProperty(buildMetaDataProperties, projectProperties,
                        Constant.PROP_NAME_PROJECT_TAGS);
            }
        }
    }

    private static void providePropertiesProperty(final Properties buildMetaDataProperties,
            final Properties projectProperties, final String name) {
        final String value = projectProperties.getProperty(name);
        if (StringUtils.isNotBlank(value)) {
            buildMetaDataProperties.setProperty(name, value);
        }
    }

    private void provideExecutedProjectInfo(final Properties buildMetaDataProperties) {
        buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_IS_EXECUTION_ROOT,
                String.valueOf(project.isExecutionRoot()));
        final MavenProject executionProject = project.getExecutionProject();
        if (executionProject != null) {
            buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_EXECUTION_PROJECT,
                    executionProject.getId());
        }
    }

    private void provideActiveProfiles(final Properties buildMetaDataProperties) {
        final List<Profile> profiles = getActiveProfiles();
        if (profiles != null && !profiles.isEmpty()) {
            final List<String> profileIds = new ArrayList<String>(profiles.size());
            for (final Profile profile : profiles) {
                final String profileId = profile.getId();
                if (!profileIds.contains(profileId)) {
                    final String key = Constant.MAVEN_ACTIVE_PROFILE_PREFIX + '.' + profileId;
                    final String value = profile.getSource();
                    buildMetaDataProperties.setProperty(key, value);
                    profileIds.add(profileId);
                }
            }
            buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_ACTIVE_PROFILES,
                    MojoUtils.toPrettyString(profileIds));
        }
    }

    /**
     * Delegates call to
     * {@link org.apache.maven.project.MavenProject#getActiveProfiles()}.
     *
     * @return the result of the call to
     *         {@link org.apache.maven.project.MavenProject#getActiveProfiles()}.
     * @see org.apache.maven.project.MavenProject#getActiveProfiles()
     */
    @SuppressWarnings("unchecked")
    private List<Profile> getActiveProfiles() {
        return project.getActiveProfiles();
    }

    private void provideGoals(final Properties buildMetaDataProperties) {
        final String goals = MojoUtils.toPrettyString(session.getGoals());
        buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_GOALS, goals);
    }

    private Properties provideExecutionProperties(final Properties buildMetaDataProperties) {
        final Properties executionProperties = session.getExecutionProperties();
        if (selection.isAddEnvInfo()) {
            final Set<Object> sortedKeys = new TreeSet<Object>();
            sortedKeys.addAll(executionProperties.keySet());
            for (final Object originalKey : sortedKeys) {
                final String key = Constant.MAVEN_EXECUTION_PROPERTIES_PREFIX + '.' + originalKey;
                final String value = executionProperties.getProperty((String) originalKey);
                buildMetaDataProperties.setProperty(key, value);
            }
        }
        return executionProperties;
    }

    private void provideSpecialEnvVars(final Properties buildMetaDataProperties,
            final Properties executionProperties) {
        if (!selection.isHideCommandLineInfo()) {
            final String commandLine = calcCommandLine(executionProperties);
            if (!StringUtils.isEmpty(commandLine)) {
                buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_CMDLINE, commandLine);
            }
        }

        if (!selection.isHideMavenOptsInfo()) {
            final String mavenOpts = executionProperties.getProperty("env.MAVEN_OPTS");
            if (!StringUtils.isEmpty(mavenOpts)) {
                buildMetaDataProperties.setProperty(Constant.PROP_NAME_MAVEN_OPTS, mavenOpts);
            }
        }

        if (!selection.isHideJavaOptsInfo()) {
            final String javaOpts = executionProperties.getProperty("env.JAVA_OPTS");
            if (!StringUtils.isEmpty(javaOpts)) {
                buildMetaDataProperties.setProperty(Constant.PROP_NAME_JAVA_OPTS, javaOpts);
            }
        }
    }

    private String calcCommandLine(final Properties executionProperties) {
        String commandLine = executionProperties.getProperty("sun.java.command");
        if (commandLine != null) {
            commandLine = commandLine.replace("org.codehaus.plexus.classworlds.launcher.Launcher ", "");
        }
        return commandLine;
    }
}