This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push:
new 9d851eea6 [MNG-7678] Settings (v3) and Settings.Builder() cannot unset
a non-null field (#983)
9d851eea6 is described below
commit 9d851eea684ae4395cdacb5612cb23723c66240b
Author: Guillaume Nodet <[email protected]>
AuthorDate: Mon Mar 13 19:35:35 2023 +0100
[MNG-7678] Settings (v3) and Settings.Builder() cannot unset a non-null
field (#983)
---
.../maven/api/model/ImmutableCollections.java | 6 +-
.../maven/api/settings/ImmutableCollections.java | 6 +-
.../apache/maven/api/settings/SettingsTest.java | 41 +++++++++++++
.../maven/api/toolchain/ImmutableCollections.java | 6 +-
.../plugin/lifecycle/ImmutableCollections.java | 6 +-
src/mdo/model.vm | 71 ++++------------------
6 files changed, 72 insertions(+), 64 deletions(-)
diff --git
a/api/maven-api-model/src/main/java/org/apache/maven/api/model/ImmutableCollections.java
b/api/maven-api-model/src/main/java/org/apache/maven/api/model/ImmutableCollections.java
index 6c70c7400..2da8c291d 100644
---
a/api/maven-api-model/src/main/java/org/apache/maven/api/model/ImmutableCollections.java
+++
b/api/maven-api-model/src/main/java/org/apache/maven/api/model/ImmutableCollections.java
@@ -485,7 +485,11 @@ class ImmutableCollections {
private final Object[] entries;
private MapN(Map<K, V> map) {
- entries = map != null ? map.entrySet().toArray() : new Object[0];
+ entries = map != null
+ ? map.entrySet().stream()
+ .map(e -> new SimpleImmutableEntry<>(e.getKey(),
e.getValue()))
+ .toArray()
+ : new Object[0];
}
@Override
diff --git
a/api/maven-api-settings/src/main/java/org/apache/maven/api/settings/ImmutableCollections.java
b/api/maven-api-settings/src/main/java/org/apache/maven/api/settings/ImmutableCollections.java
index 78d5f2de6..cf6de272d 100644
---
a/api/maven-api-settings/src/main/java/org/apache/maven/api/settings/ImmutableCollections.java
+++
b/api/maven-api-settings/src/main/java/org/apache/maven/api/settings/ImmutableCollections.java
@@ -485,7 +485,11 @@ class ImmutableCollections {
private final Object[] entries;
private MapN(Map<K, V> map) {
- entries = map != null ? map.entrySet().toArray() : new Object[0];
+ entries = map != null
+ ? map.entrySet().stream()
+ .map(e -> new SimpleImmutableEntry<>(e.getKey(),
e.getValue()))
+ .toArray()
+ : new Object[0];
}
@Override
diff --git
a/api/maven-api-settings/src/test/java/org/apache/maven/api/settings/SettingsTest.java
b/api/maven-api-settings/src/test/java/org/apache/maven/api/settings/SettingsTest.java
new file mode 100644
index 000000000..2f525094c
--- /dev/null
+++
b/api/maven-api-settings/src/test/java/org/apache/maven/api/settings/SettingsTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.api.settings;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class SettingsTest {
+
+ @Test
+ void testSetLocalRepository() {
+ Settings s = Settings.newInstance();
+
+ s = s.withLocalRepository("xxx");
+ assertEquals("xxx", s.getLocalRepository());
+
+ s = s.withLocalRepository("yyy");
+ assertEquals("yyy", s.getLocalRepository());
+
+ s = s.withLocalRepository(null);
+ assertNull(s.getLocalRepository());
+ }
+}
diff --git
a/api/maven-api-toolchain/src/main/java/org/apache/maven/api/toolchain/ImmutableCollections.java
b/api/maven-api-toolchain/src/main/java/org/apache/maven/api/toolchain/ImmutableCollections.java
index 3f53f5d67..5fa99017e 100644
---
a/api/maven-api-toolchain/src/main/java/org/apache/maven/api/toolchain/ImmutableCollections.java
+++
b/api/maven-api-toolchain/src/main/java/org/apache/maven/api/toolchain/ImmutableCollections.java
@@ -485,7 +485,11 @@ class ImmutableCollections {
private final Object[] entries;
private MapN(Map<K, V> map) {
- entries = map != null ? map.entrySet().toArray() : new Object[0];
+ entries = map != null
+ ? map.entrySet().stream()
+ .map(e -> new SimpleImmutableEntry<>(e.getKey(),
e.getValue()))
+ .toArray()
+ : new Object[0];
}
@Override
diff --git
a/maven-plugin-api/src/main/java/org/apache/maven/plugin/lifecycle/ImmutableCollections.java
b/maven-plugin-api/src/main/java/org/apache/maven/plugin/lifecycle/ImmutableCollections.java
index e113d89c7..405edc3f0 100644
---
a/maven-plugin-api/src/main/java/org/apache/maven/plugin/lifecycle/ImmutableCollections.java
+++
b/maven-plugin-api/src/main/java/org/apache/maven/plugin/lifecycle/ImmutableCollections.java
@@ -485,7 +485,11 @@ class ImmutableCollections {
private final Object[] entries;
private MapN(Map<K, V> map) {
- entries = map != null ? map.entrySet().toArray() : new Object[0];
+ entries = map != null
+ ? map.entrySet().stream()
+ .map(e -> new SimpleImmutableEntry<>(e.getKey(),
e.getValue()))
+ .toArray()
+ : new Object[0];
}
@Override
diff --git a/src/mdo/model.vm b/src/mdo/model.vm
index 54341e3d6..c28fe29c4 100644
--- a/src/mdo/model.vm
+++ b/src/mdo/model.vm
@@ -125,15 +125,7 @@ public class ${class.name}
#end
#if ( $locationTracking )
#if ( ! $class.superClass )
- /** Location of the xml element for this object. */
- final InputLocation location;
- #end
- #foreach ( $field in $class.getFields($version) )
- /** Location of the xml element for the field ${field.name}. */
- final InputLocation ${field.name}Location;
- #end
- #if ( ! $class.superClass )
- /** Other locations */
+ /** Locations */
final Map<Object, InputLocation> locations;
#end
#end
@@ -155,13 +147,7 @@ public class ${class.name}
$type $field.name${sep}
#end
#if ( $locationTracking )
- Map<Object, InputLocation> locations,
- #set ( $sep = "#if(${allFields.size()}>0),#end" )
- InputLocation location${sep}
- #foreach ( $field in $allFields )
- #set ( $sep =
"#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
- InputLocation ${field.name}Location${sep}
- #end
+ Map<Object, InputLocation> locations
#end
)
{
@@ -172,13 +158,7 @@ public class ${class.name}
${field.name}${sep}
#end
#if ( $locationTracking )
- locations,
- #set ( $sep = "#if(${inheritedFields.size()}>0),#end" )
- location${sep}
- #foreach ( $field in $inheritedFields )
- #set ( $sep =
"#if(${locationTracking}&&$field!=${inheritedFields[${inheritedFields.size()} -
1]}),#end" )
- ${field.name}Location${sep}
- #end
+ locations
#end
);
#end
@@ -195,10 +175,6 @@ public class ${class.name}
#if ( $locationTracking )
#if ( ! $class.superClass )
this.locations = ImmutableCollections.copy( locations );
- this.location = location;
- #end
- #foreach ( $field in $class.getFields($version) )
- this.${field.name}Location = ${field.name}Location;
#end
#end
}
@@ -258,31 +234,13 @@ public class ${class.name}
}
#end
- #if ( $locationTracking )
+ #if ( $locationTracking && !$class.superClass )
/**
* Gets the location of the specified field in the input source.
*/
public InputLocation getLocation( Object key )
{
- if ( key instanceof String )
- {
- switch ( ( String ) key )
- {
- #if ( ! $class.superClass )
- case "":
- return location;
- #end
- #foreach ( $field in $class.getFields($version) )
- case "${field.name}":
- return ${field.name}Location;
- #end
- }
- }
- #if ( $class.superClass )
- return super.getLocation( key );
- #else
return locations != null ? locations.get( key ) : null;
- #end
}
#end
@@ -311,7 +269,7 @@ public class ${class.name}
@Nonnull
public ${class.name} with${cap}( $type $field.name )
{
- return with().${field.name}( $field.name ).build();
+ return newBuilder(this, true).${field.name}( $field.name ).build();
}
#end
@@ -453,6 +411,9 @@ public class ${class.name}
{
#foreach ( $field in $class.getFields($version) )
this.${field.name} = base.${field.name};
+ #end
+ #if ( $locationTracking )
+ this.locations = base.locations;
#end
}
else
@@ -490,9 +451,9 @@ public class ${class.name}
{
if ( location != null )
{
- if ( this.locations == null )
+ if ( !(this.locations instanceof HashMap) )
{
- this.locations = new HashMap<>();
+ this.locations = this.locations != null ? new HashMap<>(
this.locations ) : new HashMap<>();
}
this.locations.put( key, location );
}
@@ -520,10 +481,6 @@ public class ${class.name}
if ( this.locations != null )
{
locations = this.locations;
- location = locations.remove( "" );
- #foreach ( $field in $allFields )
- ${field.name}Location = locations.remove( "${field.name}" );
- #end
}
#end
return new ${class.name}(
@@ -539,13 +496,7 @@ public class ${class.name}
#end
#end
#if ( $locationTracking )
- locations != null ? locations : ( base != null ?
base.locations : null ),
- #set ( $sep = "#if(${allFields.size()}>0),#end" )
- location != null ? location : ( base != null ? base.location :
null )${sep}
- #foreach ( $field in $allFields )
- #set ( $sep =
"#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
- ${field.name}Location != null ? ${field.name}Location : ( base
!= null ? base.${field.name}Location : null )${sep}
- #end
+ locations != null ? locations : ( base != null ?
base.locations : null )
#end
);
}