PHOENIX-6349 Add and use commons-cli to phoenix-thirdparty

includes a patch that lets us disable the double quote removing "feature"
diff --git a/phoenix-shaded-commons-cli/pom.xml b/phoenix-shaded-commons-cli/pom.xml
new file mode 100644
index 0000000..037be39
--- /dev/null
+++ b/phoenix-shaded-commons-cli/pom.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <!--
+/**
+ * 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.
+ */
+-->
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.phoenix.thirdparty</groupId>
+    <artifactId>phoenix-thirdparty</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>phoenix-shaded-commons-cli</artifactId>
+  <name>Apache Phoenix Patched and Relocated (Shaded) Commons-CLI</name>
+  <description>
+    Pulls down commons-cli, patches it, compiles, and then relocates/shades.
+  </description>
+  <build>
+    <plugins>
+      <plugin>
+        <!--Clean needs to purge src/main/java since this is where
+             the unpack of commons-cli is overlaid. Do it for usual
+             clean goal but also before we unpack in case patches
+             delete/add files. We use src/main/java instead of dir
+             under 'target' because the jar plugin is dumb, hard to
+             make it source from other then src/main/java.-->
+        <artifactId>maven-clean-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>pre-generate-sources</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>clean</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <filesets>
+            <fileset>
+              <directory>${basedir}/src/main/java</directory>
+              <includes>
+                <include>**/**</include>
+              </includes>
+              <followSymlinks>false</followSymlinks>
+            </fileset>
+          </filesets>
+        </configuration>
+      </plugin>
+      <plugin>
+        <!--Download our dependency src, i.e. commons-cli, and
+             unpack it. Overlays src/main/java so ready for
+            compile-time (the jar plugin expects src in
+            src/main/java)-->
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>unpack</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>commons-cli</groupId>
+                  <artifactId>commons-cli</artifactId>
+                  <version>${commons-cli.version}</version>
+                  <classifier>sources</classifier>
+                  <type>jar</type>
+                  <overWrite>true</overWrite>
+                  <outputDirectory>${basedir}/src/main/java</outputDirectory>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <!--Apply our patches to the unpacked commons-cli src-->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-patch-plugin</artifactId>
+        <version>1.2</version>
+        <configuration>
+          <targetDirectory>${basedir}</targetDirectory>
+          <skipApplication>false</skipApplication>
+        </configuration>
+        <executions>
+          <execution>
+            <id>patch</id>
+            <phase>process-sources</phase>
+            <goals>
+              <goal>apply</goal>
+            </goals>
+            <configuration>
+              <strip>0</strip>
+              <patchDirectory>${basedir}/src/main/patches</patchDirectory>
+              <patchTrackingFile>${project.build.directory}/patches-applied.txt</patchTrackingFile>
+              <naturalOrderProcessing>true</naturalOrderProcessing>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <goals>
+              <goal>jar-no-fork</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <!--Above we built a jar. Now at package step, do relocation/shade-->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <shadeSourcesContent>true</shadeSourcesContent>
+              <createSourcesJar>true</createSourcesJar>
+              <relocations>
+                <relocation>
+                  <pattern>org.apache.commons.cli</pattern>
+                  <shadedPattern>${rename.offset}.org.apache.commons.cli</shadedPattern>
+                </relocation>
+              </relocations>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/phoenix-shaded-commons-cli/src/main/patches/CLI-254-1.4.patch b/phoenix-shaded-commons-cli/src/main/patches/CLI-254-1.4.patch
new file mode 100644
index 0000000..4616fab
--- /dev/null
+++ b/phoenix-shaded-commons-cli/src/main/patches/CLI-254-1.4.patch
@@ -0,0 +1,72 @@
+diff --git src/main/java/org/apache/commons/cli/DefaultParser.java src/main/java/org/apache/commons/cli/DefaultParser.java
+index d762a3e..ebc324f 100644
+--- src/main/java/org/apache/commons/cli/DefaultParser.java
++++ src/main/java/org/apache/commons/cli/DefaultParser.java
+@@ -54,7 +54,44 @@ public class DefaultParser implements CommandLineParser
+  
+     /** The required options and groups expected to be found when parsing the command line. */
+     protected List expectedOpts;
+- 
++
++    public DefaultParser() {
++        this.stripLeadingAndTrailingQuotes = true;
++    }
++
++    /** Flag indicating if balanced leading and trailing double quotes should be stripped from option arguments. */
++    private final  boolean stripLeadingAndTrailingQuotes;
++
++    /**
++     * Create a new DefaultParser instance with the specified partial matching and quote
++     * stripping policy.
++     *
++     * By "partial matching" we mean that given the following code:
++     * <pre>
++     *     {@code
++     *          final Options options = new Options();
++     *      options.addOption(new Option("d", "debug", false, "Turn on debug."));
++     *      options.addOption(new Option("e", "extract", false, "Turn on extract."));
++     *      options.addOption(new Option("o", "option", true, "Turn on option with argument."));
++     *      }
++     * </pre>
++     * with "partial matching" turned on, <code>-de</code> only matches the
++     * <code>"debug"</code> option. However, with "partial matching" disabled,
++     * <code>-de</code> would enable both <code>debug</code> as well as
++     * <code>extract</code> options.
++     * with "stripping of balanced leading and trailing double quotes from option arguments" turned
++     * on, the outermost balanced double quotes of option arguments values will be removed.
++     * ie.
++     * for <code>-o '"x"'</code> getValue() will return <code>x</code>, instead of <code>"x"</code>
++     * @param allowPartialMatching if partial matching of long options shall be enabled
++     * @param stripLeadingAndTrailingQuotes if balanced outer double quoutes should be stripped
++     */
++    public DefaultParser(final boolean allowPartialMatching,
++            final boolean stripLeadingAndTrailingQuotes) {
++        // We do not care about allowPartialMatching in this patch
++        this.stripLeadingAndTrailingQuotes = stripLeadingAndTrailingQuotes;
++    }
++
+     public CommandLine parse(Options options, String[] arguments) throws ParseException
+     {
+         return parse(options, arguments, null);
+@@ -232,7 +269,7 @@ public class DefaultParser implements CommandLineParser
+         }
+         else if (currentOption != null && currentOption.acceptsArg() && isArgument(token))
+         {
+-            currentOption.addValueForProcessing(Util.stripLeadingAndTrailingQuotes(token));
++            currentOption.addValueForProcessing(conditionallyStripLeadingAndTrailingQuotes(token));
+         }
+         else if (token.startsWith("--"))
+         {
+@@ -704,4 +741,12 @@ public class DefaultParser implements CommandLineParser
+             }
+         }
+     }
++
++    protected String conditionallyStripLeadingAndTrailingQuotes(final String token) {
++        if(stripLeadingAndTrailingQuotes) {
++            return Util.stripLeadingAndTrailingQuotes(token);
++        } else {
++            return token;
++        }
++    }
+ }
diff --git a/phoenix-shaded-guava/pom.xml b/phoenix-shaded-guava/pom.xml
index dba90c6..9b5ebd6 100644
--- a/phoenix-shaded-guava/pom.xml
+++ b/phoenix-shaded-guava/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.phoenix.thirdparty</groupId>
     <artifactId>phoenix-thirdparty</artifactId>
-    <version>1.0.1-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>phoenix-shaded-guava</artifactId>
diff --git a/pom.xml b/pom.xml
index b72bffb..ce1ca05 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
   <groupId>org.apache.phoenix.thirdparty</groupId>
   <artifactId>phoenix-thirdparty</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
+  <version>1.1.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>Apache Phoenix Third-Party Libs</name>
   <description>Packaging of relocated (renamed, shaded) third-party libraries used by Phoenix.</description>
@@ -50,6 +50,7 @@
 
   <modules>
     <module>phoenix-shaded-guava</module>
+    <module>phoenix-shaded-commons-cli</module>
   </modules>
 
   <scm>
@@ -68,6 +69,7 @@
   <properties>
     <rename.offset>org.apache.phoenix.thirdparty</rename.offset>
     <guava.version>29.0-android</guava.version>
+    <commons-cli.version>1.4</commons-cli.version>
   </properties>
 
   <build>