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

com.citytechinc.cq.component.maven.ComponentMojo Maven / Gradle / Ivy

There is a newer version: 7.0.0
Show newest version
package com.citytechinc.cq.component.maven;

import com.citytechinc.cq.component.annotations.Component;
import com.citytechinc.cq.component.dialog.ComponentNameTransformer;
import com.citytechinc.cq.component.dialog.widget.WidgetRegistry;
import com.citytechinc.cq.component.dialog.widget.impl.DefaultWidgetRegistry;
import com.citytechinc.cq.component.editconfig.registry.DefaultInPlaceEditorRegistry;
import com.citytechinc.cq.component.editconfig.registry.InPlaceEditorRegistry;
import com.citytechinc.cq.component.maven.util.ComponentMojoUtil;
import com.citytechinc.cq.component.maven.util.LogSingleton;
import com.citytechinc.cq.component.touchuidialog.widget.registry.DefaultTouchUIWidgetRegistry;
import com.citytechinc.cq.component.touchuidialog.widget.registry.TouchUIWidgetRegistry;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.reflections.Reflections;

import javax.naming.ConfigurationException;
import java.io.File;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Mojo(name = "component", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE)
public class ComponentMojo extends AbstractMojo {

    private static final String TEMP_FILENAME_SUFFIX = "-temp";

    private static final String PACKAGE_EXTENSION = ".zip";

    @Parameter(property = "aem.package.fileName", defaultValue = "${project.build.finalName}")
    private String packageFileName;

    @Parameter(defaultValue = "${project}")
    private MavenProject project;

    @Parameter
    private String componentPathBase;

    @Parameter(defaultValue = "content")
    private String componentPathSuffix;

    @Parameter(defaultValue = "Components")
    private String defaultComponentGroup;

    @Parameter(defaultValue = "camel-case")
    private String transformerName;

    @Parameter(required = false)
    private List excludeDependencies;

    @Parameter(defaultValue = "true")
    private boolean generateTouchUiDialogs;

    @Parameter(defaultValue = "false")
    private boolean useCoral3Dialogs;

    @Parameter(defaultValue = "true")
    private boolean generateClassicUiDialogs;

    @Parameter(required = false)
    private List additionalFeatures;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        LogSingleton.getInstance().setLogger(getLog());

        try {

            @SuppressWarnings("unchecked")
            List classpathElements = project.getCompileClasspathElements();

            ClassLoader classLoader =
                ComponentMojoUtil.getClassLoader(classpathElements, this.getClass().getClassLoader());

            ClassPool classPool = ComponentMojoUtil.getClassPool(classLoader);

            Reflections reflections = ComponentMojoUtil.getReflections(classLoader);

            List classList =
                ComponentMojoUtil.getAllComponentAnnotations(classPool, reflections, getExcludedClasses());

            WidgetRegistry widgetRegistry =
                new DefaultWidgetRegistry(classPool, classLoader, reflections, getAdditionalFeatures());

            TouchUIWidgetRegistry touchUIWidgetRegistry =
                new DefaultTouchUIWidgetRegistry(classPool, classLoader, reflections, getAdditionalFeatures());

            InPlaceEditorRegistry inPlaceEditorRegistry =
                new DefaultInPlaceEditorRegistry(classPool, classLoader, reflections);

            Map transformers =
                ComponentMojoUtil.getAllTransformers(classPool, reflections);

            ComponentNameTransformer transformer = transformers.get(transformerName);

            if (transformer == null) {
                throw new ConfigurationException("The configured transformer wasn't found");
            }

            ComponentMojoUtil.buildArchiveFileForProjectAndClassList(classList, widgetRegistry, touchUIWidgetRegistry,
                inPlaceEditorRegistry, classLoader, classPool, new File(project.getBuild().getDirectory()),
                componentPathBase, componentPathSuffix, defaultComponentGroup, getArchiveFileForProject(),
                getTempArchiveFileForProject(), transformer, generateTouchUiDialogs, useCoral3Dialogs,
                generateClassicUiDialogs);

        } catch (Exception e) {
            getLog().error(e.getMessage(), e);
            throw new MojoExecutionException(e.getMessage(), e);
        }

    }

    private Set getExcludedClasses() throws DependencyResolutionRequiredException, MalformedURLException {

        getLog().debug("Constructing set of excluded Class names");

        List excludedDependencyPaths = getExcludedDependencyPaths();

        if (excludedDependencyPaths != null) {
            ClassLoader exclusionClassLoader =
                ComponentMojoUtil.getClassLoader(excludedDependencyPaths, this.getClass().getClassLoader());

            Reflections reflections = ComponentMojoUtil.getReflections(exclusionClassLoader);

            Set excludedClassNames = reflections.getStore().getTypesAnnotatedWith(Component.class.getName());

            return excludedClassNames;
        }

        return null;
    }

    @SuppressWarnings("unchecked")
    private List getExcludedDependencyPaths() throws DependencyResolutionRequiredException {
        if (excludeDependencies != null && !excludeDependencies.isEmpty()) {
            getLog().debug("Exclusions Found");

            List compileArtifacts = project.getCompileArtifacts();

            List excludedClasspathElements = new ArrayList();

            Set excludedArtifactIdentifiers = new HashSet();

            for (Dependency curDependency : excludeDependencies) {
                excludedArtifactIdentifiers.add(curDependency.getGroupId() + ":" + curDependency.getArtifactId());
            }

            for (Artifact curArtifact : compileArtifacts) {
                String referenceIdentifier = curArtifact.getGroupId() + ":" + curArtifact.getArtifactId();

                if (excludedArtifactIdentifiers.contains(referenceIdentifier)) {
                    MavenProject identifiedProject =
                        (MavenProject) project.getProjectReferences().get(referenceIdentifier);
                    if (identifiedProject != null) {
                        excludedClasspathElements.add(identifiedProject.getBuild().getOutputDirectory());
                        getLog().debug("Excluding " + identifiedProject.getBuild().getOutputDirectory());
                    } else {
                        File file = curArtifact.getFile();
                        if (file == null) {
                            throw new DependencyResolutionRequiredException(curArtifact);
                        }
                        excludedClasspathElements.add(file.getPath());
                        getLog().debug("Excluding " + file.getPath());
                    }
                }
            }

            return excludedClasspathElements;
        }

        return null;

    }

    private File getArchiveFileForProject() {
        File buildDirectory = new File(project.getBuild().getDirectory());

        getLog().debug("Archive file name configured to be " + packageFileName + PACKAGE_EXTENSION);

        return new File(buildDirectory, packageFileName + PACKAGE_EXTENSION);
    }

    private File getTempArchiveFileForProject() {
        File buildDirectory = new File(project.getBuild().getDirectory());

        String tempPackageFileName = packageFileName + TEMP_FILENAME_SUFFIX + PACKAGE_EXTENSION;

        getLog().debug("Temp archive file name configured to be " + tempPackageFileName);

        return new File(buildDirectory, tempPackageFileName);
    }

    private List getAdditionalFeatures() {
        if (additionalFeatures == null) {
            return new ArrayList();
        }

        return additionalFeatures;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy