Java tutorial
package org.apache.maven.lifecycle; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.maven.lifecycle.internal.ExecutionPlanItem; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.descriptor.MojoDescriptor; //TODO lifecycles being executed //TODO what runs in each phase //TODO plugins that need downloading //TODO project dependencies that need downloading //TODO unfortunately the plugins need to be downloaded in order to get the plugin.xml file. need to externalize this // from the plugin archive. //TODO this will be the class that people get in IDEs to modify /** * MavenExecutionPlan */ public class MavenExecutionPlan implements Iterable<ExecutionPlanItem> { /* At the moment, this class is totally immutable, and this is in line with thoughts about the pre-calculated execution plan that stays the same during the execution. If deciding to add mutable state to this class, it should be at least considered to separate this into a separate mutable structure. */ private final List<ExecutionPlanItem> planItem; private final Map<String, ExecutionPlanItem> lastMojoExecutionForAllPhases; final List<String> phasesInExecutionPlan; public MavenExecutionPlan(List<ExecutionPlanItem> planItem, DefaultLifecycles defaultLifecycles) { this.planItem = planItem; lastMojoExecutionForAllPhases = new LinkedHashMap<>(); LinkedHashSet<String> totalPhaseSet = new LinkedHashSet<>(); if (defaultLifecycles != null) { for (String phase : getDistinctPhasesInOrderOfExecutionPlanAppearance(planItem)) { final Lifecycle lifecycle = defaultLifecycles.get(phase); if (lifecycle != null) { totalPhaseSet.addAll(lifecycle.getPhases()); } } } this.phasesInExecutionPlan = new ArrayList<>(totalPhaseSet); Map<String, ExecutionPlanItem> lastInExistingPhases = new HashMap<>(); for (ExecutionPlanItem executionPlanItem : getExecutionPlanItems()) { lastInExistingPhases.put(executionPlanItem.getLifecyclePhase(), executionPlanItem); } ExecutionPlanItem lastSeenExecutionPlanItem = null; for (String phase : totalPhaseSet) { ExecutionPlanItem forThisPhase = lastInExistingPhases.get(phase); if (forThisPhase != null) { lastSeenExecutionPlanItem = forThisPhase; } lastMojoExecutionForAllPhases.put(phase, lastSeenExecutionPlanItem); } } public Iterator<ExecutionPlanItem> iterator() { return getExecutionPlanItems().iterator(); } /** * Returns the last ExecutionPlanItem in the supplied phase. If no items are in the specified phase, * the closest executionPlanItem from an earlier phase item will be returned. * * @param requestedPhase the requested phase * The execution plan item * @return The ExecutionPlanItem or null if none can be found */ public ExecutionPlanItem findLastInPhase(String requestedPhase) { return lastMojoExecutionForAllPhases.get(requestedPhase); } private List<ExecutionPlanItem> getExecutionPlanItems() { return planItem; } private static Iterable<String> getDistinctPhasesInOrderOfExecutionPlanAppearance( List<ExecutionPlanItem> planItems) { LinkedHashSet<String> result = new LinkedHashSet<>(); for (ExecutionPlanItem executionPlanItem : planItems) { final String phase = executionPlanItem.getLifecyclePhase(); if (!result.contains(phase)) { result.add(phase); } } return result; } public List<MojoExecution> getMojoExecutions() { List<MojoExecution> result = new ArrayList<>(); for (ExecutionPlanItem executionPlanItem : planItem) { result.add(executionPlanItem.getMojoExecution()); } return result; } /** * Get set of plugins having a goal/mojo used but not marked @threadSafe * * @return the set of plugins (without info on which goal is concerned) */ public Set<Plugin> getNonThreadSafePlugins() { Set<Plugin> plugins = new HashSet<>(); for (ExecutionPlanItem executionPlanItem : planItem) { final MojoExecution mojoExecution = executionPlanItem.getMojoExecution(); if (!mojoExecution.getMojoDescriptor().isThreadSafe()) { plugins.add(mojoExecution.getPlugin()); } } return plugins; } /** * Get set of mojos used but not marked @threadSafe * * @return the set of mojo descriptors */ public Set<MojoDescriptor> getNonThreadSafeMojos() { Set<MojoDescriptor> mojos = new HashSet<>(); for (ExecutionPlanItem executionPlanItem : planItem) { final MojoExecution mojoExecution = executionPlanItem.getMojoExecution(); if (!mojoExecution.getMojoDescriptor().isThreadSafe()) { mojos.add(mojoExecution.getMojoDescriptor()); } } return mojos; } // Used by m2e but will be removed, really. @Deprecated public List<MojoExecution> getExecutions() { return getMojoExecutions(); } public int size() { return planItem.size(); } }