[MNG-7263] introduce AbstractLifecycleProvider
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/AbstractLifecycleProvider.java b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/AbstractLifecycleProvider.java
new file mode 100644
index 0000000..eb80a58
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/AbstractLifecycleProvider.java
@@ -0,0 +1,64 @@
+package org.apache.maven.lifecycle.providers;
+
+/*
+ * 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.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+
+import javax.inject.Provider;
+
+import org.apache.maven.lifecycle.Lifecycle;
+import org.apache.maven.lifecycle.mapping.LifecyclePhase;
+
+/**
+ * Base lifecycle provider.
+ */
+public abstract class AbstractLifecycleProvider
+    implements Provider<Lifecycle>
+{
+    private final Lifecycle lifecycle;
+
+    protected AbstractLifecycleProvider( String id, String[] phases, String[] pluginBindings )
+    {
+        HashMap<String, LifecyclePhase> defaultBindings = null;
+        if ( pluginBindings != null )
+        {
+            int len = pluginBindings.length;
+            defaultBindings = new HashMap<>();
+            for ( int i = 0; i < len; i++ )
+            {
+                defaultBindings.put( pluginBindings[i++], new LifecyclePhase( pluginBindings[i] ) );
+            }
+        }
+
+        this.lifecycle = new Lifecycle(
+            id,
+            Collections.unmodifiableList( Arrays.asList( phases ) ),
+            defaultBindings == null ? null : Collections.unmodifiableMap( defaultBindings )
+        );
+    }
+
+    @Override
+    public Lifecycle get()
+    {
+        return lifecycle;
+    }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/CleanLifecycleProvider.java b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/CleanLifecycleProvider.java
index 4b72b5e..62924cd 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/CleanLifecycleProvider.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/CleanLifecycleProvider.java
@@ -19,52 +19,33 @@
  * under the License.
  */
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Provider;
 import javax.inject.Singleton;
 
-import org.apache.maven.lifecycle.Lifecycle;
-import org.apache.maven.lifecycle.mapping.LifecyclePhase;
-
 /**
  * {@code clean} lifecycle provider.
  */
 @Named( "clean" )
 @Singleton
 public final class CleanLifecycleProvider
-    implements Provider<Lifecycle>
+    extends AbstractLifecycleProvider
 {
-  private static final String LIFECYCLE_ID = "clean";
+    private static final String LIFECYCLE_ID = "clean";
 
-  private static final String[] PHASES = {
-      "pre-clean",
-      "clean",
-      "post-clean"
-  };
+    private static final String[] PHASES = {
+        "pre-clean",
+        "clean",
+        "post-clean"
+    };
 
-  private final Lifecycle lifecycle;
+    private static final String[] BINDINGS = {
+        "clean", "org.apache.maven.plugins:maven-clean-plugin:3.1.0:clean"
+    };
 
-  @Inject
-  public CleanLifecycleProvider()
-  {
-    HashMap<String, LifecyclePhase> defaultBindings = new HashMap<>();
-    defaultBindings.put( "clean", new LifecyclePhase( "org.apache.maven.plugins:maven-clean-plugin:3.1.0:clean" ) );
-
-    this.lifecycle = new Lifecycle(
-        LIFECYCLE_ID,
-        Collections.unmodifiableList( Arrays.asList( PHASES ) ),
-        Collections.unmodifiableMap( defaultBindings )
-    );
-  }
-
-  @Override
-  public Lifecycle get()
-  {
-    return lifecycle;
-  }
+    @Inject
+    public CleanLifecycleProvider()
+    {
+        super( LIFECYCLE_ID, PHASES, BINDINGS );
+    }
 }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/DefaultLifecycleProvider.java b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/DefaultLifecycleProvider.java
index 29d5483..aa6f75c 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/DefaultLifecycleProvider.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/DefaultLifecycleProvider.java
@@ -19,67 +19,51 @@
  * under the License.
  */
 
-import java.util.Arrays;
-import java.util.Collections;
-
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Provider;
 import javax.inject.Singleton;
 
-import org.apache.maven.lifecycle.Lifecycle;
-
 /**
  * {@code default} lifecycle provider.
  */
 @Named( "default" )
 @Singleton
 public final class DefaultLifecycleProvider
-    implements Provider<Lifecycle>
+    extends AbstractLifecycleProvider
 {
-  private static final String LIFECYCLE_ID = "default";
+    private static final String LIFECYCLE_ID = "default";
 
-  private static final String[] PHASES = {
-      "validate",
-      "initialize",
-      "generate-sources",
-      "process-sources",
-      "generate-resources",
-      "process-resources",
-      "compile",
-      "process-classes",
-      "generate-test-sources",
-      "process-test-sources",
-      "generate-test-resources",
-      "process-test-resources",
-      "test-compile",
-      "process-test-classes",
-      "test",
-      "prepare-package",
-      "package",
-      "pre-integration-test",
-      "integration-test",
-      "post-integration-test",
-      "verify",
-      "install",
-      "deploy"
-  };
+    private static final String[] PHASES = {
+        "validate",
+        "initialize",
+        "generate-sources",
+        "process-sources",
+        "generate-resources",
+        "process-resources",
+        "compile",
+        "process-classes",
+        "generate-test-sources",
+        "process-test-sources",
+        "generate-test-resources",
+        "process-test-resources",
+        "test-compile",
+        "process-test-classes",
+        "test",
+        "prepare-package",
+        "package",
+        "pre-integration-test",
+        "integration-test",
+        "post-integration-test",
+        "verify",
+        "install",
+        "deploy"
+    };
 
-  private final Lifecycle lifecycle;
-
-  @Inject
-  public DefaultLifecycleProvider()
-  {
-    this.lifecycle = new Lifecycle(
-        LIFECYCLE_ID,
-        Collections.unmodifiableList( Arrays.asList( PHASES ) ),
-        null // no global plugin bindings for default lifecycle: they are defined per-packaging in separate providers
-    );
-  }
-
-  @Override
-  public Lifecycle get()
-  {
-    return lifecycle;
-  }
+    @Inject
+    public DefaultLifecycleProvider()
+    {
+      super( LIFECYCLE_ID, PHASES,
+          null // no global plugin bindings for default lifecycle: they are defined per-packaging in separate providers
+      );
+    }
 }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/SiteLifecycleProvider.java b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/SiteLifecycleProvider.java
index d7ff563..142ac1c 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/SiteLifecycleProvider.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/SiteLifecycleProvider.java
@@ -19,54 +19,35 @@
  * under the License.
  */
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Provider;
 import javax.inject.Singleton;
 
-import org.apache.maven.lifecycle.Lifecycle;
-import org.apache.maven.lifecycle.mapping.LifecyclePhase;
-
 /**
  * {@code site} lifecycle provider.
  */
 @Named( "site" )
 @Singleton
 public final class SiteLifecycleProvider
-    implements Provider<Lifecycle>
+    extends AbstractLifecycleProvider
 {
-  private static final String LIFECYCLE_ID = "site";
+    private static final String LIFECYCLE_ID = "site";
 
-  private static final String[] PHASES = {
-      "pre-site",
-      "site",
-      "post-site",
-      "site-deploy"
-  };
+    private static final String[] PHASES = {
+        "pre-site",
+        "site",
+        "post-site",
+        "site-deploy"
+    };
 
-  private final Lifecycle lifecycle;
+    private static final String[] BINDINGS = {
+        "site", "org.apache.maven.plugins:maven-site-plugin:3.9.1:site",
+        "site-deploy", "org.apache.maven.plugins:maven-site-plugin:3.9.1:deploy"
+    };
 
-  @Inject
-  public SiteLifecycleProvider()
-  {
-    HashMap<String, LifecyclePhase> defaultBindings = new HashMap<>();
-    defaultBindings.put( "site", new LifecyclePhase( "org.apache.maven.plugins:maven-site-plugin:3.9.1:site" ) );
-    defaultBindings.put( "site-deploy", new LifecyclePhase( "org.apache.maven.plugins:maven-site-plugin:3.9.1:deploy" ) );
-
-    this.lifecycle = new Lifecycle(
-        LIFECYCLE_ID,
-        Collections.unmodifiableList( Arrays.asList( PHASES ) ),
-        Collections.unmodifiableMap( defaultBindings )
-    );
-  }
-
-  @Override
-  public Lifecycle get()
-  {
-    return lifecycle;
-  }
+    @Inject
+    public SiteLifecycleProvider()
+    {
+        super( LIFECYCLE_ID, PHASES, BINDINGS );
+    }
 }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/WrapperLifecycleProvider.java b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/WrapperLifecycleProvider.java
index b88dcc1..aa383ab 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/providers/WrapperLifecycleProvider.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/providers/WrapperLifecycleProvider.java
@@ -19,51 +19,32 @@
  * under the License.
  */
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Provider;
 import javax.inject.Singleton;
 
-import org.apache.maven.lifecycle.Lifecycle;
-import org.apache.maven.lifecycle.mapping.LifecyclePhase;
-
 /**
  * {@code wrapper} lifecycle provider.
  */
 @Named( "wrapper" )
 @Singleton
 public final class WrapperLifecycleProvider
-    implements Provider<Lifecycle>
+    extends AbstractLifecycleProvider
 {
-  private static final String LIFECYCLE_ID = "wrapper";
+    private static final String LIFECYCLE_ID = "wrapper";
 
-  private static final String[] PHASES =
-  {
-      "wrapper"
-  };
+    private static final String[] PHASES =
+    {
+        "wrapper"
+    };
 
-  private final Lifecycle lifecycle;
+    private static final String[] BINDINGS = {
+        "wrapper", "org.apache.maven.plugins:maven-wrapper-plugin:3.1.0:wrapper"
+    };
 
-  @Inject
-  public WrapperLifecycleProvider()
-  {
-    HashMap<String, LifecyclePhase> defaultBindings = new HashMap<>();
-    defaultBindings.put( "wrapper", new LifecyclePhase( "org.apache.maven.plugins:maven-wrapper-plugin:3.1.0:wrapper" ) );
-
-    this.lifecycle = new Lifecycle(
-        LIFECYCLE_ID,
-        Collections.unmodifiableList( Arrays.asList( PHASES ) ),
-        Collections.unmodifiableMap( defaultBindings )
-    );
-  }
-
-  @Override
-  public Lifecycle get()
-  {
-    return lifecycle;
-  }
+    @Inject
+    public WrapperLifecycleProvider()
+    {
+        super( LIFECYCLE_ID, PHASES, BINDINGS );
+    }
 }