This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch maven-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-4.0.x by this push:
     new 59a6806ba3 Restore compatibility in maven-embedder (#11320) (#11340)
59a6806ba3 is described below

commit 59a6806ba3f84b5c4de49a0adefac5f22823799c
Author: Guillaume Nodet <[email protected]>
AuthorDate: Mon Oct 27 16:05:30 2025 +0100

    Restore compatibility in maven-embedder (#11320) (#11340)
    
    * Initial plan
    
    * Add missing deprecated constants to MavenCli for backward compatibility
    
    * Add missing extension model classes for backward compatibility
    
    - Created org.apache.maven.cli.internal.extension.model package
    - Added CoreExtension and CoreExtensions classes (deprecated)
    - Updated ExtensionResolutionException to return old model type
    - Added overloaded constructor for compatibility with new API
    
    * Add missing xpp3 reader/writer
    
    * Do not add @Deprecated on constants since the class already is
    
    * Add two other missing constants
    
    ---------
    
    (cherry picked from commit 9a5fb675b7f6122a17e1e2e653e0ae942b0025ba)
    
    Co-authored-by: copilot-swe-agent[bot] 
<[email protected]>
    Co-authored-by: laeubi <[email protected]>
---
 .../main/java/org/apache/maven/cli/MavenCli.java   |  34 +
 .../cli/internal/ExtensionResolutionException.java |  24 +-
 .../internal/extension/model/CoreExtension.java    | 155 +++++
 .../internal/extension/model/CoreExtensions.java   | 109 ++++
 .../model/io/xpp3/CoreExtensionsXpp3Reader.java    | 692 +++++++++++++++++++++
 .../model/io/xpp3/CoreExtensionsXpp3Writer.java    | 173 ++++++
 6 files changed, 1186 insertions(+), 1 deletion(-)

diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
index 4e3ffdbae6..7f6065acf8 100644
--- a/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
+++ b/compat/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
@@ -140,8 +140,42 @@
 @Deprecated
 public class MavenCli {
 
+    /**
+     * @deprecated Use {@link org.apache.maven.api.Constants#MAVEN_REPO_LOCAL} 
instead
+     */
+    public static final String LOCAL_REPO_PROPERTY = "maven.repo.local";
+
+    /**
+     * @deprecated Use {@link org.apache.maven.api.Session#getRootDirectory()} 
instead
+     */
     public static final String MULTIMODULE_PROJECT_DIRECTORY = 
"maven.multiModuleProjectDirectory";
 
+    /**
+     * @deprecated Use {@link System#getProperty(String)} with "user.home" 
instead
+     */
+    public static final String USER_HOME = System.getProperty("user.home");
+
+    /**
+     * @deprecated Use {@link org.apache.maven.api.Constants#MAVEN_USER_CONF} 
instead
+     */
+    public static final File USER_MAVEN_CONFIGURATION_HOME = new 
File(USER_HOME, ".m2");
+
+    /**
+     * @deprecated Use {@link 
org.apache.maven.api.Constants#MAVEN_USER_TOOLCHAINS} instead
+     */
+    public static final File DEFAULT_USER_TOOLCHAINS_FILE = new 
File(USER_MAVEN_CONFIGURATION_HOME, "toolchains.xml");
+
+    /**
+     * @deprecated Use {@link 
org.apache.maven.api.Constants#MAVEN_INSTALLATION_TOOLCHAINS} instead
+     */
+    public static final File DEFAULT_GLOBAL_TOOLCHAINS_FILE =
+            new File(System.getProperty("maven.conf"), "toolchains.xml");
+
+    /**
+     * @deprecated Use {@link 
org.apache.maven.api.Constants#MAVEN_STYLE_COLOR_PROPERTY} instead
+     */
+    public static final String STYLE_COLOR_PROPERTY = "style.color";
+
     private static final String MVN_MAVEN_CONFIG = ".mvn/maven.config";
 
     private ClassWorld classWorld;
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java
index 56a601901f..87e62f8360 100644
--- 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java
@@ -18,7 +18,7 @@
  */
 package org.apache.maven.cli.internal;
 
-import org.apache.maven.api.cli.extensions.CoreExtension;
+import org.apache.maven.cli.internal.extension.model.CoreExtension;
 
 /**
  * Exception occurring trying to resolve a plugin.
@@ -37,6 +37,28 @@ public ExtensionResolutionException(CoreExtension extension, 
Throwable cause) {
         this.extension = extension;
     }
 
+    /**
+     * Constructor accepting the new API type for internal use.
+     *
+     * @param extension the new API extension
+     * @param cause the cause
+     */
+    public 
ExtensionResolutionException(org.apache.maven.api.cli.extensions.CoreExtension 
extension, Throwable cause) {
+        super(
+                "Extension " + extension.getId() + " or one of its 
dependencies could not be resolved: "
+                        + cause.getMessage(),
+                cause);
+        // Convert to old type
+        CoreExtension oldExtension = new CoreExtension();
+        oldExtension.setGroupId(extension.getGroupId());
+        oldExtension.setArtifactId(extension.getArtifactId());
+        oldExtension.setVersion(extension.getVersion());
+        if (extension.getClassLoadingStrategy() != null) {
+            
oldExtension.setClassLoadingStrategy(extension.getClassLoadingStrategy());
+        }
+        this.extension = oldExtension;
+    }
+
     public CoreExtension getExtension() {
         return extension;
     }
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/CoreExtension.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/CoreExtension.java
new file mode 100644
index 0000000000..c5ece38537
--- /dev/null
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/CoreExtension.java
@@ -0,0 +1,155 @@
+/*
+ * 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.
+ */
+package org.apache.maven.cli.internal.extension.model;
+
+/**
+ * Describes a build extension to utilise.
+ *
+ * @deprecated Use {@link org.apache.maven.api.cli.extensions.CoreExtension} 
instead
+ */
+@Deprecated
+@SuppressWarnings("all")
+public class CoreExtension implements java.io.Serializable {
+
+    // --------------------------/
+    // - Class/Member Variables -/
+    // --------------------------/
+
+    /**
+     * The group ID of the extension's artifact.
+     */
+    private String groupId;
+
+    /**
+     * The artifact ID of the extension.
+     */
+    private String artifactId;
+
+    /**
+     * The version of the extension.
+     */
+    private String version;
+
+    /**
+     * The class loading strategy: 'self-first' (the default),
+     * 'parent-first' (loads classes from the parent, then from the
+     * extension) or 'plugin' (follows the rules from extensions
+     * defined as plugins).
+     */
+    private String classLoadingStrategy = "self-first";
+
+    // -----------/
+    // - Methods -/
+    // -----------/
+
+    /**
+     * Get the artifact ID of the extension.
+     *
+     * @return String
+     */
+    public String getArtifactId() {
+        return this.artifactId;
+    } // -- String getArtifactId()
+
+    /**
+     * Get the class loading strategy: 'self-first' (the default),
+     * 'parent-first' (loads classes from the parent, then from the
+     * extension) or 'plugin' (follows the rules from extensions
+     * defined as plugins).
+     *
+     * @return String
+     */
+    public String getClassLoadingStrategy() {
+        return this.classLoadingStrategy;
+    } // -- String getClassLoadingStrategy()
+
+    /**
+     * Get the group ID of the extension's artifact.
+     *
+     * @return String
+     */
+    public String getGroupId() {
+        return this.groupId;
+    } // -- String getGroupId()
+
+    /**
+     * Get the version of the extension.
+     *
+     * @return String
+     */
+    public String getVersion() {
+        return this.version;
+    } // -- String getVersion()
+
+    /**
+     * Set the artifact ID of the extension.
+     *
+     * @param artifactId a artifactId object.
+     */
+    public void setArtifactId(String artifactId) {
+        this.artifactId = artifactId;
+    } // -- void setArtifactId( String )
+
+    /**
+     * Set the class loading strategy: 'self-first' (the default),
+     * 'parent-first' (loads classes from the parent, then from the
+     * extension) or 'plugin' (follows the rules from extensions
+     * defined as plugins).
+     *
+     * @param classLoadingStrategy a classLoadingStrategy object.
+     */
+    public void setClassLoadingStrategy(String classLoadingStrategy) {
+        this.classLoadingStrategy = classLoadingStrategy;
+    } // -- void setClassLoadingStrategy( String )
+
+    /**
+     * Set the group ID of the extension's artifact.
+     *
+     * @param groupId a groupId object.
+     */
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    } // -- void setGroupId( String )
+
+    /**
+     * Set the version of the extension.
+     *
+     * @param version a version object.
+     */
+    public void setVersion(String version) {
+        this.version = version;
+    } // -- void setVersion( String )
+
+    /**
+     * Gets the identifier of the extension.
+     *
+     * @return The extension id in the form {@code 
<groupId>:<artifactId>:<version>}, never {@code null}.
+     */
+    public String getId() {
+        StringBuilder id = new StringBuilder(128);
+
+        id.append((getGroupId() == null) ? "[unknown-group-id]" : 
getGroupId());
+        id.append(":");
+        id.append((getArtifactId() == null) ? "[unknown-artifact-id]" : 
getArtifactId());
+        id.append(":");
+        id.append((getVersion() == null) ? "[unknown-version]" : getVersion());
+
+        return id.toString();
+    }
+}
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/CoreExtensions.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/CoreExtensions.java
new file mode 100644
index 0000000000..6a9f88636d
--- /dev/null
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/CoreExtensions.java
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ */
+package org.apache.maven.cli.internal.extension.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Extensions to load.
+ *
+ * @deprecated Use {@link org.apache.maven.api.cli.extensions.CoreExtension} 
instead
+ */
+@Deprecated
+@SuppressWarnings("all")
+public class CoreExtensions implements Serializable {
+
+    // --------------------------/
+    // - Class/Member Variables -/
+    // --------------------------/
+
+    /**
+     * Field extensions.
+     */
+    private List<CoreExtension> extensions;
+
+    /**
+     * Field modelEncoding.
+     */
+    private String modelEncoding = "UTF-8";
+
+    // -----------/
+    // - Methods -/
+    // -----------/
+
+    /**
+     * Method addExtension.
+     *
+     * @param coreExtension a coreExtension object.
+     */
+    public void addExtension(CoreExtension coreExtension) {
+        getExtensions().add(coreExtension);
+    } // -- void addExtension( CoreExtension )
+
+    /**
+     * Method getExtensions.
+     *
+     * @return List
+     */
+    public List<CoreExtension> getExtensions() {
+        if (this.extensions == null) {
+            this.extensions = new ArrayList<CoreExtension>();
+        }
+
+        return this.extensions;
+    } // -- List<CoreExtension> getExtensions()
+
+    /**
+     * Get the modelEncoding field.
+     *
+     * @return String
+     */
+    public String getModelEncoding() {
+        return this.modelEncoding;
+    } // -- String getModelEncoding()
+
+    /**
+     * Method removeExtension.
+     *
+     * @param coreExtension a coreExtension object.
+     */
+    public void removeExtension(CoreExtension coreExtension) {
+        getExtensions().remove(coreExtension);
+    } // -- void removeExtension( CoreExtension )
+
+    /**
+     * Set a set of build extensions to use from this project.
+     *
+     * @param extensions a extensions object.
+     */
+    public void setExtensions(List<CoreExtension> extensions) {
+        this.extensions = extensions;
+    } // -- void setExtensions( List )
+
+    /**
+     * Set the modelEncoding field.
+     *
+     * @param modelEncoding a modelEncoding object.
+     */
+    public void setModelEncoding(String modelEncoding) {
+        this.modelEncoding = modelEncoding;
+    } // -- void setModelEncoding( String )
+}
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Reader.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Reader.java
new file mode 100644
index 0000000000..04eb952da4
--- /dev/null
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Reader.java
@@ -0,0 +1,692 @@
+/*
+ * 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.
+ */
+package org.apache.maven.cli.internal.extension.model.io.xpp3;
+
+// ---------------------------------/
+// - Imported classes and packages -/
+// ---------------------------------/
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.text.DateFormat;
+
+import org.apache.maven.cli.internal.extension.model.CoreExtension;
+import org.apache.maven.cli.internal.extension.model.CoreExtensions;
+import org.codehaus.plexus.util.xml.XmlStreamReader;
+import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
+import org.codehaus.plexus.util.xml.pull.MXParser;
+import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+/**
+ * Class CoreExtensionsXpp3Reader.
+ *
+ * @deprecated use {@code 
org.apache.maven.cling.internal.extension.io.CoreExtensionsStaxReader}
+ */
+@Deprecated
+@SuppressWarnings("all")
+public class CoreExtensionsXpp3Reader {
+
+    // --------------------------/
+    // - Class/Member Variables -/
+    // --------------------------/
+
+    /**
+     * If set the parser will be loaded with all single characters
+     * from the XHTML specification.
+     * The entities used:
+     * <ul>
+     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent</li>
+     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent</li>
+     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent</li>
+     * </ul>
+     */
+    private boolean addDefaultEntities = true;
+
+    /**
+     * Field contentTransformer.
+     */
+    public final ContentTransformer contentTransformer;
+
+    // ----------------/
+    // - Constructors -/
+    // ----------------/
+
+    public CoreExtensionsXpp3Reader() {
+        this(new ContentTransformer() {
+            public String transform(String source, String fieldName) {
+                return source;
+            }
+        });
+    } // -- 
org.apache.maven.cli.internal.extension.model.io.xpp3.CoreExtensionsXpp3Reader()
+
+    public CoreExtensionsXpp3Reader(ContentTransformer contentTransformer) {
+        this.contentTransformer = contentTransformer;
+    } // -- 
org.apache.maven.cli.internal.extension.model.io.xpp3.CoreExtensionsXpp3Reader(ContentTransformer)
+
+    // -----------/
+    // - Methods -/
+    // -----------/
+
+    /**
+     * Method checkFieldWithDuplicate.
+     *
+     * @param parser a parser object.
+     * @param parsed a parsed object.
+     * @param alias a alias object.
+     * @param tagName a tagName object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return boolean
+     */
+    private boolean checkFieldWithDuplicate(
+            XmlPullParser parser, String tagName, String alias, 
java.util.Set<String> parsed)
+            throws XmlPullParserException {
+        if (!(parser.getName().equals(tagName) || 
parser.getName().equals(alias))) {
+            return false;
+        }
+        if (!parsed.add(tagName)) {
+            throw new XmlPullParserException("Duplicated tag: '" + tagName + 
"'", parser, null);
+        }
+        return true;
+    } // -- boolean checkFieldWithDuplicate( XmlPullParser, String, String, 
java.util.Set )
+
+    /**
+     * Method checkUnknownAttribute.
+     *
+     * @param parser a parser object.
+     * @param strict a strict object.
+     * @param tagName a tagName object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @throws IOException IOException if any.
+     */
+    private void checkUnknownAttribute(XmlPullParser parser, String attribute, 
String tagName, boolean strict)
+            throws XmlPullParserException, IOException {
+        // strictXmlAttributes = true for model: if strict == true, not only 
elements are checked but attributes too
+        if (strict) {
+            throw new XmlPullParserException(
+                    "Unknown attribute '" + attribute + "' for tag '" + 
tagName + "'", parser, null);
+        }
+    } // -- void checkUnknownAttribute( XmlPullParser, String, String, boolean 
)
+
+    /**
+     * Method checkUnknownElement.
+     *
+     * @param parser a parser object.
+     * @param strict a strict object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @throws IOException IOException if any.
+     */
+    private void checkUnknownElement(XmlPullParser parser, boolean strict) 
throws XmlPullParserException, IOException {
+        if (strict) {
+            throw new XmlPullParserException("Unrecognised tag: '" + 
parser.getName() + "'", parser, null);
+        }
+
+        for (int unrecognizedTagCount = 1; unrecognizedTagCount > 0; ) {
+            int eventType = parser.next();
+            if (eventType == XmlPullParser.START_TAG) {
+                unrecognizedTagCount++;
+            } else if (eventType == XmlPullParser.END_TAG) {
+                unrecognizedTagCount--;
+            }
+        }
+    } // -- void checkUnknownElement( XmlPullParser, boolean )
+
+    /**
+     * Returns the state of the "add default entities" flag.
+     *
+     * @return boolean
+     */
+    public boolean getAddDefaultEntities() {
+        return addDefaultEntities;
+    } // -- boolean getAddDefaultEntities()
+
+    /**
+     * Method getBooleanValue.
+     *
+     * @param s a s object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return boolean
+     */
+    private boolean getBooleanValue(String s, String attribute, XmlPullParser 
parser) throws XmlPullParserException {
+        return getBooleanValue(s, attribute, parser, null);
+    } // -- boolean getBooleanValue( String, String, XmlPullParser )
+
+    /**
+     * Method getBooleanValue.
+     *
+     * @param s a s object.
+     * @param defaultValue a defaultValue object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return boolean
+     */
+    private boolean getBooleanValue(String s, String attribute, XmlPullParser 
parser, String defaultValue)
+            throws XmlPullParserException {
+        if (s != null && s.length() != 0) {
+            return Boolean.valueOf(s).booleanValue();
+        }
+        if (defaultValue != null) {
+            return Boolean.valueOf(defaultValue).booleanValue();
+        }
+        return false;
+    } // -- boolean getBooleanValue( String, String, XmlPullParser, String )
+
+    /**
+     * Method getByteValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return byte
+     */
+    private byte getByteValue(String s, String attribute, XmlPullParser 
parser, boolean strict)
+            throws XmlPullParserException {
+        if (s != null) {
+            try {
+                return Byte.valueOf(s).byteValue();
+            } catch (NumberFormatException nfe) {
+                if (strict) {
+                    throw new XmlPullParserException(
+                            "Unable to parse element '" + attribute + "', must 
be a byte", parser, nfe);
+                }
+            }
+        }
+        return 0;
+    } // -- byte getByteValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getCharacterValue.
+     *
+     * @param s a s object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return char
+     */
+    private char getCharacterValue(String s, String attribute, XmlPullParser 
parser) throws XmlPullParserException {
+        if (s != null) {
+            return s.charAt(0);
+        }
+        return 0;
+    } // -- char getCharacterValue( String, String, XmlPullParser )
+
+    /**
+     * Method getDateValue.
+     *
+     * @param s a s object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return Date
+     */
+    private java.util.Date getDateValue(String s, String attribute, 
XmlPullParser parser)
+            throws XmlPullParserException {
+        return getDateValue(s, attribute, null, parser);
+    } // -- java.util.Date getDateValue( String, String, XmlPullParser )
+
+    /**
+     * Method getDateValue.
+     *
+     * @param s a s object.
+     * @param parser a parser object.
+     * @param dateFormat a dateFormat object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return Date
+     */
+    private java.util.Date getDateValue(String s, String attribute, String 
dateFormat, XmlPullParser parser)
+            throws XmlPullParserException {
+        if (s != null) {
+            String effectiveDateFormat = dateFormat;
+            if (dateFormat == null) {
+                effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+            }
+            if ("long".equals(effectiveDateFormat)) {
+                try {
+                    return new java.util.Date(Long.parseLong(s));
+                } catch (NumberFormatException e) {
+                    throw new XmlPullParserException(e.getMessage(), parser, 
e);
+                }
+            } else {
+                try {
+                    DateFormat dateParser = new 
java.text.SimpleDateFormat(effectiveDateFormat, java.util.Locale.US);
+                    return dateParser.parse(s);
+                } catch (java.text.ParseException e) {
+                    throw new XmlPullParserException(e.getMessage(), parser, 
e);
+                }
+            }
+        }
+        return null;
+    } // -- java.util.Date getDateValue( String, String, String, XmlPullParser 
)
+
+    /**
+     * Method getDoubleValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return double
+     */
+    private double getDoubleValue(String s, String attribute, XmlPullParser 
parser, boolean strict)
+            throws XmlPullParserException {
+        if (s != null) {
+            try {
+                return Double.valueOf(s).doubleValue();
+            } catch (NumberFormatException nfe) {
+                if (strict) {
+                    throw new XmlPullParserException(
+                            "Unable to parse element '" + attribute + "', must 
be a floating point number",
+                            parser,
+                            nfe);
+                }
+            }
+        }
+        return 0;
+    } // -- double getDoubleValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getFloatValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return float
+     */
+    private float getFloatValue(String s, String attribute, XmlPullParser 
parser, boolean strict)
+            throws XmlPullParserException {
+        if (s != null) {
+            try {
+                return Float.valueOf(s).floatValue();
+            } catch (NumberFormatException nfe) {
+                if (strict) {
+                    throw new XmlPullParserException(
+                            "Unable to parse element '" + attribute + "', must 
be a floating point number",
+                            parser,
+                            nfe);
+                }
+            }
+        }
+        return 0;
+    } // -- float getFloatValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getIntegerValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return int
+     */
+    private int getIntegerValue(String s, String attribute, XmlPullParser 
parser, boolean strict)
+            throws XmlPullParserException {
+        if (s != null) {
+            try {
+                return Integer.valueOf(s).intValue();
+            } catch (NumberFormatException nfe) {
+                if (strict) {
+                    throw new XmlPullParserException(
+                            "Unable to parse element '" + attribute + "', must 
be an integer", parser, nfe);
+                }
+            }
+        }
+        return 0;
+    } // -- int getIntegerValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getLongValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return long
+     */
+    private long getLongValue(String s, String attribute, XmlPullParser 
parser, boolean strict)
+            throws XmlPullParserException {
+        if (s != null) {
+            try {
+                return Long.valueOf(s).longValue();
+            } catch (NumberFormatException nfe) {
+                if (strict) {
+                    throw new XmlPullParserException(
+                            "Unable to parse element '" + attribute + "', must 
be a long integer", parser, nfe);
+                }
+            }
+        }
+        return 0;
+    } // -- long getLongValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getRequiredAttributeValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return String
+     */
+    private String getRequiredAttributeValue(String s, String attribute, 
XmlPullParser parser, boolean strict)
+            throws XmlPullParserException {
+        if (s == null) {
+            if (strict) {
+                throw new XmlPullParserException(
+                        "Missing required value for attribute '" + attribute + 
"'", parser, null);
+            }
+        }
+        return s;
+    } // -- String getRequiredAttributeValue( String, String, XmlPullParser, 
boolean )
+
+    /**
+     * Method getShortValue.
+     *
+     * @param s a s object.
+     * @param strict a strict object.
+     * @param parser a parser object.
+     * @param attribute a attribute object.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return short
+     */
+    private short getShortValue(String s, String attribute, XmlPullParser 
parser, boolean strict)
+            throws XmlPullParserException {
+        if (s != null) {
+            try {
+                return Short.valueOf(s).shortValue();
+            } catch (NumberFormatException nfe) {
+                if (strict) {
+                    throw new XmlPullParserException(
+                            "Unable to parse element '" + attribute + "', must 
be a short integer", parser, nfe);
+                }
+            }
+        }
+        return 0;
+    } // -- short getShortValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getTrimmedValue.
+     *
+     * @param s a s object.
+     * @return String
+     */
+    private String getTrimmedValue(String s) {
+        if (s != null) {
+            s = s.trim();
+        }
+        return s;
+    } // -- String getTrimmedValue( String )
+
+    /**
+     * Method interpolatedTrimmed.
+     *
+     * @param value a value object.
+     * @param context a context object.
+     * @return String
+     */
+    private String interpolatedTrimmed(String value, String context) {
+        return getTrimmedValue(contentTransformer.transform(value, context));
+    } // -- String interpolatedTrimmed( String, String )
+
+    /**
+     * Method nextTag.
+     *
+     * @param parser a parser object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return int
+     */
+    private int nextTag(XmlPullParser parser) throws IOException, 
XmlPullParserException {
+        int eventType = parser.next();
+        if (eventType == XmlPullParser.TEXT) {
+            eventType = parser.next();
+        }
+        if (eventType != XmlPullParser.START_TAG && eventType != 
XmlPullParser.END_TAG) {
+            throw new XmlPullParserException(
+                    "expected START_TAG or END_TAG not " + 
XmlPullParser.TYPES[eventType], parser, null);
+        }
+        return eventType;
+    } // -- int nextTag( XmlPullParser )
+
+    /**
+     * Method read.
+     *
+     * @param parser a parser object.
+     * @param strict a strict object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtensions
+     */
+    public CoreExtensions read(XmlPullParser parser, boolean strict) throws 
IOException, XmlPullParserException {
+        CoreExtensions coreExtensions = null;
+        int eventType = parser.getEventType();
+        boolean parsed = false;
+        while (eventType != XmlPullParser.END_DOCUMENT) {
+            if (eventType == XmlPullParser.START_TAG) {
+                if (strict && !"extensions".equals(parser.getName())) {
+                    throw new XmlPullParserException(
+                            "Expected root element 'extensions' but found '" + 
parser.getName() + "'", parser, null);
+                } else if (parsed) {
+                    // fallback, already expected a XmlPullParserException due 
to invalid XML
+                    throw new XmlPullParserException("Duplicated tag: 
'extensions'", parser, null);
+                }
+                coreExtensions = parseCoreExtensions(parser, strict);
+                coreExtensions.setModelEncoding(parser.getInputEncoding());
+                parsed = true;
+            }
+            eventType = parser.next();
+        }
+        if (parsed) {
+            return coreExtensions;
+        }
+        throw new XmlPullParserException(
+                "Expected root element 'extensions' but found no element at 
all: invalid XML document", parser, null);
+    } // -- CoreExtensions read( XmlPullParser, boolean )
+
+    /**
+     * @see XmlStreamReader
+     *
+     * @param reader a reader object.
+     * @param strict a strict object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtensions
+     */
+    public CoreExtensions read(Reader reader, boolean strict) throws 
IOException, XmlPullParserException {
+        XmlPullParser parser =
+                addDefaultEntities ? new 
MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser();
+
+        parser.setInput(reader);
+
+        return read(parser, strict);
+    } // -- CoreExtensions read( Reader, boolean )
+
+    /**
+     * @see XmlStreamReader
+     *
+     * @param reader a reader object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtensions
+     */
+    public CoreExtensions read(Reader reader) throws IOException, 
XmlPullParserException {
+        return read(reader, true);
+    } // -- CoreExtensions read( Reader )
+
+    /**
+     * Method read.
+     *
+     * @param in a in object.
+     * @param strict a strict object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtensions
+     */
+    public CoreExtensions read(InputStream in, boolean strict) throws 
IOException, XmlPullParserException {
+        return read(new XmlStreamReader(in), strict);
+    } // -- CoreExtensions read( InputStream, boolean )
+
+    /**
+     * Method read.
+     *
+     * @param in a in object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtensions
+     */
+    public CoreExtensions read(InputStream in) throws IOException, 
XmlPullParserException {
+        return read(new XmlStreamReader(in));
+    } // -- CoreExtensions read( InputStream )
+
+    /**
+     * Method parseCoreExtension.
+     *
+     * @param parser a parser object.
+     * @param strict a strict object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtension
+     */
+    private CoreExtension parseCoreExtension(XmlPullParser parser, boolean 
strict)
+            throws IOException, XmlPullParserException {
+        String tagName = parser.getName();
+        CoreExtension coreExtension = new CoreExtension();
+        for (int i = parser.getAttributeCount() - 1; i >= 0; i--) {
+            String name = parser.getAttributeName(i);
+            String value = parser.getAttributeValue(i);
+
+            if (name.indexOf(':') >= 0) {
+                // just ignore attributes with non-default namespace (for 
example: xmlns:xsi)
+            } else {
+                checkUnknownAttribute(parser, name, tagName, strict);
+            }
+        }
+        java.util.Set<String> parsed = new java.util.HashSet<String>();
+        while ((strict ? parser.nextTag() : nextTag(parser)) == 
XmlPullParser.START_TAG) {
+            if (checkFieldWithDuplicate(parser, "groupId", null, parsed)) {
+                
coreExtension.setGroupId(interpolatedTrimmed(parser.nextText(), "groupId"));
+            } else if (checkFieldWithDuplicate(parser, "artifactId", null, 
parsed)) {
+                
coreExtension.setArtifactId(interpolatedTrimmed(parser.nextText(), 
"artifactId"));
+            } else if (checkFieldWithDuplicate(parser, "version", null, 
parsed)) {
+                
coreExtension.setVersion(interpolatedTrimmed(parser.nextText(), "version"));
+            } else if (checkFieldWithDuplicate(parser, "classLoadingStrategy", 
null, parsed)) {
+                
coreExtension.setClassLoadingStrategy(interpolatedTrimmed(parser.nextText(), 
"classLoadingStrategy"));
+            } else {
+                checkUnknownElement(parser, strict);
+            }
+        }
+        return coreExtension;
+    } // -- CoreExtension parseCoreExtension( XmlPullParser, boolean )
+
+    /**
+     * Method parseCoreExtensions.
+     *
+     * @param parser a parser object.
+     * @param strict a strict object.
+     * @throws IOException IOException if any.
+     * @throws XmlPullParserException XmlPullParserException if
+     * any.
+     * @return CoreExtensions
+     */
+    private CoreExtensions parseCoreExtensions(XmlPullParser parser, boolean 
strict)
+            throws IOException, XmlPullParserException {
+        String tagName = parser.getName();
+        CoreExtensions coreExtensions = new CoreExtensions();
+        for (int i = parser.getAttributeCount() - 1; i >= 0; i--) {
+            String name = parser.getAttributeName(i);
+            String value = parser.getAttributeValue(i);
+
+            if (name.indexOf(':') >= 0) {
+                // just ignore attributes with non-default namespace (for 
example: xmlns:xsi)
+            } else if ("xmlns".equals(name)) {
+                // ignore xmlns attribute in root class, which is a reserved 
attribute name
+            } else {
+                checkUnknownAttribute(parser, name, tagName, strict);
+            }
+        }
+        java.util.Set<String> parsed = new java.util.HashSet<String>();
+        while ((strict ? parser.nextTag() : nextTag(parser)) == 
XmlPullParser.START_TAG) {
+            if ("extension".equals(parser.getName())) {
+                java.util.List<CoreExtension> extensions = 
coreExtensions.getExtensions();
+                if (extensions == null) {
+                    extensions = new java.util.ArrayList<CoreExtension>();
+                }
+                extensions.add(parseCoreExtension(parser, strict));
+                coreExtensions.setExtensions(extensions);
+            } else {
+                checkUnknownElement(parser, strict);
+            }
+        }
+        return coreExtensions;
+    } // -- CoreExtensions parseCoreExtensions( XmlPullParser, boolean )
+
+    /**
+     * Sets the state of the "add default entities" flag.
+     *
+     * @param addDefaultEntities a addDefaultEntities object.
+     */
+    public void setAddDefaultEntities(boolean addDefaultEntities) {
+        this.addDefaultEntities = addDefaultEntities;
+    } // -- void setAddDefaultEntities( boolean )
+
+    public static interface ContentTransformer {
+        /**
+         * Interpolate the value read from the xpp3 document
+         * @param source The source value
+         * @param fieldName A description of the field being interpolated. The 
implementation may use this to
+         *                           log stuff.
+         * @return The interpolated value.
+         */
+        String transform(String source, String fieldName);
+    }
+}
diff --git 
a/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Writer.java
 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Writer.java
new file mode 100644
index 0000000000..95fa069f02
--- /dev/null
+++ 
b/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Writer.java
@@ -0,0 +1,173 @@
+/*
+ * 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.
+ */
+package org.apache.maven.cli.internal.extension.model.io.xpp3;
+
+// ---------------------------------/
+// - Imported classes and packages -/
+// ---------------------------------/
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.Iterator;
+
+import org.apache.maven.cli.internal.extension.model.CoreExtension;
+import org.apache.maven.cli.internal.extension.model.CoreExtensions;
+import org.codehaus.plexus.util.xml.pull.MXSerializer;
+import org.codehaus.plexus.util.xml.pull.XmlSerializer;
+
+/**
+ * Class CoreExtensionsXpp3Writer.
+ *
+ * @deprecated use {@code 
org.apache.maven.cling.internal.extension.io.CoreExtensionsStaxWriter}
+ */
+@Deprecated
+@SuppressWarnings("all")
+public class CoreExtensionsXpp3Writer {
+
+    // --------------------------/
+    // - Class/Member Variables -/
+    // --------------------------/
+
+    /**
+     * Field NAMESPACE.
+     */
+    private static final String NAMESPACE = null;
+
+    /**
+     * Field fileComment.
+     */
+    private String fileComment = null;
+
+    // -----------/
+    // - Methods -/
+    // -----------/
+
+    /**
+     * Method setFileComment.
+     *
+     * @param fileComment a fileComment object.
+     */
+    public void setFileComment(String fileComment) {
+        this.fileComment = fileComment;
+    } // -- void setFileComment( String )
+
+    /**
+     * Method write.
+     *
+     * @param writer a writer object.
+     * @param coreExtensions a coreExtensions object.
+     * @throws IOException IOException if any.
+     */
+    public void write(Writer writer, CoreExtensions coreExtensions) throws 
IOException {
+        XmlSerializer serializer = new MXSerializer();
+        
serializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-indentation";,
 "  ");
+        
serializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-line-separator";,
 "\n");
+        serializer.setOutput(writer);
+        serializer.startDocument(coreExtensions.getModelEncoding(), null);
+        writeCoreExtensions(coreExtensions, "extensions", serializer);
+        serializer.endDocument();
+    } // -- void write( Writer, CoreExtensions )
+
+    /**
+     * Method write.
+     *
+     * @param stream a stream object.
+     * @param coreExtensions a coreExtensions object.
+     * @throws IOException IOException if any.
+     */
+    public void write(OutputStream stream, CoreExtensions coreExtensions) 
throws IOException {
+        XmlSerializer serializer = new MXSerializer();
+        
serializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-indentation";,
 "  ");
+        
serializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-line-separator";,
 "\n");
+        serializer.setOutput(stream, coreExtensions.getModelEncoding());
+        serializer.startDocument(coreExtensions.getModelEncoding(), null);
+        writeCoreExtensions(coreExtensions, "extensions", serializer);
+        serializer.endDocument();
+    } // -- void write( OutputStream, CoreExtensions )
+
+    /**
+     * Method writeCoreExtension.
+     *
+     * @param coreExtension a coreExtension object.
+     * @param serializer a serializer object.
+     * @param tagName a tagName object.
+     * @throws IOException IOException if any.
+     */
+    private void writeCoreExtension(CoreExtension coreExtension, String 
tagName, XmlSerializer serializer)
+            throws IOException {
+        serializer.startTag(NAMESPACE, tagName);
+        if (coreExtension.getGroupId() != null) {
+            serializer
+                    .startTag(NAMESPACE, "groupId")
+                    .text(coreExtension.getGroupId())
+                    .endTag(NAMESPACE, "groupId");
+        }
+        if (coreExtension.getArtifactId() != null) {
+            serializer
+                    .startTag(NAMESPACE, "artifactId")
+                    .text(coreExtension.getArtifactId())
+                    .endTag(NAMESPACE, "artifactId");
+        }
+        if (coreExtension.getVersion() != null) {
+            serializer
+                    .startTag(NAMESPACE, "version")
+                    .text(coreExtension.getVersion())
+                    .endTag(NAMESPACE, "version");
+        }
+        if ((coreExtension.getClassLoadingStrategy() != null)
+                && 
!coreExtension.getClassLoadingStrategy().equals("self-first")) {
+            serializer
+                    .startTag(NAMESPACE, "classLoadingStrategy")
+                    .text(coreExtension.getClassLoadingStrategy())
+                    .endTag(NAMESPACE, "classLoadingStrategy");
+        }
+        serializer.endTag(NAMESPACE, tagName);
+    } // -- void writeCoreExtension( CoreExtension, String, XmlSerializer )
+
+    /**
+     * Method writeCoreExtensions.
+     *
+     * @param coreExtensions a coreExtensions object.
+     * @param serializer a serializer object.
+     * @param tagName a tagName object.
+     * @throws IOException IOException if any.
+     */
+    private void writeCoreExtensions(CoreExtensions coreExtensions, String 
tagName, XmlSerializer serializer)
+            throws IOException {
+        if (this.fileComment != null) {
+            serializer.comment(this.fileComment);
+        }
+        serializer.setPrefix("", "http://maven.apache.org/EXTENSIONS/1.1.0";);
+        serializer.setPrefix("xsi", 
"http://www.w3.org/2001/XMLSchema-instance";);
+        serializer.startTag(NAMESPACE, tagName);
+        serializer.attribute(
+                "",
+                "xsi:schemaLocation",
+                "http://maven.apache.org/EXTENSIONS/1.1.0 
https://maven.apache.org/xsd/core-extensions-1.1.0.xsd";);
+        if ((coreExtensions.getExtensions() != null)
+                && (coreExtensions.getExtensions().size() > 0)) {
+            for (Iterator iter = coreExtensions.getExtensions().iterator(); 
iter.hasNext(); ) {
+                CoreExtension o = (CoreExtension) iter.next();
+                writeCoreExtension(o, "extension", serializer);
+            }
+        }
+        serializer.endTag(NAMESPACE, tagName);
+    } // -- void writeCoreExtensions( CoreExtensions, String, XmlSerializer )
+}


Reply via email to