Browse Source

fix optional enum setting reading

Jason Rivard 2 years ago
parent
commit
87b2ed8919

+ 0 - 5
lib-util/src/main/java/password/pwm/util/java/JavaHelper.java

@@ -73,11 +73,6 @@ public final class JavaHelper
         return new String( chars );
     }
 
-    public static <E extends Enum<E>> E readEnumFromString( final Class<E> enumClass, final E defaultValue, final String input )
-    {
-        return EnumUtil.readEnumFromString( enumClass, input ).orElse( defaultValue );
-    }
-
     public static String throwableToString( final Throwable throwable )
     {
         final StringWriter sw = new StringWriter();

+ 11 - 11
server/src/main/java/password/pwm/PwmEnvironment.java

@@ -31,7 +31,7 @@ import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.ContextManager;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.json.JsonFactory;
@@ -89,9 +89,9 @@ public class PwmEnvironment
         InstanceID,
         InitConsoleLogLevel,;
 
-        public static ApplicationParameter forString( final String input )
+        public static Optional<ApplicationParameter> forString( final String input )
         {
-            return JavaHelper.readEnumFromString( ApplicationParameter.class, null, input );
+            return EnumUtil.readEnumFromString( ApplicationParameter.class, input );
         }
     }
 
@@ -101,9 +101,9 @@ public class PwmEnvironment
         NoFileLock,
         CommandLineInstance,;
 
-        public static ApplicationFlag forString( final String input )
+        public static Optional<ApplicationFlag> forString( final String input )
         {
-            return JavaHelper.readEnumFromString( ApplicationFlag.class, null, input );
+            return EnumUtil.readEnumFromString( ApplicationFlag.class, input );
         }
     }
 
@@ -316,10 +316,10 @@ public class PwmEnvironment
             final Set<ApplicationFlag> returnFlags = EnumSet.noneOf( ApplicationFlag.class );
             for ( final String value : input.split( "," ) )
             {
-                final ApplicationFlag flag = ApplicationFlag.forString( value );
-                if ( value != null )
+                final Optional<ApplicationFlag> flag = ApplicationFlag.forString( value );
+                if ( flag.isPresent() )
                 {
-                    returnFlags.add( flag );
+                    returnFlags.add( flag.get() );
                 }
                 else
                 {
@@ -353,10 +353,10 @@ public class PwmEnvironment
                 for ( final Object key : propValues.keySet() )
                 {
                     final String keyString = key.toString();
-                    final ApplicationParameter param = ApplicationParameter.forString( keyString );
-                    if ( param != null )
+                    final Optional<ApplicationParameter> param = ApplicationParameter.forString( keyString );
+                    if ( param.isPresent() )
                     {
-                        returnParams.put( param, propValues.getProperty( keyString ) );
+                        returnParams.put( param.get(), propValues.getProperty( keyString ) );
                     }
                     else
                     {

+ 6 - 3
server/src/main/java/password/pwm/config/PwmSettingTemplate.java

@@ -22,7 +22,6 @@ package password.pwm.config;
 
 import org.jrivard.xmlchai.XmlElement;
 import password.pwm.util.java.EnumUtil;
-import password.pwm.util.java.JavaHelper;
 
 import java.util.EnumMap;
 import java.util.Map;
@@ -60,8 +59,12 @@ public enum PwmSettingTemplate
 
     public static PwmSettingTemplate templateForString( final String input, final Type type )
     {
-        final PwmSettingTemplate template = JavaHelper.readEnumFromString( PwmSettingTemplate.class, type.getDefaultValue(), input );
-        return template == null || template.getType() != type ? type.getDefaultValue() : template;
+        final PwmSettingTemplate template = EnumUtil.readEnumFromString( PwmSettingTemplate.class, input )
+                .orElse( type.getDefaultValue() );
+
+        return template.getType() != type
+                ? type.getDefaultValue()
+                : template;
     }
 
     public boolean isHidden( )

+ 3 - 6
server/src/main/java/password/pwm/config/PwmSettingXml.java

@@ -25,7 +25,7 @@ import org.jrivard.xmlchai.XmlChai;
 import org.jrivard.xmlchai.XmlDocument;
 import org.jrivard.xmlchai.XmlElement;
 import password.pwm.util.PwmScheduler;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
@@ -141,11 +141,8 @@ public class PwmSettingXml
         final Set<PwmSettingTemplate> definedTemplates = new LinkedHashSet<>();
         for ( final String templateStrValue : templateSplitValues )
         {
-            final PwmSettingTemplate template = JavaHelper.readEnumFromString( PwmSettingTemplate.class, null, templateStrValue );
-            if ( template != null )
-            {
-                definedTemplates.add( template );
-            }
+            EnumUtil.readEnumFromString( PwmSettingTemplate.class, templateStrValue )
+                    .ifPresent( definedTemplates::add );
         }
         return Collections.unmodifiableSet( definedTemplates );
     }

+ 9 - 1
server/src/main/java/password/pwm/config/StoredSettingReader.java

@@ -43,6 +43,7 @@ import password.pwm.config.value.data.NamedSecretData;
 import password.pwm.config.value.data.RemoteWebServiceConfiguration;
 import password.pwm.config.value.data.UserPermission;
 import password.pwm.error.PwmError;
+import password.pwm.error.PwmInternalException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.util.PasswordData;
@@ -143,7 +144,14 @@ public class StoredSettingReader implements SettingReader
 
     public <E extends Enum<E>> E readSettingAsEnum( final PwmSetting setting, final Class<E> enumClass )
     {
-        return ValueTypeConverter.valueToEnum( setting, readSetting( setting ), enumClass );
+        return ValueTypeConverter.valueToEnum( setting, readSetting( setting ), enumClass )
+                .orElseGet( () ->
+                {
+                    final PwmSettingTemplateSet templateSet = this.storedConfiguration.getTemplateSets().get( domainID );
+                    final StoredValue defaultValue = setting.getDefaultValue( templateSet );
+                    return ValueTypeConverter.valueToEnum( setting, defaultValue, enumClass )
+                            .orElseThrow( () -> new PwmInternalException( "error reading default enum value for setting " + setting.getKey() ) );
+                } );
     }
 
     public List<ActionConfiguration> readSettingAsAction( final PwmSetting setting )

+ 3 - 3
server/src/main/java/password/pwm/config/profile/PwmPasswordRuleFunctions.java

@@ -27,7 +27,7 @@ import password.pwm.config.DomainConfig;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.SettingReader;
 import password.pwm.config.option.ADPolicyComplexity;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StringUtil;
 
 import java.util.Collections;
@@ -192,8 +192,8 @@ class PwmPasswordRuleFunctions
         public Optional<String> apply( final PwmPasswordRule rule, final String value1, final String value2 )
         {
             final TreeSet<ADPolicyComplexity> seenValues = new TreeSet<>();
-            seenValues.add( JavaHelper.readEnumFromString( ADPolicyComplexity.class, ADPolicyComplexity.NONE, value1 ) );
-            seenValues.add( JavaHelper.readEnumFromString( ADPolicyComplexity.class, ADPolicyComplexity.NONE, value2 ) );
+            seenValues.add( EnumUtil.readEnumFromString( ADPolicyComplexity.class, value1 ).orElse( ADPolicyComplexity.NONE ) );
+            seenValues.add( EnumUtil.readEnumFromString( ADPolicyComplexity.class, value2 ).orElse( ADPolicyComplexity.NONE ) );
             return Optional.of( seenValues.last().name() );
         }
     }

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

@@ -30,7 +30,7 @@ import password.pwm.config.value.StringValue;
 import password.pwm.config.value.ValueTypeConverter;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.PwmLocaleBundle;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmSecurityKey;
@@ -161,7 +161,7 @@ public class StoredConfigurationImpl implements StoredConfiguration
                 try
                 {
                     final String strValue = ( String ) storedValue.toNativeObject();
-                    return Optional.ofNullable( JavaHelper.readEnumFromString( PwmSettingTemplate.class, null, strValue ) );
+                    return EnumUtil.readEnumFromString( PwmSettingTemplate.class, strValue );
                 }
                 catch ( final IllegalStateException e )
                 {

+ 3 - 2
server/src/main/java/password/pwm/config/value/ValueTypeConverter.java

@@ -41,6 +41,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 
 public final class ValueTypeConverter
@@ -258,7 +259,7 @@ public final class ValueTypeConverter
         return List.copyOf( availableLocaleMap.get( matchedLocale ) );
     }
 
-    public static <E extends Enum<E>> E valueToEnum( final PwmSetting setting, final StoredValue value, final Class<E> enumClass )
+    public static <E extends Enum<E>> Optional<E> valueToEnum( final PwmSetting setting, final StoredValue value, final Class<E> enumClass )
     {
         if ( PwmSettingSyntax.SELECT != setting.getSyntax() )
         {
@@ -266,7 +267,7 @@ public final class ValueTypeConverter
         }
 
         final String strValue = ( String ) value.toNativeObject();
-        return EnumUtil.readEnumFromString( enumClass, strValue ).orElse( null );
+        return EnumUtil.readEnumFromString( enumClass, strValue );
     }
 
     public static Map<Locale, EmailItemBean> valueToLocalizedEmail( final PwmSetting setting, final StoredValue storedValue )

+ 15 - 14
server/src/main/java/password/pwm/http/servlet/admin/SystemAdminServlet.java

@@ -54,6 +54,7 @@ import password.pwm.svc.pwnotify.PwNotifyService;
 import password.pwm.svc.pwnotify.PwNotifyStoredJobState;
 import password.pwm.svc.stats.StatisticsService;
 import password.pwm.util.i18n.LocaleHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmTimeUtil;
@@ -156,7 +157,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
     @Override
     public ProcessStatus preProcessCheck( final PwmRequest pwmRequest ) throws PwmUnrecoverableException, IOException, ServletException
     {
-       return preProcessAdminCheck( pwmRequest );
+        return preProcessAdminCheck( pwmRequest );
     }
 
     public static ProcessStatus preProcessAdminCheck( final PwmRequest pwmRequest )
@@ -309,7 +310,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
                 iterator.hasNext()
                         && records.size() < max
                         && TimeDuration.fromCurrent( startTime ).isShorterThan( maxSearchTime )
-                )
+        )
         {
             final AuditRecord loopRecord = iterator.next();
             if ( auditDataType == loopRecord.getType() )
@@ -424,7 +425,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
             pwmRequest.setAttribute( PwmRequestAttribute.AppDashboardData, appDashboardData );
         }
 
-            pwmRequest.forwardToJsp( currentPage.getJspURL() );
+        pwmRequest.forwardToJsp( currentPage.getJspURL() );
     }
 
     private static int readMaxParameter( final PwmRequest pwmRequest, final int defaultValue, final int maxValue )
@@ -576,9 +577,10 @@ public class SystemAdminServlet extends ControlledPwmServlet
             final TimeDuration maxTimeSeconds = TimeDuration.of( Integer.parseInt( inputMap.getOrDefault( "maxTime", "5" ) ), TimeDuration.Unit.SECONDS );
             final String username = inputMap.getOrDefault( "username", "" );
             final String text = inputMap.getOrDefault( "text", "" );
-            final PwmLogLevel logLevel = JavaHelper.readEnumFromString( PwmLogLevel.class, PwmLogLevel.TRACE, inputMap.get( "level" ) );
-            final LocalDBLogger.EventType logType = JavaHelper.readEnumFromString( LocalDBLogger.EventType.class, LocalDBLogger.EventType.Both, inputMap.get( "type" ) );
-            logDisplayType = JavaHelper.readEnumFromString( LogDisplayType.class, LogDisplayType.grid, inputMap.get( "displayType" ) );
+            final PwmLogLevel logLevel = EnumUtil.readEnumFromString( PwmLogLevel.class, inputMap.get( "level" ) ).orElse( PwmLogLevel.TRACE );
+            final LocalDBLogger.EventType logType = EnumUtil.readEnumFromString( LocalDBLogger.EventType.class, inputMap.get( "type" ) )
+                    .orElse( LocalDBLogger.EventType.Both );
+            logDisplayType = EnumUtil.readEnumFromString( LogDisplayType.class, inputMap.get( "displayType" ) ).orElse( LogDisplayType.grid );
 
             searchParameters = LocalDBSearchQuery.builder()
                     .minimumLevel( logLevel )
@@ -637,7 +639,8 @@ public class SystemAdminServlet extends ControlledPwmServlet
     {
         final LocalDBLogger localDBLogger = pwmRequest.getPwmApplication().getLocalDBLogger();
 
-        final LogDownloadType logDownloadType = JavaHelper.readEnumFromString( LogDownloadType.class, LogDownloadType.plain, pwmRequest.readParameterAsString( "downloadType" ) );
+        final LogDownloadType logDownloadType = EnumUtil.readEnumFromString( LogDownloadType.class, pwmRequest.readParameterAsString( "downloadType" ) )
+                .orElse( LogDownloadType.plain );
 
         final LocalDBSearchQuery searchParameters = LocalDBSearchQuery.builder()
                 .minimumLevel( PwmLogLevel.TRACE )
@@ -650,10 +653,10 @@ public class SystemAdminServlet extends ControlledPwmServlet
         final HttpContentType compressedContentType;
         final Writer writer;
         {
-            final LogDownloadCompression logDownloadCompression = JavaHelper.readEnumFromString(
-                    LogDownloadCompression.class,
-                    SystemAdminServlet.LogDownloadCompression.none,
-                    pwmRequest.readParameterAsString( "compressionType" ) );
+            final LogDownloadCompression logDownloadCompression = EnumUtil.readEnumFromString(
+                            LogDownloadCompression.class,
+                            pwmRequest.readParameterAsString( "compressionType" ) )
+                    .orElse( SystemAdminServlet.LogDownloadCompression.none );
 
             final OutputStream compressedStream;
 
@@ -680,7 +683,7 @@ public class SystemAdminServlet extends ControlledPwmServlet
             }
             writer = new OutputStreamWriter( compressedStream, PwmConstants.DEFAULT_CHARSET );
         }
-        
+
         switch ( logDownloadType )
         {
             case plain:
@@ -725,6 +728,4 @@ public class SystemAdminServlet extends ControlledPwmServlet
         private List<DisplayElement> statusData;
         private boolean enableStartButton;
     }
-
 }
-

+ 6 - 6
server/src/main/java/password/pwm/http/servlet/changepw/ChangePasswordServlet.java

@@ -45,7 +45,6 @@ import password.pwm.http.bean.ChangePasswordBean;
 import password.pwm.http.servlet.ControlledPwmServlet;
 import password.pwm.i18n.Message;
 import password.pwm.ldap.PasswordChangeProgressChecker;
-import password.pwm.user.UserInfo;
 import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.svc.event.AuditEvent;
 import password.pwm.svc.event.AuditRecord;
@@ -53,9 +52,10 @@ import password.pwm.svc.event.AuditRecordFactory;
 import password.pwm.svc.event.AuditServiceClient;
 import password.pwm.svc.intruder.IntruderServiceClient;
 import password.pwm.svc.stats.AvgStatistic;
+import password.pwm.user.UserInfo;
 import password.pwm.util.PasswordData;
 import password.pwm.util.form.FormUtility;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
@@ -143,7 +143,7 @@ public abstract class ChangePasswordServlet extends ControlledPwmServlet
 
     static ChangePasswordBean getBean( final PwmRequest pwmRequest ) throws PwmUnrecoverableException
     {
-       return pwmRequest.getPwmDomain().getSessionStateService().getBean( pwmRequest, ChangePasswordBean.class );
+        return pwmRequest.getPwmDomain().getSessionStateService().getBean( pwmRequest, ChangePasswordBean.class );
     }
 
     @ActionHandler( action = "reset" )
@@ -171,10 +171,10 @@ public abstract class ChangePasswordServlet extends ControlledPwmServlet
         if ( pwmRequest.getPwmSession().getUserInfo().getPasswordStatus().isWarnPeriod() )
         {
             final String warnResponseStr = pwmRequest.readParameterAsString( "warnResponse" );
-            final WarnResponseValue warnResponse = JavaHelper.readEnumFromString( WarnResponseValue.class, null, warnResponseStr );
-            if ( warnResponse != null )
+            final Optional<WarnResponseValue> warnResponse = EnumUtil.readEnumFromString( WarnResponseValue.class, warnResponseStr );
+            if ( warnResponse.isPresent() )
             {
-                switch ( warnResponse )
+                switch ( warnResponse.get() )
                 {
                     case skip:
                         pwmRequest.getPwmSession().getLoginInfoBean().setFlag( LoginInfoBean.LoginFlag.skipNewPw );

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

@@ -85,7 +85,7 @@ import password.pwm.svc.token.TokenUtil;
 import password.pwm.user.UserInfo;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.form.FormUtility;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
@@ -273,10 +273,10 @@ public class ForgottenPasswordServlet extends ControlledPwmServlet
         {
             final String choice = pwmRequest.readParameterAsString( "choice" );
 
-            final ActionChoice actionChoice = JavaHelper.readEnumFromString( ActionChoice.class, null, choice );
-            if ( actionChoice != null )
+            final Optional<ActionChoice> actionChoice = EnumUtil.readEnumFromString( ActionChoice.class, choice );
+            if ( actionChoice.isPresent() )
             {
-                switch ( actionChoice )
+                switch ( actionChoice.get() )
                 {
                     case unlock:
                         this.executeUnlock( pwmRequest );

+ 5 - 6
server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordStateMachine.java

@@ -72,7 +72,7 @@ import password.pwm.user.UserInfo;
 import password.pwm.util.PasswordData;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
@@ -864,20 +864,19 @@ public class ForgottenPasswordStateMachine
                     ForgottenPasswordUtil.figureRemainingAvailableOptionalAuthMethods( pwmRequestContext, forgottenPasswordBean )
             );
 
-            final IdentityVerificationMethod requestedChoice = JavaHelper.readEnumFromString(
+            final Optional<IdentityVerificationMethod> requestedChoice = EnumUtil.readEnumFromString(
                     IdentityVerificationMethod.class,
-                    null,
                     formValues.get( PwmConstants.PARAM_METHOD_CHOICE ) );
-            if ( requestedChoice == null )
+            if ( requestedChoice.isEmpty() )
             {
                 final String errorMsg = "unknown verification method requested";
                 final ErrorInformation errorInformation = new ErrorInformation( PwmError.ERROR_MISSING_PARAMETER, errorMsg );
                 throw new PwmUnrecoverableException( errorInformation );
             }
 
-            if ( remainingAvailableOptionalMethods.contains( requestedChoice ) )
+            if ( remainingAvailableOptionalMethods.contains( requestedChoice.get() ) )
             {
-                forgottenPasswordBean.getProgress().setInProgressVerificationMethod( requestedChoice );
+                forgottenPasswordBean.getProgress().setInProgressVerificationMethod( requestedChoice.get() );
             }
         }
 

+ 3 - 2
server/src/main/java/password/pwm/svc/otp/AbstractOtpOperator.java

@@ -29,7 +29,7 @@ import password.pwm.config.option.OTPStorageFormat;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmBlockAlgorithm;
@@ -102,7 +102,8 @@ public abstract class AbstractOtpOperator implements OtpOperator
     public PwmBlockAlgorithm figureBlockAlg( )
     {
         final String otpEncryptionAlgString = pwmDomain.getConfig().readAppProperty( AppProperty.OTP_ENCRYPTION_ALG );
-        return JavaHelper.readEnumFromString( PwmBlockAlgorithm.class, PwmBlockAlgorithm.AES, otpEncryptionAlgString );
+        return EnumUtil.readEnumFromString( PwmBlockAlgorithm.class, otpEncryptionAlgString )
+                .orElse( PwmBlockAlgorithm.AES );
     }
 
     /**

+ 7 - 4
server/src/main/java/password/pwm/svc/secure/AbstractSecureService.java

@@ -32,7 +32,7 @@ import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CopyingInputStream;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.json.JsonFactory;
@@ -99,15 +99,18 @@ public abstract class AbstractSecureService extends AbstractPwmService implement
 
         {
             final String defaultBlockAlgString = pwmApplication.getConfig().readAppProperty( AppProperty.SECURITY_DEFAULT_EPHEMERAL_BLOCK_ALG );
-            defaultBlockAlgorithm = JavaHelper.readEnumFromString( PwmBlockAlgorithm.class, PwmBlockAlgorithm.AES, defaultBlockAlgString );
+            defaultBlockAlgorithm = EnumUtil.readEnumFromString( PwmBlockAlgorithm.class, defaultBlockAlgString )
+                    .orElse( PwmBlockAlgorithm.AES );
         }
         {
             final String defaultHashAlgString = pwmApplication.getConfig().readAppProperty( AppProperty.SECURITY_DEFAULT_EPHEMERAL_HASH_ALG );
-            defaultHashAlgorithm = JavaHelper.readEnumFromString( PwmHashAlgorithm.class, PwmHashAlgorithm.SHA512, defaultHashAlgString );
+            defaultHashAlgorithm = EnumUtil.readEnumFromString( PwmHashAlgorithm.class, defaultHashAlgString )
+                    .orElse( PwmHashAlgorithm.SHA512 );
         }
         {
             final String defaultHmacAlgString = pwmApplication.getConfig().readAppProperty( AppProperty.SECURITY_DEFAULT_EPHEMERAL_HMAC_ALG );
-            defaultHmacAlgorithm = JavaHelper.readEnumFromString( HmacAlgorithm.class, HmacAlgorithm.HMAC_SHA_512, defaultHmacAlgString );
+            defaultHmacAlgorithm = EnumUtil.readEnumFromString( HmacAlgorithm.class, defaultHmacAlgString )
+                    .orElse( HmacAlgorithm.HMAC_SHA_512 );
         }
         LOGGER.debug( getSessionLabel(), () -> "using default algorithms: " + StringUtil.mapToString( debugData() ) );
 

+ 8 - 7
server/src/main/java/password/pwm/util/localdb/LocalDBUtility.java

@@ -28,14 +28,14 @@ import password.pwm.PwmConstants;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.util.EventRateMeter;
+import password.pwm.util.Percent;
 import password.pwm.util.ProgressInfoCalculator;
 import password.pwm.util.TransactionSizeCalculator;
 import password.pwm.util.java.AverageTracker;
 import password.pwm.util.java.ConditionalTaskExecutor;
-import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.PwmUtil;
-import password.pwm.util.Percent;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.PwmTimeUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
@@ -334,17 +334,18 @@ public class LocalDBUtility
                         eventRateMeter.markEvent();
                         byteReaderCounter = countingInputStream.getByteCount();
                         final String dbNameRecordStr = record.get( 0 );
-                        final LocalDB.DB db = JavaHelper.readEnumFromString( LocalDB.DB.class, null, dbNameRecordStr );
+                        final Optional<LocalDB.DB> db = EnumUtil.readEnumFromString( LocalDB.DB.class, dbNameRecordStr );
                         final String key = record.get( 1 );
                         final String value = record.get( 2 );
-                        if ( db == null )
+                        if ( db.isEmpty() )
                         {
-                            writeStringToOut( debugOutput, "ignoring localdb import record #" + lineReaderCounter + ", invalid DB name '" + dbNameRecordStr + "'" );
+                            writeStringToOut( debugOutput, "ignoring localdb import record #"
+                                    + lineReaderCounter + ", invalid DB name '" + dbNameRecordStr + "'" );
                         }
                         else
                         {
                             transactionCharCounter += key.length() + value.length();
-                            transactionMap.get( db ).put( key, value );
+                            transactionMap.get( db.get() ).put( key, value );
                             cachedTransactions++;
                             if ( cachedTransactions >= transactionCalculator.getTransactionSize() || transactionCharCounter > MAX_CHAR_PER_TRANSACTIONS )
                             {

+ 4 - 5
server/src/test/java/password/pwm/config/PwmSettingXmlTest.java

@@ -29,7 +29,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.xml.sax.SAXParseException;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 import javax.xml.XMLConstants;
 import javax.xml.transform.stream.StreamSource;
@@ -105,11 +105,10 @@ public class PwmSettingXmlTest
             final String key = element.getAttribute( "key" )
                     .orElseThrow( () -> new IllegalStateException( "category element " + element.getName() + " missing key attribute" ) );
 
-            final PwmSettingCategory category = JavaHelper.readEnumFromString( PwmSettingCategory.class, null, key );
+            final Optional<PwmSettingCategory> category = EnumUtil.readEnumFromString( PwmSettingCategory.class, key );
 
-            final String errorMsg = "PwmSetting.xml contains category key of '"
-                    + key + "' which does not exist in PwmSettingCategory.java";
-            Assertions.assertNotNull( category, errorMsg );
+            Assertions.assertTrue( category.isPresent(), () -> "PwmSetting.xml contains category key of '"
+                    + key + "' which does not exist in PwmSettingCategory.java" );
         }
     }