Browse Source

j11 collection creation refactorings

Jason Rivard 4 years ago
parent
commit
471891640e
47 changed files with 188 additions and 308 deletions
  1. 2 4
      server/src/main/java/password/pwm/PwmConstants.java
  2. 8 15
      server/src/main/java/password/pwm/bean/TokenDestinationItem.java
  3. 7 9
      server/src/main/java/password/pwm/config/stored/ConfigurationCleaner.java
  4. 2 4
      server/src/main/java/password/pwm/config/stored/StoredConfigXmlSerializer.java
  5. 3 7
      server/src/main/java/password/pwm/config/value/LocalizedStringArrayValue.java
  6. 1 3
      server/src/main/java/password/pwm/config/value/StoredValueEncoder.java
  7. 16 15
      server/src/main/java/password/pwm/health/ConfigurationChecker.java
  8. 7 12
      server/src/main/java/password/pwm/http/PwmHttpRequestWrapper.java
  9. 1 1
      server/src/main/java/password/pwm/http/PwmSession.java
  10. 2 10
      server/src/main/java/password/pwm/http/PwmURL.java
  11. 4 11
      server/src/main/java/password/pwm/http/bean/PwmSessionBean.java
  12. 1 11
      server/src/main/java/password/pwm/http/filter/ObsoleteUrlFilter.java
  13. 2 2
      server/src/main/java/password/pwm/http/servlet/AbstractPwmServlet.java
  14. 1 1
      server/src/main/java/password/pwm/http/servlet/SetupOtpServlet.java
  15. 2 3
      server/src/main/java/password/pwm/http/servlet/activation/ActivateUserServlet.java
  16. 2 3
      server/src/main/java/password/pwm/http/servlet/admin/AdminServlet.java
  17. 12 24
      server/src/main/java/password/pwm/http/servlet/admin/AppDashboardData.java
  18. 4 6
      server/src/main/java/password/pwm/http/servlet/configmanager/DebugItemGenerator.java
  19. 2 3
      server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordServlet.java
  20. 10 16
      server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordStageProcessor.java
  21. 23 36
      server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordStateMachine.java
  22. 1 1
      server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordUtil.java
  23. 2 3
      server/src/main/java/password/pwm/http/servlet/helpdesk/HelpdeskVerificationStateBean.java
  24. 14 7
      server/src/main/java/password/pwm/http/servlet/newuser/NewUserServlet.java
  25. 1 1
      server/src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchDataReader.java
  26. 1 2
      server/src/main/java/password/pwm/http/servlet/resource/ResourceFileRequest.java
  27. 2 4
      server/src/main/java/password/pwm/http/tag/PasswordRequirementsTag.java
  28. 1 3
      server/src/main/java/password/pwm/http/tag/conditional/PwmIfTest.java
  29. 4 7
      server/src/main/java/password/pwm/i18n/PwmLocaleBundle.java
  30. 1 2
      server/src/main/java/password/pwm/ldap/LdapConnectionService.java
  31. 2 9
      server/src/main/java/password/pwm/ldap/schema/SchemaManager.java
  32. 1 2
      server/src/main/java/password/pwm/svc/PwmServiceManager.java
  33. 2 3
      server/src/main/java/password/pwm/svc/email/EmailConnectionPool.java
  34. 1 2
      server/src/main/java/password/pwm/svc/node/NodeMachine.java
  35. 1 1
      server/src/main/java/password/pwm/svc/sessiontrack/SessionTrackService.java
  36. 3 3
      server/src/main/java/password/pwm/util/CaptchaUtility.java
  37. 2 2
      server/src/main/java/password/pwm/util/cli/MainClass.java
  38. 1 2
      server/src/main/java/password/pwm/util/cli/commands/ShellCommand.java
  39. 13 16
      server/src/main/java/password/pwm/util/logging/PwmLogManager.java
  40. 2 5
      server/src/main/java/password/pwm/util/macro/StaticMacros.java
  41. 2 5
      server/src/main/java/password/pwm/util/macro/SystemMacros.java
  42. 2 5
      server/src/main/java/password/pwm/util/macro/UserMacros.java
  43. 1 1
      server/src/main/java/password/pwm/util/operations/OtpService.java
  44. 4 10
      server/src/main/java/password/pwm/util/operations/cr/NMASCrOperator.java
  45. 3 5
      server/src/main/java/password/pwm/util/password/PasswordRuleChecks.java
  46. 4 4
      server/src/main/java/password/pwm/ws/server/rest/RestStatisticsServer.java
  47. 5 7
      server/src/test/java/password/pwm/config/profile/PasswordRuleReaderHelperTest.java

+ 2 - 4
server/src/main/java/password/pwm/PwmConstants.java

@@ -28,7 +28,6 @@ import java.io.InputStream;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -172,7 +171,7 @@ public abstract class PwmConstants
     public static final String RESOURCE_FILE_WELCOME_TXT = "welcome.txt";
 
     // don't worry.  look over there.
-    public static final List<String> X_AMB_HEADER = Collections.unmodifiableList( Arrays.asList(
+    public static final List<String> X_AMB_HEADER = List.of(
             "bonjour!",
             "something witty!",
             "just like X-Fry, only ambier",
@@ -227,8 +226,7 @@ public abstract class PwmConstants
             // thx krowten
             "it's a wholesome can of software goodness",
 
-            "this password is an memorial of the richard d. kiel memorial abend"
-    ) );
+            "this password is an memorial of the richard d. kiel memorial abend" );
 
 
     private static String readPwmConstantsBundle( final String key )

+ 8 - 15
server/src/main/java/password/pwm/bean/TokenDestinationItem.java

@@ -40,7 +40,6 @@ import password.pwm.util.secure.SecureService;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -52,19 +51,13 @@ import java.util.Optional;
 @Builder
 public class TokenDestinationItem implements Serializable
 {
-    private static final Map<PwmSetting, TokenDestinationItem.Type> SETTING_TO_DEST_TYPE_MAP;
-
-    static
-    {
-        final Map<PwmSetting, TokenDestinationItem.Type> tempMap = new HashMap<>(  );
-        tempMap.put( PwmSetting.EMAIL_USER_MAIL_ATTRIBUTE, TokenDestinationItem.Type.email );
-        tempMap.put( PwmSetting.EMAIL_USER_MAIL_ATTRIBUTE_2, TokenDestinationItem.Type.email );
-        tempMap.put( PwmSetting.EMAIL_USER_MAIL_ATTRIBUTE_3, TokenDestinationItem.Type.email );
-        tempMap.put( PwmSetting.SMS_USER_PHONE_ATTRIBUTE, TokenDestinationItem.Type.sms );
-        tempMap.put( PwmSetting.SMS_USER_PHONE_ATTRIBUTE_2, TokenDestinationItem.Type.sms );
-        tempMap.put( PwmSetting.SMS_USER_PHONE_ATTRIBUTE_3, TokenDestinationItem.Type.sms );
-        SETTING_TO_DEST_TYPE_MAP = Collections.unmodifiableMap( tempMap );
-    }
+    private static final Map<PwmSetting, TokenDestinationItem.Type> SETTING_TO_DEST_TYPE_MAP = Map.of(
+        PwmSetting.EMAIL_USER_MAIL_ATTRIBUTE, TokenDestinationItem.Type.email,
+        PwmSetting.EMAIL_USER_MAIL_ATTRIBUTE_2, TokenDestinationItem.Type.email,
+        PwmSetting.EMAIL_USER_MAIL_ATTRIBUTE_3, TokenDestinationItem.Type.email,
+        PwmSetting.SMS_USER_PHONE_ATTRIBUTE, TokenDestinationItem.Type.sms,
+        PwmSetting.SMS_USER_PHONE_ATTRIBUTE_2, TokenDestinationItem.Type.sms,
+        PwmSetting.SMS_USER_PHONE_ATTRIBUTE_3, TokenDestinationItem.Type.sms );
 
     public static Map<PwmSetting, Type> getSettingToDestTypeMap( )
     {
@@ -149,7 +142,7 @@ public class TokenDestinationItem implements Serializable
             }
         }
 
-        return Collections.unmodifiableList( new ArrayList<>( results.values() ) );
+        return List.copyOf( results.values() );
     }
 
     public static Optional<TokenDestinationItem> tokenDestinationItemForID(

+ 7 - 9
server/src/main/java/password/pwm/config/stored/ConfigurationCleaner.java

@@ -36,8 +36,6 @@ import password.pwm.util.java.PwmExceptionLoggingConsumer;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Optional;
@@ -47,13 +45,13 @@ class ConfigurationCleaner
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( ConfigurationCleaner.class );
 
-    private static final List<PwmExceptionLoggingConsumer<StoredConfigurationModifier>> STORED_CONFIG_POST_PROCESSORS = Collections.unmodifiableList( Arrays.asList(
-            new UpdateDeprecatedAdComplexitySettings(),
-            new UpdateDeprecatedMinPwdLifetimeSetting(),
-            new UpdateDeprecatedPublicHealthSetting(),
-            new ProfileNonProfiledSettings(),
-            new CheckForSuperfluousProfileSettings()
-    ) );
+    private static final List<PwmExceptionLoggingConsumer<StoredConfigurationModifier>> STORED_CONFIG_POST_PROCESSORS =
+            List.of(
+                    new UpdateDeprecatedAdComplexitySettings(),
+                    new UpdateDeprecatedMinPwdLifetimeSetting(),
+                    new UpdateDeprecatedPublicHealthSetting(),
+                    new ProfileNonProfiledSettings(),
+                    new CheckForSuperfluousProfileSettings() );
 
     static void postProcessStoredConfig(
             final StoredConfigurationModifier storedConfiguration

+ 2 - 4
server/src/main/java/password/pwm/config/stored/StoredConfigXmlSerializer.java

@@ -54,7 +54,6 @@ import java.io.OutputStream;
 import java.time.Instant;
 import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EnumSet;
@@ -676,13 +675,12 @@ public class StoredConfigXmlSerializer implements StoredConfigSerializer
 
     static class XmlCleaner
     {
-        private static final List<PwmExceptionLoggingConsumer<XmlDocument>> XML_PRE_PROCESSORS = Collections.unmodifiableList( Arrays.asList(
+        private static final List<PwmExceptionLoggingConsumer<XmlDocument>> XML_PRE_PROCESSORS = List.of(
                 new MigratePreValueXmlElements(),
                 new MigrateOldPropertyFormat(),
                 new AppPropertyOverrideMigration(),
                 new MigrateDeprecatedProperties(),
-                new UpdatePropertiesWithoutType()
-        ) );
+                new UpdatePropertiesWithoutType() );
 
         static void preProcessXml(
                 final XmlDocument document

+ 3 - 7
server/src/main/java/password/pwm/config/value/LocalizedStringArrayValue.java

@@ -72,20 +72,16 @@ public class LocalizedStringArrayValue extends AbstractValue implements StoredVa
             public LocalizedStringArrayValue fromXmlElement( final PwmSetting pwmSetting, final XmlElement settingElement, final PwmSecurityKey key )
             {
                 final List<XmlElement> valueElements = settingElement.getChildren( "value" );
+
                 final Map<String, List<String>> values = new TreeMap<>();
                 for ( final XmlElement loopValueElement  : valueElements )
                 {
                     final String localeString = loopValueElement.getAttributeValue(
                             "locale" ) == null ? "" : loopValueElement.getAttributeValue( "locale" );
                     final String value = loopValueElement.getText();
-                    List<String> valueList = values.get( localeString );
-                    if ( valueList == null )
-                    {
-                        valueList = new ArrayList<>();
-                        values.put( localeString, valueList );
-                    }
-                    valueList.add( value );
+                    values.computeIfAbsent( localeString, s -> new ArrayList<>() ).add( value );
                 }
+
                 return new LocalizedStringArrayValue( values );
             }
         };

+ 1 - 3
server/src/main/java/password/pwm/config/value/StoredValueEncoder.java

@@ -34,8 +34,6 @@ import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.SecureEngine;
 
 import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 
@@ -58,7 +56,7 @@ public abstract class StoredValueEncoder
         Mode( final SecureOutputEngine secureOutputEngine, final String... prefixes )
         {
             this.secureOutputEngine = secureOutputEngine;
-            this.prefixes = Collections.unmodifiableList( Arrays.asList( prefixes ) );
+            this.prefixes = List.of( prefixes );
         }
 
         public List<String> getPrefixes()

+ 16 - 15
server/src/main/java/password/pwm/health/ConfigurationChecker.java

@@ -67,6 +67,18 @@ public class ConfigurationChecker implements HealthChecker
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( ConfigurationChecker.class );
 
+    private static final List<Class<? extends ConfigHealthCheck>> ALL_CHECKS = List.of(
+            VerifyBasicConfigs.class,
+            VerifyPasswordStrengthLevels.class,
+            VerifyPasswordPolicyConfigs.class,
+            VerifyResponseLdapAttribute.class,
+            VerifyDbConfiguredIfNeeded.class,
+            VerifyIfDeprecatedSendMethodValuesUsed.class,
+            VerifyIfDeprecatedJsFormOptionUsed.class,
+            VerifyNewUserLdapProfile.class,
+            VerifyPasswordWaitTimes.class,
+            VerifyUserPermissionSettings.class );
+
     @Override
     public List<HealthRecord> doHealthCheck( final PwmDomain pwmDomain )
     {
@@ -96,8 +108,8 @@ public class ConfigurationChecker implements HealthChecker
                 {
                     records.add( HealthRecord.forMessage(
                             HealthMessage.NewUser_PwTemplateBad,
-                             PwmSetting.NEWUSER_PASSWORD_POLICY_USER.toMenuLocationDebug( newUserProfile.getIdentifier(), PwmConstants.DEFAULT_LOCALE ),
-                             e.getMessage() ) );
+                            PwmSetting.NEWUSER_PASSWORD_POLICY_USER.toMenuLocationDebug( newUserProfile.getIdentifier(), PwmConstants.DEFAULT_LOCALE ),
+                            e.getMessage() ) );
                 }
             }
         }
@@ -140,18 +152,7 @@ public class ConfigurationChecker implements HealthChecker
         return records;
     }
 
-    private static final List<Class<? extends ConfigHealthCheck>> ALL_CHECKS = Collections.unmodifiableList( Arrays.asList(
-            VerifyBasicConfigs.class,
-            VerifyPasswordStrengthLevels.class,
-            VerifyPasswordPolicyConfigs.class,
-            VerifyResponseLdapAttribute.class,
-            VerifyDbConfiguredIfNeeded.class,
-            VerifyIfDeprecatedSendMethodValuesUsed.class,
-            VerifyIfDeprecatedJsFormOptionUsed.class,
-            VerifyNewUserLdapProfile.class,
-            VerifyPasswordWaitTimes.class,
-            VerifyUserPermissionSettings.class
-    ) );
+
 
     static class VerifyBasicConfigs implements ConfigHealthCheck
     {
@@ -644,7 +645,7 @@ public class ConfigurationChecker implements HealthChecker
         {
             if ( UserPermissionUtility.isAllProfiles( profileID ) )
             {
-                return Collections.unmodifiableList( new ArrayList<>( domainConfig.getLdapProfiles().values() ) );
+                return List.copyOf( domainConfig.getLdapProfiles().values() );
             }
 
             if ( domainConfig.getLdapProfiles().containsKey( profileID ) )

+ 7 - 12
server/src/main/java/password/pwm/http/PwmHttpRequestWrapper.java

@@ -43,7 +43,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -54,17 +53,13 @@ public class PwmHttpRequestWrapper
     private final HttpServletRequest httpServletRequest;
     private final DomainConfig domainConfig;
 
-    private static final Set<String> HTTP_PARAM_DEBUG_STRIP_VALUES =
-            Collections.unmodifiableSet( new HashSet<>( Arrays.asList(
-                    "password",
-                    PwmConstants.PARAM_TOKEN,
-                    PwmConstants.PARAM_RESPONSE_PREFIX ) )
-            );
-
-    private static final Set<String> HTTP_HEADER_DEBUG_STRIP_VALUES =
-            Collections.unmodifiableSet( new HashSet<>( Collections.singletonList(
-                    HttpHeader.Authorization.getHttpName() ) )
-            );
+    private static final Set<String> HTTP_PARAM_DEBUG_STRIP_VALUES = Set.of(
+            "password",
+            PwmConstants.PARAM_TOKEN,
+            PwmConstants.PARAM_RESPONSE_PREFIX );
+
+    private static final Set<String> HTTP_HEADER_DEBUG_STRIP_VALUES = Set.of(
+                    HttpHeader.Authorization.getHttpName() );
 
     public enum Flag
     {

+ 1 - 1
server/src/main/java/password/pwm/http/PwmSession.java

@@ -261,7 +261,7 @@ public class PwmSession implements Serializable
             // close out any outstanding connections
             getSessionManager().closeConnections();
 
-            LOGGER.debug( pwmRequest, () -> sb.toString() );
+            LOGGER.debug( pwmRequest, sb::toString );
         }
 
         if ( pwmRequest != null )

+ 2 - 10
server/src/main/java/password/pwm/http/PwmURL.java

@@ -31,7 +31,6 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -299,15 +298,8 @@ public class PwmURL
             return Collections.emptyList();
         }
         final List<String> urlSegments = new ArrayList<>( Arrays.asList( input.split( "/" ) ) );
-        for ( final Iterator<String> iterator = urlSegments.iterator(); iterator.hasNext(); )
-        {
-            final String segment = iterator.next();
-            if ( segment == null || segment.isEmpty() )
-            {
-                iterator.remove();
-            }
-        }
-        return urlSegments;
+        urlSegments.removeIf( StringUtil::isEmpty );
+        return Collections.unmodifiableList( urlSegments );
     }
 
     public static String appendAndEncodeUrlParameters(

+ 4 - 11
server/src/main/java/password/pwm/http/bean/PwmSessionBean.java

@@ -27,8 +27,6 @@ import password.pwm.error.ErrorInformation;
 
 import java.io.Serializable;
 import java.time.Instant;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -42,16 +40,11 @@ public abstract class PwmSessionBean implements Serializable
         AUTHENTICATED,
     }
 
-    private static List<Class<? extends PwmSessionBean>> publicBeans;
+    private static List<Class<? extends PwmSessionBean>> publicBeans = List.of(
+            ActivateUserBean.class,
+            ForgottenPasswordBean.class,
+            NewUserBean.class );
 
-    static
-    {
-        final List<Class<? extends PwmSessionBean>> list = new ArrayList<>(  );
-        list.add( ActivateUserBean.class );
-        list.add( ForgottenPasswordBean.class );
-        list.add( NewUserBean.class );
-        publicBeans = Collections.unmodifiableList( list );
-    }
 
     private String guid;
     private Instant timestamp;

+ 1 - 11
server/src/main/java/password/pwm/http/filter/ObsoleteUrlFilter.java

@@ -36,8 +36,6 @@ import password.pwm.util.logging.PwmLogger;
 
 import javax.servlet.ServletException;
 import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 
 public class ObsoleteUrlFilter extends AbstractPwmFilter
@@ -45,15 +43,7 @@ public class ObsoleteUrlFilter extends AbstractPwmFilter
 
     private static final PwmLogger LOGGER = PwmLogger.forClass( ObsoleteUrlFilter.class );
 
-    private static final Map<String, String> STATIC_REDIRECTS;
-
-    static
-    {
-        final Map<String, String> staticRedirects = new HashMap<>();
-        staticRedirects.put( PwmConstants.URL_PREFIX_PRIVATE, PwmConstants.URL_PREFIX_PRIVATE + "/" );
-        STATIC_REDIRECTS = Collections.unmodifiableMap( staticRedirects );
-    }
-
+    private static final Map<String, String> STATIC_REDIRECTS = Map.of( PwmConstants.URL_PREFIX_PRIVATE, PwmConstants.URL_PREFIX_PRIVATE + "/" );
 
     @Override
     void processFilter( final PwmApplicationMode mode, final PwmRequest pwmRequest, final PwmFilterChain filterChain )

+ 2 - 2
server/src/main/java/password/pwm/http/servlet/AbstractPwmServlet.java

@@ -100,7 +100,7 @@ public abstract class AbstractPwmServlet extends HttpServlet implements PwmServl
                     {
                         final ErrorInformation errorInformation = e.getErrorInformation();
                         final PwmSession pwmSession = PwmSessionWrapper.readPwmSession( req );
-                        LOGGER.error( pwmRequest, () -> errorInformation.toDebugStr() );
+                        LOGGER.error( pwmRequest, errorInformation::toDebugStr );
                         pwmRequest.respondWithError( errorInformation, false );
                         return;
                     }
@@ -116,7 +116,7 @@ public abstract class AbstractPwmServlet extends HttpServlet implements PwmServl
                 {
                     final ErrorInformation errorInformation = new ErrorInformation( PwmError.ERROR_SERVICE_NOT_AVAILABLE,
                             "incorrect request method " + method.toString() + " on request to " + pwmRequest.getURLwithQueryString() );
-                    LOGGER.error( pwmRequest, () -> errorInformation.toDebugStr() );
+                    LOGGER.error( pwmRequest, errorInformation::toDebugStr );
                     pwmRequest.respondWithError( errorInformation, false );
                     return;
                 }

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/SetupOtpServlet.java

@@ -215,7 +215,7 @@ public class SetupOtpServlet extends ControlledPwmServlet
                 {
                     errorInformation = new ErrorInformation( PwmError.ERROR_WRITING_OTP_SECRET, "unexpected error saving otp secret: " + e.getMessage() );
                 }
-                LOGGER.error( pwmRequest, () -> errorInformation.toDebugStr() );
+                LOGGER.error( pwmRequest, errorInformation::toDebugStr );
                 setLastError( pwmRequest, errorInformation );
             }
         }

+ 2 - 3
server/src/main/java/password/pwm/http/servlet/activation/ActivateUserServlet.java

@@ -22,8 +22,8 @@ package password.pwm.http.servlet.activation;
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.LocalSessionStateBean;
 import password.pwm.bean.TokenDestinationItem;
 import password.pwm.bean.UserIdentity;
@@ -68,7 +68,6 @@ import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -106,7 +105,7 @@ public class ActivateUserServlet extends ControlledPwmServlet
 
         ActivateUserAction( final HttpMethod... method )
         {
-            this.method = Collections.unmodifiableList( Arrays.asList( method ) );
+            this.method = List.of( method );
         }
 
         @Override

+ 2 - 3
server/src/main/java/password/pwm/http/servlet/admin/AdminServlet.java

@@ -24,8 +24,8 @@ import com.novell.ldapchai.exception.ChaiUnavailableException;
 import lombok.Value;
 import password.pwm.AppProperty;
 import password.pwm.Permission;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.UserIdentity;
 import password.pwm.bean.pub.SessionStateInfoBean;
 import password.pwm.config.DomainConfig;
@@ -85,7 +85,6 @@ import java.lang.management.ManagementFactory;
 import java.lang.management.ThreadInfo;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -139,7 +138,7 @@ public class AdminServlet extends ControlledPwmServlet
 
         AdminAction( final HttpMethod... method )
         {
-            this.method = Collections.unmodifiableList( Arrays.asList( method ) );
+            this.method = List.of( method );
         }
 
         @Override

+ 12 - 24
server/src/main/java/password/pwm/http/servlet/admin/AppDashboardData.java

@@ -186,69 +186,57 @@ public class AppDashboardData implements Serializable
         final String notApplicableValue = Display.getLocalizedMessage( locale, Display.Value_NotApplicable, pwmDomain.getConfig() );
         final PwmNumberFormat numberFormat = PwmNumberFormat.forLocale( locale );
 
-        final List<DisplayElement> aboutData = new ArrayList<>();
-        aboutData.add( new DisplayElement(
+        return List.of( new DisplayElement(
                 "appVersion",
                 DisplayElement.Type.string,
                 l.forKey( "Field_AppVersion", PwmConstants.PWM_APP_NAME ),
                 PwmConstants.SERVLET_VERSION
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "appBuildTime",
                 DisplayElement.Type.timestamp,
                 l.forKey( "Field_AppBuildTime" ),
                 PwmConstants.BUILD_TIME
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "currentTime",
                 DisplayElement.Type.timestamp,
                 l.forKey( "Field_CurrentTime" ),
                 JavaHelper.toIsoDate( Instant.now() )
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "startupTime",
                 DisplayElement.Type.timestamp,
                 l.forKey( "Field_StartTime" ),
                 JavaHelper.toIsoDate( pwmDomain.getStartupTime() )
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "runningDuration",
                 DisplayElement.Type.string,
                 l.forKey( "Field_UpTime" ),
                 TimeDuration.fromCurrent( pwmDomain.getStartupTime() ).asLongString( locale )
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "installTime",
                 DisplayElement.Type.timestamp,
                 l.forKey( "Field_InstallTime" ),
                 JavaHelper.toIsoDate( pwmDomain.getInstallTime() )
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "siteURL",
                 DisplayElement.Type.string,
                 l.forKey( "Field_SiteURL" ),
                 pwmDomain.getConfig().readSettingAsString( PwmSetting.PWM_SITE_URL )
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "instanceID",
                 DisplayElement.Type.string,
                 l.forKey( "Field_InstanceID" ),
                 pwmDomain.getInstanceID()
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "configRestartCounter",
                 DisplayElement.Type.number,
                 "Configuration Restart Counter",
                 contextManager == null ? notApplicableValue : numberFormat.format( contextManager.getRestartCount() )
-        ) );
-        aboutData.add( new DisplayElement(
+        ), new DisplayElement(
                 "chaiApiVersion",
                 DisplayElement.Type.string,
                 l.forKey( "Field_ChaiAPIVersion" ),
                 com.novell.ldapchai.ChaiConstant.CHAI_API_VERSION
         ) );
-
-        return Collections.unmodifiableList( aboutData );
     }
 
     private static List<ServiceData> getServiceData( final PwmDomain pwmDomain )
@@ -278,7 +266,7 @@ public class AppDashboardData implements Serializable
             ) );
         }
 
-        return Collections.unmodifiableList( new ArrayList<>( returnData.values() ) );
+        return List.copyOf( returnData.values() );
     }
 
     private static List<DisplayElement> makeLocalDbInfo( final PwmDomain pwmDomain, final Locale locale )
@@ -519,7 +507,7 @@ public class AppDashboardData implements Serializable
                     JavaHelper.threadInfoToString( threadInfo )
             ) );
         }
-        return Collections.unmodifiableList( new ArrayList<>( returnData.values() ) );
+        return List.copyOf( returnData.values() );
     }
 
     private static List<NodeData> makeNodeData(

+ 4 - 6
server/src/main/java/password/pwm/http/servlet/configmanager/DebugItemGenerator.java

@@ -26,17 +26,17 @@ import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.io.output.CountingOutputStream;
 import password.pwm.AppProperty;
 import password.pwm.PwmAboutProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.AppConfig;
 import password.pwm.config.DomainConfig;
-import password.pwm.config.value.StoredValue;
 import password.pwm.config.stored.StoredConfigItemKey;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfigurationFactory;
 import password.pwm.config.stored.StoredConfigurationUtil;
+import password.pwm.config.value.StoredValue;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.health.HealthRecord;
 import password.pwm.http.ContextManager;
@@ -82,7 +82,6 @@ import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -99,7 +98,7 @@ public class DebugItemGenerator
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( DebugItemGenerator.class );
 
-    private static final List<Class<? extends Generator>> DEBUG_ZIP_ITEM_GENERATORS = Collections.unmodifiableList( Arrays.asList(
+    private static final List<Class<? extends Generator>> DEBUG_ZIP_ITEM_GENERATORS = List.of(
             ConfigurationFileItemGenerator.class,
             ConfigurationDebugJsonItemGenerator.class,
             ConfigurationDebugTextItemGenerator.class,
@@ -124,8 +123,7 @@ public class DebugItemGenerator
             LdapConnectionsDebugItemGenerator.class,
             StatisticsDataDebugItemGenerator.class,
             StatisticsEpsDataDebugItemGenerator.class,
-            BuildInformationDebugItemGenerator.class
-    ) );
+            BuildInformationDebugItemGenerator.class );
 
     private final PwmDomain pwmDomain;
     private final DomainConfig obfuscatedDomainConfig;

+ 2 - 3
server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordServlet.java

@@ -27,8 +27,8 @@ import com.novell.ldapchai.exception.ChaiOperationException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiValidationException;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.VerificationMethodSystem;
 import password.pwm.bean.LoginInfoBean;
 import password.pwm.bean.PasswordStatus;
@@ -95,7 +95,6 @@ import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -144,7 +143,7 @@ public class ForgottenPasswordServlet extends ControlledPwmServlet
 
         ForgottenPasswordAction( final HttpMethod... method )
         {
-            this.method = Collections.unmodifiableList( Arrays.asList( method ) );
+            this.method = List.of( method );
         }
 
         @Override

+ 10 - 16
server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordStageProcessor.java

@@ -32,8 +32,8 @@ import password.pwm.config.profile.ForgottenPasswordProfile;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
-import password.pwm.http.PwmRequestContext;
 import password.pwm.http.PwmRequestAttribute;
+import password.pwm.http.PwmRequestContext;
 import password.pwm.http.bean.ForgottenPasswordBean;
 import password.pwm.http.bean.ForgottenPasswordStage;
 import password.pwm.ldap.UserInfo;
@@ -43,8 +43,6 @@ import password.pwm.util.java.JsonUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.password.PasswordUtility;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -54,7 +52,15 @@ import java.util.Set;
 class ForgottenPasswordStageProcessor
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( ForgottenPasswordStateMachine.class );
-    private static final List<NextStageProcessor> NEXT_STAGE_PROCESSORS;
+
+    private static final List<NextStageProcessor> NEXT_STAGE_PROCESSORS = List.of(
+            new StageProcessor1(),
+            new StageProcessor2(),
+            new StageProcessor3(),
+            new StageProcessor4(),
+            new StageProcessor5(),
+            new StageProcessor6(),
+            new StageProcessor7() );
 
     static ForgottenPasswordStage nextStage( final ForgottenPasswordStateMachine stateMachine )
             throws PwmUnrecoverableException
@@ -70,18 +76,6 @@ class ForgottenPasswordStageProcessor
         return ForgottenPasswordStage.IDENTIFICATION;
     }
 
-    static
-    {
-        final List<NextStageProcessor> list = new ArrayList<>();
-        list.add( new StageProcessor1() );
-        list.add( new StageProcessor2() );
-        list.add( new StageProcessor3() );
-        list.add( new StageProcessor4() );
-        list.add( new StageProcessor5() );
-        list.add( new StageProcessor6() );
-        list.add( new StageProcessor7() );
-        NEXT_STAGE_PROCESSORS = Collections.unmodifiableList( list );
-    }
 
     private interface NextStageProcessor
     {

+ 23 - 36
server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordStateMachine.java

@@ -28,8 +28,8 @@ import com.novell.ldapchai.cr.bean.ChallengeSetBean;
 import com.novell.ldapchai.exception.ChaiOperationException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.TokenDestinationItem;
 import password.pwm.bean.UserIdentity;
@@ -47,8 +47,8 @@ import password.pwm.error.PwmDataValidationException;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
-import password.pwm.http.PwmRequestContext;
 import password.pwm.http.PwmRequestAttribute;
+import password.pwm.http.PwmRequestContext;
 import password.pwm.http.bean.ForgottenPasswordBean;
 import password.pwm.http.bean.ForgottenPasswordStage;
 import password.pwm.http.tag.PasswordRequirementsTag;
@@ -75,14 +75,13 @@ import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroRequest;
-import password.pwm.util.password.PasswordUtility;
 import password.pwm.util.operations.otp.OTPUserRecord;
+import password.pwm.util.password.PasswordUtility;
 import password.pwm.ws.server.PresentableForm;
 import password.pwm.ws.server.PresentableFormRow;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -96,24 +95,18 @@ public class ForgottenPasswordStateMachine
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( ForgottenPasswordStateMachine.class );
 
-    private static final Map<ForgottenPasswordStage, StageHandler> STAGE_HANDLERS;
+    private static final Map<ForgottenPasswordStage, StageHandler> STAGE_HANDLERS = Map.of(
+            ForgottenPasswordStage.IDENTIFICATION, new IdentificationStageHandler(),
+            ForgottenPasswordStage.METHOD_CHOICE, new MethodChoiceStageHandler(),
+            ForgottenPasswordStage.TOKEN_CHOICE, new TokenChoiceStageHandler(),
+            ForgottenPasswordStage.VERIFICATION, new VerificationStageHandler(),
+            ForgottenPasswordStage.ACTION_CHOICE, new ActionChoiceStageHandler(),
+            ForgottenPasswordStage.NEW_PASSWORD, new PasswordChangeStageHandler(),
+            ForgottenPasswordStage.COMPLETE, new CompletedStageHandler() );
 
     private static final String PARAM_PASSWORD = "password1";
     private static final String PARAM_PASSWORD_CONFIRM = "password2";
 
-    static
-    {
-        final Map<ForgottenPasswordStage, StageHandler> stageStateHandlerMap = new HashMap<>();
-        stageStateHandlerMap.put( ForgottenPasswordStage.IDENTIFICATION, new IdentificationStageHandler() );
-        stageStateHandlerMap.put( ForgottenPasswordStage.METHOD_CHOICE, new MethodChoiceStageHandler() );
-        stageStateHandlerMap.put( ForgottenPasswordStage.TOKEN_CHOICE, new TokenChoiceStageHandler() );
-        stageStateHandlerMap.put( ForgottenPasswordStage.VERIFICATION, new VerificationStageHandler() );
-        stageStateHandlerMap.put( ForgottenPasswordStage.ACTION_CHOICE, new ActionChoiceStageHandler() );
-        stageStateHandlerMap.put( ForgottenPasswordStage.NEW_PASSWORD, new PasswordChangeStageHandler() );
-        stageStateHandlerMap.put( ForgottenPasswordStage.COMPLETE, new CompletedStageHandler() );
-        STAGE_HANDLERS = Collections.unmodifiableMap( stageStateHandlerMap );
-    }
-
     interface StageHandler
     {
         void applyForm( ForgottenPasswordStateMachine forgottenPasswordStateMachine, Map<String, String> formValues ) throws PwmUnrecoverableException;
@@ -422,17 +415,11 @@ public class ForgottenPasswordStateMachine
 
     static class VerificationStageHandler implements StageHandler
     {
-        private static final Map<IdentityVerificationMethod, StageHandler> VERIFICATION_HANDLERS;
-
-        static
-        {
-            final Map<IdentityVerificationMethod, StageHandler> stageStateHandlerMap = new HashMap<>();
-            stageStateHandlerMap.put( IdentityVerificationMethod.CHALLENGE_RESPONSES, new ChallengeResponseHandler() );
-            stageStateHandlerMap.put( IdentityVerificationMethod.ATTRIBUTES, new AttributeVerificationHandler() );
-            stageStateHandlerMap.put( IdentityVerificationMethod.TOKEN, new TokenVerificationHandler() );
-            stageStateHandlerMap.put( IdentityVerificationMethod.OTP, new OTPVerificationHandler() );
-            VERIFICATION_HANDLERS = Collections.unmodifiableMap( stageStateHandlerMap );
-        }
+        private static final Map<IdentityVerificationMethod, StageHandler> VERIFICATION_HANDLERS = Map.of(
+                IdentityVerificationMethod.CHALLENGE_RESPONSES, new ChallengeResponseHandler(),
+                IdentityVerificationMethod.ATTRIBUTES, new AttributeVerificationHandler(),
+                IdentityVerificationMethod.TOKEN, new TokenVerificationHandler(),
+                IdentityVerificationMethod.OTP, new OTPVerificationHandler() );
 
         @Override
         public void applyForm( final ForgottenPasswordStateMachine forgottenPasswordStateMachine, final Map<String, String> formValues )
@@ -550,7 +537,7 @@ public class ForgottenPasswordStateMachine
                     message = LocaleHelper.getLocalizedMessage( pwmRequestContext.getLocale(), Display.Display_RecoverOTPIdentified, pwmRequestContext.getConfig(), new String[]
                             {
                                     identifier,
-                            }
+                                    }
                     );
                 }
 
@@ -639,9 +626,9 @@ public class ForgottenPasswordStateMachine
                         Display.Display_RecoverEnterCode,
                         pwmRequestContext.getConfig(),
                         new String[]
-                        {
-                                tokenDisplay,
-                        }
+                                {
+                                        tokenDisplay,
+                                        }
                 );
 
                 final PresentableFormRow formRow = PresentableFormRow.builder()
@@ -760,7 +747,7 @@ public class ForgottenPasswordStateMachine
                             "incorrect value for attribute '" + formConfiguration.getName() + "'", new String[]
                             {
                                     formConfiguration.getLabel( locale ),
-                            }
+                                    }
                     );
 
                     throw new PwmUnrecoverableException( errorInformation );
@@ -804,7 +791,7 @@ public class ForgottenPasswordStateMachine
                                         "incorrect value for '" + attrName + "'", new String[]
                                         {
                                                 formConfiguration.getLabel( locale ),
-                                        }
+                                                }
                                 ) );
                             }
                         }
@@ -815,7 +802,7 @@ public class ForgottenPasswordStateMachine
                                     PwmError.ERROR_INCORRECT_RESPONSE, "ldap error testing value for '" + attrName + "'", new String[]
                                     {
                                             formConfiguration.getLabel( locale ),
-                                    }
+                                            }
                             ) );
                         }
                         catch ( final ChaiUnavailableException e )

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordUtil.java

@@ -445,7 +445,7 @@ public class ForgottenPasswordUtil
         {
             final String errorMsg = "unable to unlock user " + theUser.getEntryDN() + " error: " + e.getMessage();
             final ErrorInformation errorInformation = new ErrorInformation( PwmError.ERROR_UNLOCK_FAILURE, errorMsg );
-            LOGGER.error( pwmRequest, () -> errorInformation.toDebugStr() );
+            LOGGER.error( pwmRequest, errorInformation::toDebugStr );
             pwmRequest.respondWithError( errorInformation );
             return;
         }

+ 2 - 3
server/src/main/java/password/pwm/http/servlet/helpdesk/HelpdeskVerificationStateBean.java

@@ -24,8 +24,8 @@ import com.novell.ldapchai.exception.ChaiOperationException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import lombok.Value;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.option.IdentityVerificationMethod;
@@ -40,7 +40,6 @@ import password.pwm.util.logging.PwmLogger;
 import java.io.Serializable;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -136,7 +135,7 @@ class HelpdeskVerificationStateBean implements Serializable
             final String method = record.getMethod().getLabel( pwmDomain.getConfig(), locale );
             returnRecords.put( record.getTimestamp(), new ViewableValidationRecord( record.getTimestamp(), profile, username, method ) );
         }
-        return Collections.unmodifiableList( new ArrayList<>( returnRecords.values() ) );
+        return List.copyOf( returnRecords.values() );
     }
 
     @Value

+ 14 - 7
server/src/main/java/password/pwm/http/servlet/newuser/NewUserServlet.java

@@ -21,8 +21,8 @@
 package password.pwm.http.servlet.newuser;
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.VerificationMethodSystem;
 import password.pwm.bean.TokenDestinationItem;
 import password.pwm.config.DomainConfig;
@@ -74,7 +74,6 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -122,7 +121,7 @@ public class NewUserServlet extends ControlledPwmServlet
 
         NewUserAction( final HttpMethod... method )
         {
-            this.method = Collections.unmodifiableList( Arrays.asList( method ) );
+            this.method = List.of( method );
         }
 
         @Override
@@ -319,17 +318,25 @@ public class NewUserServlet extends ControlledPwmServlet
 
     private boolean showFormPage( final NewUserProfile profile )
     {
-        final boolean promptForPassword = profile.readSettingAsBoolean( PwmSetting.NEWUSER_PROMPT_FOR_PASSWORD );
-        boolean formNeedsShowing = false;
+        {
+            final boolean promptForPassword = profile.readSettingAsBoolean( PwmSetting.NEWUSER_PROMPT_FOR_PASSWORD );
+            if ( promptForPassword )
+            {
+                return true;
+            }
+        }
+
         final List<FormConfiguration> formConfigurations = profile.readSettingAsForm( PwmSetting.NEWUSER_FORM );
+
         for ( final FormConfiguration formConfiguration : formConfigurations )
         {
             if ( formConfiguration.getType() != FormConfiguration.Type.hidden )
             {
-                formNeedsShowing = true;
+                return true;
             }
         }
-        return formNeedsShowing || promptForPassword;
+
+        return false;
     }
 
     private boolean readProfileFromUrl( final PwmRequest pwmRequest, final NewUserBean newUserBean )

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchDataReader.java

@@ -210,7 +210,7 @@ class PeopleSearchDataReader
                     childCount++;
                 }
             }
-            orgChartData.setChildren( Collections.unmodifiableList( new ArrayList<>( sortedChildren.values() ) ) );
+            orgChartData.setChildren( List.copyOf( sortedChildren.values() ) );
         }
 
         if ( !StringUtil.isEmpty( peopleSearchConfiguration.getOrgChartAssistantAttr( userIdentity ) ) )

+ 1 - 2
server/src/main/java/password/pwm/http/servlet/resource/ResourceFileRequest.java

@@ -40,7 +40,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.zip.ZipEntry;
@@ -50,7 +49,7 @@ class ResourceFileRequest
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( ResourceFileRequest.class );
 
-    private static final Map<String, String> WEB_JAR_VERSION_MAP = Collections.unmodifiableMap( new HashMap<>( new WebJarAssetLocator().getWebJars() ) );
+    private static final Map<String, String> WEB_JAR_VERSION_MAP = Map.copyOf( new WebJarAssetLocator().getWebJars() );
 
     /** Contains a list of all resources (files) found inside the resources folder of all JARs in the WAR's classpath. **/
     private static final Collection<String> WEB_JAR_ASSET_LIST = Collections.unmodifiableCollection( new ArrayList<>( new WebJarAssetLocator().listAssets() ) );

+ 2 - 4
server/src/main/java/password/pwm/http/tag/PasswordRequirementsTag.java

@@ -45,7 +45,6 @@ import javax.servlet.jsp.JspTagException;
 import javax.servlet.jsp.tagext.TagSupport;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
@@ -78,7 +77,7 @@ public class PasswordRequirementsTag extends TagSupport
         return Collections.unmodifiableList( ruleTexts );
     }
 
-    private static final List<RuleTextGenerator> RULE_TEXT_GENERATORS = Collections.unmodifiableList( Arrays.asList(
+    private static final List<RuleTextGenerator> RULE_TEXT_GENERATORS = List.of(
             new CaseSensitiveRuleTextGenerator(),
             new MinLengthRuleTextGenerator(),
             new MaxLengthRuleTextGenerator(),
@@ -99,8 +98,7 @@ public class PasswordRequirementsTag extends TagSupport
             new MaximumOldCharsRuleTextGenerator(),
             new MinimumLifetimeRuleTextGenerator(),
             new ADRuleTextGenerator(),
-            new UniqueRequiredRuleTextGenerator()
-    ) );
+            new UniqueRequiredRuleTextGenerator() );
 
     private interface RuleTextGenerator
     {

+ 1 - 3
server/src/main/java/password/pwm/http/tag/conditional/PwmIfTest.java

@@ -41,9 +41,7 @@ import password.pwm.ldap.UserInfo;
 import password.pwm.svc.PwmService;
 import password.pwm.util.java.StringUtil;
 
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
 
@@ -106,7 +104,7 @@ public enum PwmIfTest
 
     PwmIfTest( final Test... test )
     {
-        tests = test == null ? Collections.emptySet() : Collections.unmodifiableSet( new HashSet<>( Arrays.asList( test ) ) );
+        tests = test == null ? Collections.emptySet() : Set.of( test );
     }
 
     private Set<Test> getTests()

+ 4 - 7
server/src/main/java/password/pwm/i18n/PwmLocaleBundle.java

@@ -25,10 +25,8 @@ import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.StringUtil;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.ResourceBundle;
@@ -90,23 +88,22 @@ public enum PwmLocaleBundle
 
     public Set<String> getLegacyKeys()
     {
-        return Collections.unmodifiableSet( new HashSet<>( Arrays.asList(
+        return Set.of(
                 this.getTheClass().getSimpleName(),
                 this.getTheClass().getName(),
                 "password.pwm." + this.getTheClass().getSimpleName(),
-                this.name()
-        ) ) );
+                this.name() );
     }
 
     public Set<String> getDisplayKeys( )
     {
         final ResourceBundle defaultBundle = ResourceBundle.getBundle( this.getTheClass().getName(), PwmConstants.DEFAULT_LOCALE );
-        return Collections.unmodifiableSet( new HashSet<>( defaultBundle.keySet() ) );
+        return Set.copyOf( defaultBundle.keySet() );
     }
 
     public static Collection<PwmLocaleBundle> allValues( )
     {
-        return Collections.unmodifiableList( Arrays.asList( PwmLocaleBundle.values() ) );
+        return List.of( PwmLocaleBundle.values() );
     }
 
     public static Collection<PwmLocaleBundle> userFacingValues( )

+ 1 - 2
server/src/main/java/password/pwm/ldap/LdapConnectionService.java

@@ -51,7 +51,6 @@ import password.pwm.util.logging.PwmLogger;
 
 import java.io.Serializable;
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -426,7 +425,7 @@ public class LdapConnectionService implements PwmService
 
             returnData.put( bindDN, connectionInfo );
         }
-        return Collections.unmodifiableList( new ArrayList<>( returnData.values() ) );
+        return List.copyOf( returnData.values() );
     }
 
     @Value

+ 2 - 9
server/src/main/java/password/pwm/ldap/schema/SchemaManager.java

@@ -28,8 +28,6 @@ import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.util.logging.PwmLogger;
 
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -37,14 +35,9 @@ public class SchemaManager
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( SchemaManager.class );
 
-    private static final Map<DirectoryVendor, Class<? extends SchemaExtender>> IMPLEMENTATIONS;
+    private static final Map<DirectoryVendor, Class<? extends SchemaExtender>> IMPLEMENTATIONS = Map.of(
+            DirectoryVendor.EDIRECTORY, EdirSchemaExtender.class );
 
-    static
-    {
-        final Map<DirectoryVendor, Class<? extends SchemaExtender>> implMap = new HashMap<>();
-        implMap.put( DirectoryVendor.EDIRECTORY, EdirSchemaExtender.class );
-        IMPLEMENTATIONS = Collections.unmodifiableMap( implMap );
-    }
 
     protected static SchemaExtender implForChaiProvider( final ChaiProvider chaiProvider ) throws PwmUnrecoverableException
     {

+ 1 - 2
server/src/main/java/password/pwm/svc/PwmServiceManager.java

@@ -31,7 +31,6 @@ import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -203,6 +202,6 @@ public class PwmServiceManager
 
     public List<PwmService> getRunningServices( )
     {
-        return Collections.unmodifiableList( new ArrayList<>( this.runningServices.values() ) );
+        return List.copyOf( this.runningServices.values() );
     }
 }

+ 2 - 3
server/src/main/java/password/pwm/svc/email/EmailConnectionPool.java

@@ -20,6 +20,7 @@
 
 package password.pwm.svc.email;
 
+import jakarta.mail.Transport;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
@@ -28,9 +29,7 @@ import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 
-import jakarta.mail.Transport;
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -63,7 +62,7 @@ public class EmailConnectionPool
             final List<EmailServer> servers,
             final EmailServiceSettings settings )
     {
-        this.servers = Collections.unmodifiableList( new ArrayList<>( servers ) );
+        this.servers = List.copyOf( servers );
         this.serverIncrementer = AtomicLoopIntIncrementer.builder().ceiling( servers.size() ).build();
         this.settings = settings;
     }

+ 1 - 2
server/src/main/java/password/pwm/svc/node/NodeMachine.java

@@ -32,7 +32,6 @@ import password.pwm.util.logging.PwmLogger;
 
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
@@ -105,7 +104,7 @@ class NodeMachine
             returnObj.put( nodeInfo.getInstanceID(), nodeInfo );
         }
 
-        return Collections.unmodifiableList( new ArrayList<>( returnObj.values() ) );
+        return List.copyOf( returnObj.values() );
     }
 
 

+ 1 - 1
server/src/main/java/password/pwm/svc/sessiontrack/SessionTrackService.java

@@ -299,7 +299,7 @@ public class SessionTrackService implements PwmService
 
     public List<UserIdentity> getRecentLogins( )
     {
-        return Collections.unmodifiableList( new ArrayList<>( recentLoginCache.asMap().keySet() ) );
+        return List.copyOf( recentLoginCache.asMap().keySet() );
     }
 
     public String generateNewSessionID()

+ 3 - 3
server/src/main/java/password/pwm/util/CaptchaUtility.java

@@ -24,8 +24,8 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.config.DomainConfig;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.option.ApplicationPage;
@@ -39,10 +39,10 @@ import password.pwm.http.PwmHttpResponseWrapper;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequestAttribute;
 import password.pwm.http.PwmURL;
+import password.pwm.svc.PwmService;
 import password.pwm.svc.httpclient.PwmHttpClient;
 import password.pwm.svc.httpclient.PwmHttpClientRequest;
 import password.pwm.svc.httpclient.PwmHttpClientResponse;
-import password.pwm.svc.PwmService;
 import password.pwm.svc.intruder.IntruderManager;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
@@ -144,7 +144,7 @@ public class CaptchaUtility
                 ) );
             }
 
-            final JsonElement responseJson = new JsonParser().parse( clientResponse.getBody() );
+            final JsonElement responseJson = JsonParser.parseString( clientResponse.getBody() );
             final JsonObject topObject = responseJson.getAsJsonObject();
             if ( topObject != null && topObject.has( "success" ) )
             {

+ 2 - 2
server/src/main/java/password/pwm/util/cli/MainClass.java

@@ -430,11 +430,11 @@ public class MainClass
 
         final Layout patternLayout = new EnhancedPatternLayout( LOGGING_PATTERN );
         final ConsoleAppender consoleAppender = new ConsoleAppender( patternLayout );
-        for ( final Package logPackage : PwmLogManager.LOGGING_PACKAGES )
+        for ( final String logPackage : PwmLogManager.LOGGING_PACKAGES )
         {
             if ( logPackage != null )
             {
-                final Logger logger = Logger.getLogger( logPackage.getName() );
+                final Logger logger = Logger.getLogger( logPackage );
                 logger.addAppender( consoleAppender );
                 logger.setLevel( logLevel.getLog4jLevel() );
             }

+ 1 - 2
server/src/main/java/password/pwm/util/cli/commands/ShellCommand.java

@@ -28,7 +28,6 @@ import password.pwm.util.cli.MainClass;
 
 import java.io.InputStreamReader;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -174,7 +173,7 @@ public class ShellCommand extends AbstractCliCommand
         {
             return Collections.emptyList();
         }
-        return Collections.unmodifiableList( Arrays.asList( input.trim().split( "\\s+" ) ) );
+        return List.of( input.trim().split( "\\s+" ) );
     }
 
 }

+ 13 - 16
server/src/main/java/password/pwm/util/logging/PwmLogManager.java

@@ -29,9 +29,9 @@ import org.apache.log4j.PatternLayout;
 import org.apache.log4j.RollingFileAppender;
 import org.apache.log4j.xml.DOMConfigurator;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.config.AppConfig;
 import password.pwm.config.DomainConfig;
 import password.pwm.config.stored.StoredConfigurationFactory;
@@ -41,28 +41,25 @@ import password.pwm.util.localdb.LocalDBException;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 public class PwmLogManager
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( PwmLogManager.class );
 
-    public static final List<Package> LOGGING_PACKAGES = Collections.unmodifiableList( Arrays.asList(
-            PwmDomain.class.getPackage(),
-            ChaiUser.class.getPackage(),
-            Package.getPackage( "org.jasig.cas.client" )
-    ) );
+    public static final List<String> LOGGING_PACKAGES = List.of(
+            PwmDomain.class.getPackage().getName(),
+            ChaiUser.class.getPackage().getName(),
+            "org.jasig.cas.client" );
 
     public static void deinitializeLogger( )
     {
         // clear all existing package loggers
-        for ( final Package logPackage : LOGGING_PACKAGES )
+        for ( final String logPackage : LOGGING_PACKAGES )
         {
             if ( logPackage != null )
             {
-                final Logger logger = Logger.getLogger( logPackage.getName() );
+                final Logger logger = Logger.getLogger( logPackage );
                 logger.setAdditivity( false );
                 logger.removeAllAppenders();
                 logger.setLevel( Level.TRACE );
@@ -139,11 +136,11 @@ public class PwmLogManager
             final ConsoleAppender consoleAppender = new ConsoleAppender( patternLayout );
             final Level level = Level.toLevel( consoleLogLevel );
             consoleAppender.setThreshold( level );
-            for ( final Package logPackage : LOGGING_PACKAGES )
+            for ( final String logPackage : LOGGING_PACKAGES )
             {
                 if ( logPackage != null )
                 {
-                    final Logger logger = Logger.getLogger( logPackage.getName() );
+                    final Logger logger = Logger.getLogger( logPackage );
                     logger.setLevel( Level.TRACE );
                     logger.addAppender( consoleAppender );
                 }
@@ -194,12 +191,12 @@ public class PwmLogManager
 
                 PwmLogger.setFileAppender( fileAppender );
 
-                for ( final Package logPackage : LOGGING_PACKAGES )
+                for ( final String logPackage : LOGGING_PACKAGES )
                 {
                     if ( logPackage != null )
                     {
                         //if (!logPackage.equals(PwmApplication.class.getPackage())) {
-                        final Logger logger = Logger.getLogger( logPackage.getName() );
+                        final Logger logger = Logger.getLogger( logPackage );
                         logger.setLevel( Level.TRACE );
                         logger.addAppender( fileAppender );
                         //}
@@ -246,11 +243,11 @@ public class PwmLogManager
         {
             final LocalDBLog4jAppender localDBLog4jAppender = new LocalDBLog4jAppender( localDBLogger );
             localDBLog4jAppender.setThreshold( localDBLogLevel.getLog4jLevel() );
-            for ( final Package logPackage : LOGGING_PACKAGES )
+            for ( final String logPackage : LOGGING_PACKAGES )
             {
                 if ( logPackage != null && !logPackage.equals( PwmDomain.class.getPackage() ) )
                 {
-                    final Logger logger = Logger.getLogger( logPackage.getName() );
+                    final Logger logger = Logger.getLogger( logPackage );
                     logger.addAppender( localDBLog4jAppender );
                     logger.setLevel( Level.TRACE );
                 }

+ 2 - 5
server/src/main/java/password/pwm/util/macro/StaticMacros.java

@@ -34,22 +34,19 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 public abstract class StaticMacros
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( StaticMacros.class );
 
-    static final List<Macro> STATIC_MACROS = Collections.unmodifiableList( Stream.of(
+    static final List<Macro> STATIC_MACROS = List.of(
             new PwmSettingReference(),
             new PwmSettingCategoryReference(),
             new PwmAppName(),
             new PwmVendorName(),
             new EncodingMacro(),
             new CasingMacro(),
-            new HashingMacro()
-    ).collect( Collectors.toList() ) );
+            new HashingMacro() );
 
     private static final Set<Macro.MacroDefinitionFlag> ONLY_DEBUG_LOG_FLAG = Collections.singleton( Macro.MacroDefinitionFlag.OnlyDebugLogging );
 

+ 2 - 5
server/src/main/java/password/pwm/util/macro/SystemMacros.java

@@ -38,14 +38,12 @@ import java.time.format.DateTimeFormatter;
 import java.util.Collections;
 import java.util.List;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 public class SystemMacros
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( SystemMacros.class );
 
-    static final List<Macro> SYSTEM_MACROS = Collections.unmodifiableList( Stream.of(
+    static final List<Macro> SYSTEM_MACROS = List.of(
             new CurrentTimeMacro(),
             new Iso8601DateTimeMacro(),
             new InstanceIDMacro(),
@@ -55,8 +53,7 @@ public class SystemMacros
             new RandomCharMacro(),
             new RandomNumberMacro(),
             new UUIDMacro(),
-            new PwmContextPath()
-    ).collect( Collectors.toList() ) );
+            new PwmContextPath() );
 
     public abstract static class AbstractSystemMacros extends AbstractMacro
     {

+ 2 - 5
server/src/main/java/password/pwm/util/macro/UserMacros.java

@@ -36,14 +36,12 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 public class UserMacros
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( UserMacros.class );
 
-    static final List<Macro> USER_MACROS = Collections.unmodifiableList( Stream.of(
+    static final List<Macro> USER_MACROS = List.of(
             new UserIDMacro(),
             new UserLdapMacro(),
             new UserPwExpirationTimeMacro(),
@@ -58,8 +56,7 @@ public class UserMacros
             new TargetUserLdapMacro(),
             new TargetUserPwExpirationTimeMacro(),
             new TargetUserDaysUntilPwExpireMacro(),
-            new TargetUserEmailMacro()
-            ).collect( Collectors.toList() ) );
+            new TargetUserEmailMacro() );
 
     abstract static class AbstractUserMacro extends AbstractMacro
     {

+ 1 - 1
server/src/main/java/password/pwm/util/operations/OtpService.java

@@ -25,8 +25,8 @@ import com.novell.ldapchai.exception.ChaiUnavailableException;
 import lombok.Getter;
 import org.apache.commons.codec.binary.Base32;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.UserIdentity;
 import password.pwm.config.DomainConfig;

+ 4 - 10
server/src/main/java/password/pwm/util/operations/cr/NMASCrOperator.java

@@ -125,16 +125,10 @@ public class NMASCrOperator implements CrOperator
 
     private Provider saslProvider;
 
-    private static final Map<String, Object> CR_OPTIONS_MAP;
-
-    static
-    {
-        final HashMap<String, Object> crOptionsMap = new HashMap<>();
-        crOptionsMap.put( "com.novell.security.sasl.client.pkgs", "com.novell.sasl.client" );
-        crOptionsMap.put( "javax.security.sasl.client.pkgs", "com.novell.sasl.client" );
-        crOptionsMap.put( "LoginSequence", "Challenge Response" );
-        CR_OPTIONS_MAP = Collections.unmodifiableMap( crOptionsMap );
-    }
+    private static final Map<String, Object> CR_OPTIONS_MAP = Map.of(
+                "com.novell.security.sasl.client.pkgs", "com.novell.sasl.client",
+                "javax.security.sasl.client.pkgs", "com.novell.sasl.client",
+                "LoginSequence", "Challenge Response" );
 
     public NMASCrOperator( final PwmDomain pwmDomain )
     {

+ 3 - 5
server/src/main/java/password/pwm/util/password/PasswordRuleChecks.java

@@ -25,8 +25,8 @@ import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import password.pwm.AppProperty;
-import password.pwm.PwmDomain;
 import password.pwm.PwmConstants;
+import password.pwm.PwmDomain;
 import password.pwm.bean.SessionLabel;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.option.ADPolicyComplexity;
@@ -43,7 +43,6 @@ import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroRequest;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -82,7 +81,7 @@ public class PasswordRuleChecks
                 throws PwmUnrecoverableException;
     }
 
-    private static final List<RuleChecker> RULE_CHECKS = Collections.unmodifiableList( Arrays.asList(
+    private static final List<RuleChecker> RULE_CHECKS = List.of(
             new OldPasswordRuleChecker(),
             new MinimumLengthRuleChecker(),
             new MaximumLengthRuleChecker(),
@@ -99,8 +98,7 @@ public class PasswordRuleChecks
             new RegexPatternsRuleChecker(),
             new CharGroupRuleChecker(),
             new DictionaryRuleChecker(),
-            new SharedHistoryRuleChecker()
-    ) );
+            new SharedHistoryRuleChecker() );
 
 
     public static List<ErrorInformation> extendedPolicyRuleChecker(

+ 4 - 4
server/src/main/java/password/pwm/ws/server/rest/RestStatisticsServer.java

@@ -179,7 +179,7 @@ public class RestStatisticsServer extends RestServlet
                 output.put( statistic.name(), statValue );
             }
 
-            return Collections.unmodifiableList( new ArrayList<>( output.values() ) );
+            return List.copyOf( output.values() );
         }
 
         private static List<HistoryData> makeHistoryStatInfos(
@@ -201,7 +201,7 @@ public class RestStatisticsServer extends RestServlet
                     final StatValue statValue = new StatValue( statistic.name(), value );
                     output.put( statistic.name(), statValue );
                 }
-                final List<StatValue> statValues = Collections.unmodifiableList( new ArrayList<>( output.values() ) );
+                final List<StatValue> statValues = List.copyOf( output.values() );
                 final HistoryData historyData = HistoryData.builder()
                         .name( dailyKey.toString() )
                         .date( DateTimeFormatter.ofPattern( "yyyy-MM-dd" ).withZone( ZoneOffset.UTC )
@@ -234,7 +234,7 @@ public class RestStatisticsServer extends RestServlet
                 }
             }
 
-            return Collections.unmodifiableList( new ArrayList<>( output.values() ) );
+            return List.copyOf( output.values() );
         }
 
         private static List<StatLabelData> makeLabels( final Locale locale )
@@ -272,7 +272,7 @@ public class RestStatisticsServer extends RestServlet
                 }
             }
 
-            return Collections.unmodifiableList( new ArrayList<>( output.values() ) );
+            return List.copyOf( output.values() );
         }
     }
 

+ 5 - 7
server/src/test/java/password/pwm/config/profile/PasswordRuleReaderHelperTest.java

@@ -30,7 +30,6 @@ import password.pwm.util.localdb.TestHelper;
 import password.pwm.util.macro.MacroRequest;
 import password.pwm.util.password.PasswordRuleReaderHelper;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -46,12 +45,11 @@ public class PasswordRuleReaderHelperTest
     {
         final Map<String, String> userAttributes;
         {
-            final Map<String, String> map = new HashMap<>();
-            map.put( "cn", "fflintstone" );
-            map.put( "email", "fred@flintstones.tv" );
-            map.put( "givenName", "Fred" );
-            map.put( "sn", "Flintstone" );
-            userAttributes = Collections.unmodifiableMap( map );
+            userAttributes = Map.of(
+                    "cn", "fflintstone",
+                    "email", "fred@flintstones.tv",
+                    "givenName", "Fred",
+                    "sn", "Flintstone" );
         }
 
         final PwmApplication pwmApplication = TestHelper.makeTestPwmApplication( temporaryFolder.newFolder() );