Browse Source

pwm-util refactoring and data-service updates

Jason Rivard 2 years ago
parent
commit
7639e46fa4
100 changed files with 674 additions and 370 deletions
  1. 4 0
      data-service/src/main/java/password/pwm/receiver/PublishVersionServlet.java
  2. 35 0
      data-service/src/main/java/password/pwm/receiver/PwmReceiverApp.java
  3. 2 2
      data-service/src/main/java/password/pwm/receiver/Settings.java
  4. 6 4
      data-service/src/main/java/password/pwm/receiver/TelemetryRestReceiver.java
  5. 3 2
      data-service/src/main/java/password/pwm/receiver/TelemetryViewerServlet.java
  6. 21 2
      data-service/src/main/webapp/WEB-INF/jsp/telemetry-viewer.jsp
  7. 19 11
      lib-util/src/main/java/password/pwm/util/EventRateMeter.java
  8. 3 11
      lib-util/src/main/java/password/pwm/util/MovingAverage.java
  9. 1 1
      lib-util/src/main/java/password/pwm/util/Percent.java
  10. 0 1
      lib-util/src/main/java/password/pwm/util/ProgressInfoCalculator.java
  11. 13 21
      lib-util/src/main/java/password/pwm/util/TransactionSizeCalculator.java
  12. 46 13
      lib-util/src/main/java/password/pwm/util/java/AverageTracker.java
  13. 6 7
      lib-util/src/main/java/password/pwm/util/java/CollectionUtil.java
  14. 9 5
      lib-util/src/main/java/password/pwm/util/java/CollectorUtil.java
  15. 5 6
      lib-util/src/main/java/password/pwm/util/java/ConditionalTaskExecutor.java
  16. 124 0
      lib-util/src/main/java/password/pwm/util/java/EnumUtil.java
  17. 1 80
      lib-util/src/main/java/password/pwm/util/java/JavaHelper.java
  18. 12 0
      lib-util/src/main/java/password/pwm/util/java/PwmNumberFormat.java
  19. 8 10
      lib-util/src/main/java/password/pwm/util/java/StatisticAverageBundle.java
  20. 11 11
      lib-util/src/main/java/password/pwm/util/java/StatisticCounterBundle.java
  21. 83 0
      lib-util/src/main/java/password/pwm/util/java/StatisticRateBundle.java
  22. 15 5
      lib-util/src/main/java/password/pwm/util/java/StringUtil.java
  23. 1 1
      lib-util/src/test/java/password/pwm/util/java/CollectorUtilTest.java
  24. 56 0
      lib-util/src/test/java/password/pwm/util/java/PwmNumberFormatTest.java
  25. 1 1
      server/pom.xml
  26. 2 2
      server/src/main/java/password/pwm/AppProperty.java
  27. 2 2
      server/src/main/java/password/pwm/PwmAboutProperty.java
  28. 2 2
      server/src/main/java/password/pwm/bean/DomainID.java
  29. 1 1
      server/src/main/java/password/pwm/bean/LocalSessionStateBean.java
  30. 2 1
      server/src/main/java/password/pwm/bean/UserIdentity.java
  31. 2 1
      server/src/main/java/password/pwm/config/AppConfig.java
  32. 2 2
      server/src/main/java/password/pwm/config/DomainConfig.java
  33. 3 3
      server/src/main/java/password/pwm/config/PwmSettingCategory.java
  34. 5 4
      server/src/main/java/password/pwm/config/PwmSettingMetaData.java
  35. 2 2
      server/src/main/java/password/pwm/config/PwmSettingStats.java
  36. 2 1
      server/src/main/java/password/pwm/config/PwmSettingTemplate.java
  37. 3 2
      server/src/main/java/password/pwm/config/PwmSettingTemplateSet.java
  38. 3 2
      server/src/main/java/password/pwm/config/StoredSettingReader.java
  39. 2 2
      server/src/main/java/password/pwm/config/option/WebServiceUsage.java
  40. 2 2
      server/src/main/java/password/pwm/config/profile/AbstractProfile.java
  41. 3 2
      server/src/main/java/password/pwm/config/profile/PwmPasswordPolicy.java
  42. 3 3
      server/src/main/java/password/pwm/config/profile/PwmPasswordRule.java
  43. 4 4
      server/src/main/java/password/pwm/config/stored/StoredConfigKey.java
  44. 2 2
      server/src/main/java/password/pwm/config/stored/StoredConfigurationUtil.java
  45. 2 2
      server/src/main/java/password/pwm/config/value/ActionValue.java
  46. 2 2
      server/src/main/java/password/pwm/config/value/ValueTypeConverter.java
  47. 6 6
      server/src/main/java/password/pwm/error/PwmError.java
  48. 2 1
      server/src/main/java/password/pwm/health/HealthService.java
  49. 2 2
      server/src/main/java/password/pwm/health/LDAPHealthChecker.java
  50. 3 3
      server/src/main/java/password/pwm/http/HttpHeader.java
  51. 2 2
      server/src/main/java/password/pwm/http/HttpMethod.java
  52. 2 2
      server/src/main/java/password/pwm/http/PwmHttpRequestWrapper.java
  53. 4 3
      server/src/main/java/password/pwm/http/PwmResponse.java
  54. 2 2
      server/src/main/java/password/pwm/http/PwmSession.java
  55. 3 3
      server/src/main/java/password/pwm/http/servlet/ClientApiServlet.java
  56. 3 2
      server/src/main/java/password/pwm/http/servlet/ControlledPwmServlet.java
  57. 4 4
      server/src/main/java/password/pwm/http/servlet/ForgottenUsernameServlet.java
  58. 2 2
      server/src/main/java/password/pwm/http/servlet/GuestRegistrationServlet.java
  59. 2 2
      server/src/main/java/password/pwm/http/servlet/PwmServletDefinition.java
  60. 2 2
      server/src/main/java/password/pwm/http/servlet/ShortcutServlet.java
  61. 2 2
      server/src/main/java/password/pwm/http/servlet/activation/ActivateUserServlet.java
  62. 2 2
      server/src/main/java/password/pwm/http/servlet/admin/AdminServlet.java
  63. 3 2
      server/src/main/java/password/pwm/http/servlet/admin/AppDashboardData.java
  64. 2 2
      server/src/main/java/password/pwm/http/servlet/changepw/ChangePasswordServlet.java
  65. 0 5
      server/src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServlet.java
  66. 2 2
      server/src/main/java/password/pwm/http/servlet/configeditor/function/OAuthCertImportFunction.java
  67. 4 4
      server/src/main/java/password/pwm/http/servlet/configguide/ConfigGuideServlet.java
  68. 1 1
      server/src/main/java/password/pwm/http/servlet/configguide/ConfigGuideUtils.java
  69. 2 2
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerCertificatesServlet.java
  70. 4 4
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerLocalDBServlet.java
  71. 4 3
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerLoginServlet.java
  72. 5 5
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerServlet.java
  73. 6 6
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerWordlistServlet.java
  74. 3 3
      server/src/main/java/password/pwm/http/servlet/forgottenpw/ForgottenPasswordServlet.java
  75. 3 3
      server/src/main/java/password/pwm/http/servlet/helpdesk/HelpdeskServlet.java
  76. 1 1
      server/src/main/java/password/pwm/http/servlet/newuser/NewUserServlet.java
  77. 2 2
      server/src/main/java/password/pwm/http/servlet/newuser/NewUserUtils.java
  78. 4 4
      server/src/main/java/password/pwm/http/servlet/oauth/OAuthConsumerServlet.java
  79. 2 2
      server/src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchDataReader.java
  80. 2 2
      server/src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchServlet.java
  81. 3 3
      server/src/main/java/password/pwm/http/servlet/peoplesearch/PhotoDataReader.java
  82. 2 2
      server/src/main/java/password/pwm/http/servlet/resource/ResourceServletService.java
  83. 2 2
      server/src/main/java/password/pwm/http/servlet/updateprofile/UpdateProfileServlet.java
  84. 2 2
      server/src/main/java/password/pwm/http/state/SessionStateService.java
  85. 1 1
      server/src/main/java/password/pwm/ldap/PasswordChangeProgressChecker.java
  86. 1 1
      server/src/main/java/password/pwm/ldap/search/UserSearchService.java
  87. 2 1
      server/src/main/java/password/pwm/svc/PwmServiceManager.java
  88. 7 4
      server/src/main/java/password/pwm/svc/cache/CacheService.java
  89. 1 1
      server/src/main/java/password/pwm/svc/email/EmailServer.java
  90. 2 2
      server/src/main/java/password/pwm/svc/event/AuditEvent.java
  91. 4 4
      server/src/main/java/password/pwm/svc/event/AuditService.java
  92. 2 2
      server/src/main/java/password/pwm/svc/event/LocalDbAuditVault.java
  93. 2 2
      server/src/main/java/password/pwm/svc/event/SyslogAuditService.java
  94. 2 1
      server/src/main/java/password/pwm/svc/httpclient/HttpClientService.java
  95. 2 2
      server/src/main/java/password/pwm/svc/httpclient/HttpTrustManagerHelper.java
  96. 2 2
      server/src/main/java/password/pwm/svc/intruder/IntruderDomainService.java
  97. 2 2
      server/src/main/java/password/pwm/svc/intruder/IntruderSettings.java
  98. 2 1
      server/src/main/java/password/pwm/svc/intruder/IntruderSystemService.java
  99. 2 2
      server/src/main/java/password/pwm/svc/node/NodeService.java
  100. 2 2
      server/src/main/java/password/pwm/svc/otp/OtpService.java

+ 4 - 0
data-service/src/main/java/password/pwm/receiver/PublishVersionServlet.java

@@ -44,6 +44,10 @@ public class PublishVersionServlet extends HttpServlet
 
 
         final ContextManager contextManager = ContextManager.getContextManager( req.getServletContext() );
         final ContextManager contextManager = ContextManager.getContextManager( req.getServletContext() );
         final PwmReceiverApp app = contextManager.getApp();
         final PwmReceiverApp app = contextManager.getApp();
+
+        app.getStatisticCounterBundle().increment( PwmReceiverApp.CounterStatsKey.VersionCheckRequests );
+        app.getStatisticEpsBundle().markEvent( PwmReceiverApp.EpsStatKey.VersionCheckRequests );
+
         final PublishVersionBean publishVersionBean = new PublishVersionBean(
         final PublishVersionBean publishVersionBean = new PublishVersionBean(
                 Collections.singletonMap( PublishVersionBean.VersionKey.current, app.getSettings().getCurrentVersionInfo() ) );
                 Collections.singletonMap( PublishVersionBean.VersionKey.current, app.getSettings().getCurrentVersionInfo() ) );
 
 

+ 35 - 0
data-service/src/main/java/password/pwm/receiver/PwmReceiverApp.java

@@ -21,9 +21,12 @@
 package password.pwm.receiver;
 package password.pwm.receiver;
 
 
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.StatisticCounterBundle;
+import password.pwm.util.java.StatisticRateBundle;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 
 
 import java.io.IOException;
 import java.io.IOException;
+import java.time.Instant;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
@@ -38,6 +41,24 @@ public class PwmReceiverApp
 
 
     private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
     private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
     private final Status status = new Status();
     private final Status status = new Status();
+    private final StatisticCounterBundle statisticCounterBundle = new StatisticCounterBundle( CounterStatsKey.class );
+    private final StatisticRateBundle statisticRateBundle = new StatisticRateBundle( EpsStatKey.class );
+    private final Instant startupTime = Instant.now();
+
+    public enum EpsStatKey
+    {
+        VersionCheckRequests,
+        TelemetryPublishRequests,
+        TelemetryViewRequests,
+    }
+
+    public enum CounterStatsKey
+    {
+        VersionCheckRequests,
+        TelemetryPublishRequests,
+        TelemetryViewRequests,
+    }
+
 
 
     public PwmReceiverApp( )
     public PwmReceiverApp( )
     {
     {
@@ -106,4 +127,18 @@ public class PwmReceiverApp
         return status;
         return status;
     }
     }
 
 
+    public StatisticCounterBundle getStatisticCounterBundle()
+    {
+        return statisticCounterBundle;
+    }
+
+    public StatisticRateBundle getStatisticEpsBundle()
+    {
+        return statisticRateBundle;
+    }
+
+    public Instant getStartupTime()
+    {
+        return startupTime;
+    }
 }
 }

+ 2 - 2
data-service/src/main/java/password/pwm/receiver/Settings.java

@@ -21,7 +21,7 @@
 package password.pwm.receiver;
 package password.pwm.receiver;
 
 
 import password.pwm.bean.VersionNumber;
 import password.pwm.bean.VersionNumber;
-import password.pwm.util.java.CollectionUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 
 
@@ -87,7 +87,7 @@ public class Settings
         try ( Reader reader = new InputStreamReader( Files.newInputStream( path ), StandardCharsets.UTF_8 ) )
         try ( Reader reader = new InputStreamReader( Files.newInputStream( path ), StandardCharsets.UTF_8 ) )
         {
         {
             properties.load( reader );
             properties.load( reader );
-            final Map<Setting, String> returnMap = CollectionUtil.enumStream( Setting.class )
+            final Map<Setting, String> returnMap = EnumUtil.enumStream( Setting.class )
                     .collect( Collectors.toUnmodifiableMap(
                     .collect( Collectors.toUnmodifiableMap(
                             setting -> setting,
                             setting -> setting,
                             setting -> properties.getProperty( setting.name(), setting.getDefaultValue() )
                             setting -> properties.getProperty( setting.name(), setting.getDefaultValue() )

+ 6 - 4
data-service/src/main/java/password/pwm/receiver/TelemetryRestReceiver.java

@@ -26,7 +26,6 @@ import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.ServletUtility;
 import password.pwm.http.ServletUtility;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
-import password.pwm.util.java.AtomicLoopIntIncrementer;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.ws.server.RestResultBean;
 import password.pwm.ws.server.RestResultBean;
 
 
@@ -46,8 +45,6 @@ import java.io.IOException;
 public class TelemetryRestReceiver extends HttpServlet
 public class TelemetryRestReceiver extends HttpServlet
 {
 {
     private static final Logger LOGGER = Logger.createLogger( TelemetryViewerServlet.class );
     private static final Logger LOGGER = Logger.createLogger( TelemetryViewerServlet.class );
-    private static final AtomicLoopIntIncrementer REQ_COUNTER = new AtomicLoopIntIncrementer();
-
 
 
     @Override
     @Override
     protected void doPost( final HttpServletRequest req, final HttpServletResponse resp )
     protected void doPost( final HttpServletRequest req, final HttpServletResponse resp )
@@ -55,9 +52,14 @@ public class TelemetryRestReceiver extends HttpServlet
     {
     {
         try
         try
         {
         {
+            final ContextManager contextManager = ContextManager.getContextManager( req.getServletContext() );
+            final PwmReceiverApp app = contextManager.getApp();
+            app.getStatisticCounterBundle().increment( PwmReceiverApp.CounterStatsKey.TelemetryPublishRequests );
+            app.getStatisticEpsBundle().markEvent( PwmReceiverApp.EpsStatKey.TelemetryPublishRequests );
+
             final String input = ServletUtility.readRequestBodyAsString( req, 1024 * 1024 );
             final String input = ServletUtility.readRequestBodyAsString( req, 1024 * 1024 );
             final TelemetryPublishBean telemetryPublishBean = JsonFactory.get().deserialize( input, TelemetryPublishBean.class );
             final TelemetryPublishBean telemetryPublishBean = JsonFactory.get().deserialize( input, TelemetryPublishBean.class );
-            final Storage storage = ContextManager.getContextManager( this.getServletContext() ).getApp().getStorage();
+            final Storage storage = app.getStorage();
             storage.store( telemetryPublishBean );
             storage.store( telemetryPublishBean );
 
 
             final RestResultBean restResultBean = RestResultBean.forSuccessMessage( null, null, null, Message.Success_Unknown );
             final RestResultBean restResultBean = RestResultBean.forSuccessMessage( null, null, null, Message.Success_Unknown );

+ 3 - 2
data-service/src/main/java/password/pwm/receiver/TelemetryViewerServlet.java

@@ -41,10 +41,8 @@ public class TelemetryViewerServlet extends HttpServlet
 {
 {
     private static final String PARAM_DAYS = "days";
     private static final String PARAM_DAYS = "days";
 
 
-
     public static final String SUMMARY_ATTR = "SummaryBean";
     public static final String SUMMARY_ATTR = "SummaryBean";
 
 
-
     @Override
     @Override
     protected void doGet( final HttpServletRequest req, final HttpServletResponse resp )
     protected void doGet( final HttpServletRequest req, final HttpServletResponse resp )
             throws ServletException, IOException
             throws ServletException, IOException
@@ -52,7 +50,10 @@ public class TelemetryViewerServlet extends HttpServlet
         final String daysString = req.getParameter( PARAM_DAYS );
         final String daysString = req.getParameter( PARAM_DAYS );
         final int days = StringUtil.isEmpty( daysString ) ? 30 : Integer.parseInt( daysString );
         final int days = StringUtil.isEmpty( daysString ) ? 30 : Integer.parseInt( daysString );
         final ContextManager contextManager = ContextManager.getContextManager( req.getServletContext() );
         final ContextManager contextManager = ContextManager.getContextManager( req.getServletContext() );
+
         final PwmReceiverApp app = contextManager.getApp();
         final PwmReceiverApp app = contextManager.getApp();
+        app.getStatisticCounterBundle().increment( PwmReceiverApp.CounterStatsKey.TelemetryViewRequests );
+        app.getStatisticEpsBundle().markEvent( PwmReceiverApp.EpsStatKey.TelemetryViewRequests );
 
 
         {
         {
             final String errorState = app.getStatus().getErrorState();
             final String errorState = app.getStatus().getErrorState();

+ 21 - 2
data-service/src/main/webapp/WEB-INF/jsp/telemetry-viewer.jsp

@@ -27,11 +27,15 @@
 <%@ page import="password.pwm.receiver.PwmReceiverApp" %>
 <%@ page import="password.pwm.receiver.PwmReceiverApp" %>
 <%@ page import="password.pwm.receiver.ContextManager" %>
 <%@ page import="password.pwm.receiver.ContextManager" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
+<%@ page import="java.util.Map" %>
+<%@ page import="java.time.Duration" %>
+<%@ page import="password.pwm.util.java.PwmNumberFormat" %>
 
 
 <!DOCTYPE html>
 <!DOCTYPE html>
 <%@ page contentType="text/html" %>
 <%@ page contentType="text/html" %>
 <% SummaryBean summaryBean = (SummaryBean)request.getAttribute(TelemetryViewerServlet.SUMMARY_ATTR); %>
 <% SummaryBean summaryBean = (SummaryBean)request.getAttribute(TelemetryViewerServlet.SUMMARY_ATTR); %>
 <% PwmReceiverApp app = ContextManager.getContextManager(request.getServletContext()).getApp(); %>
 <% PwmReceiverApp app = ContextManager.getContextManager(request.getServletContext()).getApp(); %>
+<% PwmNumberFormat format = PwmNumberFormat.forLocale( request.getLocale() ); %>
 <html>
 <html>
 <head>
 <head>
     <title>Telemetry Data</title>
     <title>Telemetry Data</title>
@@ -40,8 +44,11 @@
 </head>
 </head>
 <body>
 <body>
 <div>
 <div>
+    <h2>Server Info</h2>
     Current Time: <%=StringUtil.toIsoDate( Instant.now() )%>
     Current Time: <%=StringUtil.toIsoDate( Instant.now() )%>
     <br/>
     <br/>
+    Up Time: <%=StringUtil.toIsoDuration(Duration.between(app.getStartupTime(), Instant.now()))%>
+    <br/>
     <% if (app.getSettings().isFtpEnabled()) {%>
     <% if (app.getSettings().isFtpEnabled()) {%>
     <% Instant lastIngest = app.getStatus().getLastFtpIngest(); %>
     <% Instant lastIngest = app.getStatus().getLastFtpIngest(); %>
     Last FTP Ingestion: <%= lastIngest == null ? "n/a" : lastIngest.toString()%>
     Last FTP Ingestion: <%= lastIngest == null ? "n/a" : lastIngest.toString()%>
@@ -55,7 +62,19 @@
     <br/>
     <br/>
     Servers Shown: <%= summaryBean.getServerCount() %>
     Servers Shown: <%= summaryBean.getServerCount() %>
     <br/>
     <br/>
+    <h3>Counters</h3>
+    <% final Map<String, String> counterStatMap = app.getStatisticCounterBundle().debugStats( request.getLocale() ); %>
+    <% for ( final Map.Entry<String, String> entry : counterStatMap.entrySet() ) { %>
+    <%= entry.getKey() %>: <%= entry.getValue()%><br/>
+    <% } %>
+    <br/>
+    <h3>Events/Second</h3>
+    <% final Map<String, String> epsStatMap = app.getStatisticEpsBundle().debugStats( request.getLocale() ); %>
+    <% for ( final Map.Entry<String, String> entry : epsStatMap.entrySet() ) { %>
+    <%= entry.getKey() %>: <%= entry.getValue()%><br/>
+    <% } %>
     <br/>
     <br/>
+    <h1>PWM Telemetry Data</h1>
 
 
     <%--
     <%--
     <form method="get">
     <form method="get">
@@ -165,7 +184,7 @@
         <% for (final String setting: summaryBean.getSettingCount().keySet()) { %>
         <% for (final String setting: summaryBean.getSettingCount().keySet()) { %>
         <tr>
         <tr>
             <td><%=setting%></td>
             <td><%=setting%></td>
-            <td><%=summaryBean.getSettingCount().get(setting)%></td>
+            <td><%=format.format(summaryBean.getSettingCount().get(setting).longValue())%></td>
         </tr>
         </tr>
         <% } %>
         <% } %>
     </table>
     </table>
@@ -178,7 +197,7 @@
         <% for (final String statistic: summaryBean.getStatCount().keySet()) { %>
         <% for (final String statistic: summaryBean.getStatCount().keySet()) { %>
         <tr>
         <tr>
             <td><%=statistic%></td>
             <td><%=statistic%></td>
-            <td><%=summaryBean.getStatCount().get(statistic)%></td>
+            <td><%=format.format(summaryBean.getStatCount().get(statistic).longValue())%></td>
         </tr>
         </tr>
         <% } %>
         <% } %>
     </table>
     </table>

+ 19 - 11
server/src/main/java/password/pwm/util/EventRateMeter.java → lib-util/src/main/java/password/pwm/util/EventRateMeter.java

@@ -20,29 +20,27 @@
 
 
 package password.pwm.util;
 package password.pwm.util;
 
 
-import password.pwm.util.java.MovingAverage;
-import password.pwm.util.java.TimeDuration;
+import password.pwm.util.java.PwmNumberFormat;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.time.Duration;
+import java.util.Locale;
+import java.util.Objects;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantLock;
 
 
 public class EventRateMeter implements Serializable
 public class EventRateMeter implements Serializable
 {
 {
-    private final TimeDuration maxDuration;
+    private final long maxDuration;
     private final Lock lock = new ReentrantLock();
     private final Lock lock = new ReentrantLock();
 
 
     private MovingAverage movingAverage;
     private MovingAverage movingAverage;
     private double remainder;
     private double remainder;
 
 
-    public EventRateMeter( final TimeDuration maxDuration )
+    public EventRateMeter( final Duration maxDuration )
     {
     {
-        if ( maxDuration == null )
-        {
-            throw new NullPointerException( "maxDuration cannot be null" );
-        }
-        this.maxDuration = maxDuration;
+        this.maxDuration = Objects.requireNonNull( maxDuration ) .toMillis();
         reset();
         reset();
     }
     }
 
 
@@ -51,7 +49,7 @@ public class EventRateMeter implements Serializable
         lock.lock();
         lock.lock();
         try
         try
         {
         {
-            movingAverage = new MovingAverage( maxDuration.asMillis() );
+            movingAverage = new MovingAverage( Duration.ofMillis( maxDuration ) );
             remainder = 0;
             remainder = 0;
         }
         }
         finally
         finally
@@ -60,6 +58,11 @@ public class EventRateMeter implements Serializable
         }
         }
     }
     }
 
 
+    public void markEvent()
+    {
+        markEvents( 1 );
+    }
+
     public void markEvents( final int eventCount )
     public void markEvents( final int eventCount )
     {
     {
         lock.lock();
         lock.lock();
@@ -83,7 +86,12 @@ public class EventRateMeter implements Serializable
         }
         }
     }
     }
 
 
-    public BigDecimal readEventRate( )
+    public String prettyEps( final Locale locale )
+    {
+        return PwmNumberFormat.prettyBigDecimal( rawEps(), 3, locale );
+    }
+
+    public BigDecimal rawEps( )
     {
     {
         lock.lock();
         lock.lock();
         try
         try

+ 3 - 11
lib-util/src/main/java/password/pwm/util/java/MovingAverage.java → lib-util/src/main/java/password/pwm/util/MovingAverage.java

@@ -18,7 +18,7 @@
  * limitations under the License.
  * limitations under the License.
  */
  */
 
 
-package password.pwm.util.java;
+package password.pwm.util;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.text.NumberFormat;
 import java.text.NumberFormat;
@@ -59,20 +59,12 @@ public class MovingAverage implements Serializable
     private volatile long lastMillis;
     private volatile long lastMillis;
     private volatile double average;
     private volatile double average;
 
 
-
     /**
     /**
      * Construct a {@link MovingAverage}, providing the time window
      * Construct a {@link MovingAverage}, providing the time window
-     * we want the average over. For example, providing a value of
-     * 3,600,000 provides a moving average over the last hour.
+     * we want the average over.
      *
      *
-     * @param windowMillis the length of the sliding window in
-     *                     milliseconds
+     * @param timeDuration the length of the sliding window.
      */
      */
-    public MovingAverage( final long windowMillis )
-    {
-        this.windowMillis = windowMillis;
-    }
-
     public MovingAverage( final Duration timeDuration )
     public MovingAverage( final Duration timeDuration )
     {
     {
         this.windowMillis = timeDuration.toMillis();
         this.windowMillis = timeDuration.toMillis();

+ 1 - 1
lib-util/src/main/java/password/pwm/util/java/Percent.java → lib-util/src/main/java/password/pwm/util/Percent.java

@@ -18,7 +18,7 @@
  * limitations under the License.
  * limitations under the License.
  */
  */
 
 
-package password.pwm.util.java;
+package password.pwm.util;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.math.MathContext;

+ 0 - 1
lib-util/src/main/java/password/pwm/util/ProgressInfoCalculator.java

@@ -20,7 +20,6 @@
 
 
 package password.pwm.util;
 package password.pwm.util;
 
 
-import password.pwm.util.java.Percent;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 
 
 import java.io.Serializable;
 import java.io.Serializable;

+ 13 - 21
server/src/main/java/password/pwm/util/TransactionSizeCalculator.java → lib-util/src/main/java/password/pwm/util/TransactionSizeCalculator.java

@@ -24,7 +24,7 @@ import lombok.Builder;
 import lombok.Value;
 import lombok.Value;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 
 
-import java.util.Objects;
+import java.time.Duration;
 
 
 public class TransactionSizeCalculator
 public class TransactionSizeCalculator
 {
 {
@@ -42,32 +42,29 @@ public class TransactionSizeCalculator
     public void reset( )
     public void reset( )
     {
     {
         transactionSize = settings.getMinTransactions();
         transactionSize = settings.getMinTransactions();
-        lastDuration = settings.getDurationGoal().asMillis();
+        lastDuration = settings.getDurationGoal();
     }
     }
 
 
-    public void recordLastTransactionDuration( final long duration )
+    public void recordLastTransactionDuration( final Duration duration )
     {
     {
-        recordLastTransactionDuration( TimeDuration.of( duration, TimeDuration.Unit.MILLISECONDS ) );
+        recordLastTransactionDuration( duration.toMillis() );
     }
     }
 
 
-    @SuppressWarnings( "ResultOfMethodCallIgnored" )
     public void pause( )
     public void pause( )
     {
     {
-        final long pauseTimeMs = Math.min( lastDuration, settings.getDurationGoal().asMillis() * 2 );
+        final long pauseTimeMs = Math.min( lastDuration, settings.getDurationGoal() * 2 );
         TimeDuration.of( pauseTimeMs, TimeDuration.Unit.MILLISECONDS ).pause();
         TimeDuration.of( pauseTimeMs, TimeDuration.Unit.MILLISECONDS ).pause();
     }
     }
 
 
-    public void recordLastTransactionDuration( final TimeDuration duration )
+    public void recordLastTransactionDuration(  final long duration  )
     {
     {
-        Objects.requireNonNull( duration );
-
-        lastDuration = duration.asMillis();
-        final long durationGoalMs = settings.getDurationGoal().asMillis();
-        final long difference = Math.abs( duration.asMillis() - durationGoalMs );
+        lastDuration = duration;
+        final long durationGoalMs = settings.getDurationGoal();
+        final long difference = Math.abs( duration - durationGoalMs );
         final int closeThreshold = ( int ) ( durationGoalMs * .15f );
         final int closeThreshold = ( int ) ( durationGoalMs * .15f );
 
 
         int newTransactionSize;
         int newTransactionSize;
-        if ( duration.isShorterThan( settings.getDurationGoal() ) )
+        if ( duration < ( settings.getDurationGoal() ) )
         {
         {
             if ( difference > closeThreshold )
             if ( difference > closeThreshold )
             {
             {
@@ -78,7 +75,7 @@ public class TransactionSizeCalculator
                 newTransactionSize = transactionSize + 1;
                 newTransactionSize = transactionSize + 1;
             }
             }
         }
         }
-        else if ( duration.isLongerThan( settings.getDurationGoal() ) )
+        else if ( duration > ( settings.getDurationGoal() ) )
         {
         {
             if ( difference > ( 10 * durationGoalMs ) )
             if ( difference > ( 10 * durationGoalMs ) )
             {
             {
@@ -117,7 +114,7 @@ public class TransactionSizeCalculator
     public static class Settings
     public static class Settings
     {
     {
         @Builder.Default
         @Builder.Default
-        private TimeDuration durationGoal = TimeDuration.of( 100, TimeDuration.Unit.MILLISECONDS );
+        private long durationGoal = 100;
 
 
         @Builder.Default
         @Builder.Default
         private int maxTransactions = 5003;
         private int maxTransactions = 5003;
@@ -142,12 +139,7 @@ public class TransactionSizeCalculator
                 throw new IllegalArgumentException( "minTransactions must be less than maxTransactions" );
                 throw new IllegalArgumentException( "minTransactions must be less than maxTransactions" );
             }
             }
 
 
-            if ( durationGoal == null )
-            {
-                throw new IllegalArgumentException( "durationGoal must not be null" );
-            }
-
-            if ( durationGoal.asMillis() < 1 )
+            if ( durationGoal < 1 )
             {
             {
                 throw new IllegalArgumentException( "durationGoal must be greater than 0ms" );
                 throw new IllegalArgumentException( "durationGoal must be greater than 0ms" );
             }
             }

+ 46 - 13
lib-util/src/main/java/password/pwm/util/java/AverageTracker.java

@@ -23,21 +23,24 @@ package password.pwm.util.java;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.BigInteger;
 import java.math.MathContext;
 import java.math.MathContext;
-import java.util.ArrayDeque;
-import java.util.Queue;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLongArray;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 
 public class AverageTracker
 public class AverageTracker
 {
 {
     private final int maxSamples;
     private final int maxSamples;
-    private final Queue<BigInteger> samples = new ArrayDeque<>();
+    private final AtomicLongArray samples;
+    private final AtomicInteger index = new AtomicInteger();
+    private final AtomicInteger top = new AtomicInteger();
 
 
     private final transient ReadWriteLock lock = new ReentrantReadWriteLock();
     private final transient ReadWriteLock lock = new ReentrantReadWriteLock();
 
 
     public AverageTracker( final int maxSamples )
     public AverageTracker( final int maxSamples )
     {
     {
-        this.maxSamples = maxSamples;
+        this.maxSamples = maxSamples - 1;
+        this.samples = new AtomicLongArray( maxSamples );
     }
     }
 
 
     public void addSample( final long input )
     public void addSample( final long input )
@@ -45,11 +48,9 @@ public class AverageTracker
         lock.writeLock().lock();
         lock.writeLock().lock();
         try
         try
         {
         {
-            samples.add( BigInteger.valueOf( input ) );
-            while ( samples.size() > maxSamples )
-            {
-                samples.remove();
-            }
+            samples.set( index.get(), input );
+            index.updateAndGet( current -> current >= maxSamples ? 0 : current + 1 );
+            top.updateAndGet( current -> current >= maxSamples ? maxSamples : current + 1 );
         }
         }
         finally
         finally
         {
         {
@@ -62,23 +63,55 @@ public class AverageTracker
         lock.readLock().lock();
         lock.readLock().lock();
         try
         try
         {
         {
-            if ( samples.isEmpty() )
+            if ( top.get() == 0 )
             {
             {
                 return BigDecimal.ZERO;
                 return BigDecimal.ZERO;
             }
             }
 
 
-            final BigInteger total = samples.stream().reduce( BigInteger::add ).get();
-            final BigDecimal sampleSize = new BigDecimal( samples.size() );
-            return new BigDecimal( total ).divide( sampleSize, MathContext.DECIMAL128 );
+            return primitiveSum();
+        }
+        catch ( final ArithmeticException e )
+        {
+            return bigSum();
         }
         }
         finally
         finally
         {
         {
             lock.readLock().unlock();
             lock.readLock().unlock();
         }
         }
+
     }
     }
 
 
     public long avgAsLong( )
     public long avgAsLong( )
     {
     {
         return avg().longValue();
         return avg().longValue();
     }
     }
+
+    private BigDecimal primitiveSum()
+            throws ArithmeticException
+    {
+        long total = 0;
+        for ( int i = 0; i <= top.get(); i++ )
+        {
+            // math add exact throws exception on overflow
+            total = Math.addExact( total, samples.get( i ) );
+        }
+        return calcAvg( BigDecimal.valueOf( total ) );
+    }
+
+    private BigDecimal bigSum()
+    {
+        BigInteger total = BigInteger.ZERO;
+        for ( int i = 0; i <= top.get(); i++ )
+        {
+            total = total.add( BigInteger.valueOf( samples.get( i ) ) );
+        }
+
+        return calcAvg( new BigDecimal( total ) );
+    }
+
+    private BigDecimal calcAvg( final BigDecimal total )
+    {
+        final BigDecimal sampleSize = new BigDecimal( top.get() + 1 );
+        return total.divide( sampleSize, MathContext.DECIMAL128 );
+    }
 }
 }

+ 6 - 7
lib-util/src/main/java/password/pwm/util/java/CollectionUtil.java

@@ -42,8 +42,12 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 import java.util.stream.StreamSupport;
 
 
-public class CollectionUtil
+public final class CollectionUtil
 {
 {
+    private CollectionUtil()
+    {
+    }
+
     public static <T> Stream<T> iteratorToStream( final Iterator<T> iterator )
     public static <T> Stream<T> iteratorToStream( final Iterator<T> iterator )
     {
     {
         return Optional.ofNullable( iterator )
         return Optional.ofNullable( iterator )
@@ -117,7 +121,7 @@ public class CollectionUtil
 
 
         final Set<E> set = inputs.stream()
         final Set<E> set = inputs.stream()
                 .filter( Objects::nonNull )
                 .filter( Objects::nonNull )
-                .map( input -> JavaHelper.readEnumFromString( enumClass, input ) )
+                .map( input -> EnumUtil.readEnumFromString( enumClass, input ) )
                 .flatMap( Optional::stream )
                 .flatMap( Optional::stream )
                 .collect( Collectors.toSet() );
                 .collect( Collectors.toSet() );
 
 
@@ -203,11 +207,6 @@ public class CollectionUtil
                 .collect( CollectorUtil.toUnmodifiableLinkedMap( Map.Entry::getKey, Map.Entry::getValue ) );
                 .collect( CollectorUtil.toUnmodifiableLinkedMap( Map.Entry::getKey, Map.Entry::getValue ) );
     }
     }
 
 
-    public static <E extends Enum<E>> Stream<E> enumStream( final Class<E> enumClass )
-    {
-        return EnumSet.allOf( enumClass ).stream();
-    }
-
     public static <T> Set<T> setUnion( final Set<T> set1, final Set<T> set2 )
     public static <T> Set<T> setUnion( final Set<T> set1, final Set<T> set2 )
     {
     {
         final Set<T> unionSet = new HashSet<>( set1 == null ? Collections.emptySet() : set1 );
         final Set<T> unionSet = new HashSet<>( set1 == null ? Collections.emptySet() : set1 );

+ 9 - 5
lib-util/src/main/java/password/pwm/util/java/CollectorUtil.java

@@ -32,8 +32,12 @@ import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
-public class CollectorUtil
+public final class CollectorUtil
 {
 {
+    private CollectorUtil()
+    {
+    }
+
     public static <T, K, U> Collector<T, ?, Map<K, U>> toUnmodifiableLinkedMap(
     public static <T, K, U> Collector<T, ?, Map<K, U>> toUnmodifiableLinkedMap(
             final Function<? super T, ? extends K> keyMapper,
             final Function<? super T, ? extends K> keyMapper,
             final Function<? super T, ? extends U> valueMapper
             final Function<? super T, ? extends U> valueMapper
@@ -71,15 +75,15 @@ public class CollectorUtil
             final Comparator<K> comparator
             final Comparator<K> comparator
     )
     )
     {
     {
-        return Collectors.collectingAndThen( Collectors.toUnmodifiableMap(
+        return Collectors.collectingAndThen( Collectors.toMap(
                         keyMapper,
                         keyMapper,
                         valueMapper ),
                         valueMapper ),
-                s -> {
+                map ->
+                {
                     final SortedMap<K, U> sortedMap = new TreeMap<>( comparator );
                     final SortedMap<K, U> sortedMap = new TreeMap<>( comparator );
-                    sortedMap.putAll( s );
+                    sortedMap.putAll( map );
                     return sortedMap;
                     return sortedMap;
                 } );
                 } );
-
     }
     }
 
 
     public static <T, K extends Enum<K>, U> Collector<T, ?, Map<K, U>> toUnmodifiableEnumMap(
     public static <T, K extends Enum<K>, U> Collector<T, ?, Map<K, U>> toUnmodifiableEnumMap(

+ 5 - 6
lib-util/src/main/java/password/pwm/util/java/ConditionalTaskExecutor.java

@@ -22,7 +22,6 @@ package password.pwm.util.java;
 
 
 import java.time.Duration;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.Instant;
-import java.time.temporal.ChronoUnit;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.Lock;
@@ -37,7 +36,7 @@ import java.util.function.BooleanSupplier;
  * reliance, the conditional is only evaluated during execution of {@code conditionallyExecuteTask()} so the conditional on its own is not
  * reliance, the conditional is only evaluated during execution of {@code conditionallyExecuteTask()} so the conditional on its own is not
  * a strictly reliable indicator of how frequently the task will execute.</p>
  * a strictly reliable indicator of how frequently the task will execute.</p>
  */
  */
-public class ConditionalTaskExecutor
+public final class ConditionalTaskExecutor
 {
 {
     private final Runnable task;
     private final Runnable task;
     private final BooleanSupplier predicate;
     private final BooleanSupplier predicate;
@@ -53,7 +52,6 @@ public class ConditionalTaskExecutor
         {
         {
             if ( predicate.getAsBoolean() )
             if ( predicate.getAsBoolean() )
             {
             {
-
                 task.run();
                 task.run();
             }
             }
         }
         }
@@ -63,7 +61,7 @@ public class ConditionalTaskExecutor
         }
         }
     }
     }
 
 
-    public ConditionalTaskExecutor( final Runnable task, final BooleanSupplier predicate )
+    private ConditionalTaskExecutor( final Runnable task, final BooleanSupplier predicate )
     {
     {
         this.task = Objects.requireNonNull( task );
         this.task = Objects.requireNonNull( task );
         this.predicate = Objects.requireNonNull( predicate );
         this.predicate = Objects.requireNonNull( predicate );
@@ -77,7 +75,8 @@ public class ConditionalTaskExecutor
     public static ConditionalTaskExecutor forPeriodicTask(
     public static ConditionalTaskExecutor forPeriodicTask(
             final Runnable task,
             final Runnable task,
             final Duration timeDuration,
             final Duration timeDuration,
-            final Duration firstExecutionDelay )
+            final Duration firstExecutionDelay
+    )
     {
     {
         return new ConditionalTaskExecutor( task, new TimeDurationPredicate( timeDuration, firstExecutionDelay ) );
         return new ConditionalTaskExecutor( task, new TimeDurationPredicate( timeDuration, firstExecutionDelay ) );
     }
     }
@@ -101,7 +100,7 @@ public class ConditionalTaskExecutor
 
 
         private void setNextTimeFromNow( final Duration duration )
         private void setNextTimeFromNow( final Duration duration )
         {
         {
-            nextExecuteTimestamp.set( Instant.now().plus( duration.toMillis(), ChronoUnit.MILLIS ) );
+            nextExecuteTimestamp.set( Instant.now().plus( duration ) );
         }
         }
 
 
         @Override
         @Override

+ 124 - 0
lib-util/src/main/java/password/pwm/util/java/EnumUtil.java

@@ -0,0 +1,124 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2021 The PWM Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package password.pwm.util.java;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public final class EnumUtil
+{
+    private EnumUtil()
+    {
+    }
+
+    public static <E extends Enum<E>> Optional<E> readEnumFromCaseIgnoreString( final Class<E> enumClass, final String input )
+    {
+        return readEnumFromPredicate( enumClass, loopValue -> loopValue.name().equalsIgnoreCase( input ) );
+    }
+
+    public static <E extends Enum<E>> Optional<E> readEnumFromPredicate( final Class<E> enumClass, final Predicate<E> match )
+    {
+        if ( match == null )
+        {
+            return Optional.empty();
+        }
+
+        if ( enumClass == null || !enumClass.isEnum() )
+        {
+            return Optional.empty();
+        }
+
+        return enumStream( enumClass ).filter( match ).findFirst();
+    }
+
+    public static <E extends Enum<E>> Set<E> readEnumsFromPredicate( final Class<E> enumClass, final Predicate<E> match )
+    {
+        if ( match == null )
+        {
+            return Collections.emptySet();
+        }
+
+        if ( enumClass == null || !enumClass.isEnum() )
+        {
+            return Collections.emptySet();
+        }
+
+        return enumStream( enumClass ).filter( match ).collect( Collectors.toUnmodifiableSet() );
+    }
+
+    public static <E extends Enum<E>> Optional<E> readEnumFromString( final Class<E> enumClass, final String input )
+    {
+        if ( StringUtil.isEmpty( input ) )
+        {
+            return Optional.empty();
+        }
+
+        if ( enumClass == null || !enumClass.isEnum() )
+        {
+            return Optional.empty();
+        }
+
+        try
+        {
+            return Optional.of( Enum.valueOf( enumClass, input ) );
+        }
+        catch ( final IllegalArgumentException e )
+        {
+            /* noop */
+        }
+
+        return Optional.empty();
+    }
+
+    public static <E extends Enum<E>> boolean enumArrayContainsValue( final E[] enumArray, final E enumValue )
+    {
+        if ( enumArray == null || enumArray.length == 0 )
+        {
+            return false;
+        }
+
+        for ( final E loopValue : enumArray )
+        {
+            if ( loopValue == enumValue )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public static <E extends Enum<E>> Stream<E> enumStream( final Class<E> enumClass )
+    {
+        return EnumSet.allOf( enumClass ).stream();
+    }
+
+    public static <E extends Enum<E>> void forEach( final Class<E> enumClass, final Consumer<E> consumer )
+    {
+        EnumSet.allOf( enumClass ).forEach( consumer );
+    }
+}

+ 1 - 80
lib-util/src/main/java/password/pwm/util/java/JavaHelper.java

@@ -49,12 +49,10 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.Properties;
-import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.LongAccumulator;
 import java.util.concurrent.atomic.LongAccumulator;
 import java.util.function.Predicate;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 import java.util.zip.GZIPOutputStream;
 
 
@@ -79,66 +77,7 @@ public final class JavaHelper
 
 
     public static <E extends Enum<E>> E readEnumFromString( final Class<E> enumClass, final E defaultValue, final String input )
     public static <E extends Enum<E>> E readEnumFromString( final Class<E> enumClass, final E defaultValue, final String input )
     {
     {
-        return readEnumFromString( enumClass, input ).orElse( defaultValue );
-    }
-
-    public static <E extends Enum<E>> Optional<E> readEnumFromCaseIgnoreString( final Class<E> enumClass, final String input )
-    {
-        return JavaHelper.readEnumFromPredicate( enumClass, loopValue -> loopValue.name().equalsIgnoreCase( input ) );
-    }
-
-    public static <E extends Enum<E>> Optional<E> readEnumFromPredicate( final Class<E> enumClass, final Predicate<E> match )
-    {
-        if ( match == null )
-        {
-            return Optional.empty();
-        }
-
-        if ( enumClass == null || !enumClass.isEnum() )
-        {
-            return Optional.empty();
-        }
-
-        return CollectionUtil.enumStream( enumClass ).filter( match ).findFirst();
-    }
-
-    public static <E extends Enum<E>> Set<E> readEnumsFromPredicate( final Class<E> enumClass, final Predicate<E> match )
-    {
-        if ( match == null )
-        {
-            return Collections.emptySet();
-        }
-
-        if ( enumClass == null || !enumClass.isEnum() )
-        {
-            return Collections.emptySet();
-        }
-
-        return CollectionUtil.enumStream( enumClass ).filter( match ).collect( Collectors.toUnmodifiableSet() );
-    }
-
-    public static <E extends Enum<E>> Optional<E> readEnumFromString( final Class<E> enumClass, final String input )
-    {
-        if ( StringUtil.isEmpty( input ) )
-        {
-            return Optional.empty();
-        }
-
-        if ( enumClass == null || !enumClass.isEnum() )
-        {
-            return Optional.empty();
-        }
-
-        try
-        {
-            return Optional.of( Enum.valueOf( enumClass, input ) );
-        }
-        catch ( final IllegalArgumentException e )
-        {
-            /* noop */
-        }
-
-        return Optional.empty();
+        return EnumUtil.readEnumFromString( enumClass, input ).orElse( defaultValue );
     }
     }
 
 
     public static String throwableToString( final Throwable throwable )
     public static String throwableToString( final Throwable throwable )
@@ -182,24 +121,6 @@ public final class JavaHelper
         return errorMsg.toString();
         return errorMsg.toString();
     }
     }
 
 
-    public static <E extends Enum<E>> boolean enumArrayContainsValue( final E[] enumArray, final E enumValue )
-    {
-        if ( enumArray == null || enumArray.length == 0 )
-        {
-            return false;
-        }
-
-        for ( final E loopValue : enumArray )
-        {
-            if ( loopValue == enumValue )
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
     public static long copy( final InputStream input, final OutputStream output )
     public static long copy( final InputStream input, final OutputStream output )
             throws IOException
             throws IOException
     {
     {

+ 12 - 0
lib-util/src/main/java/password/pwm/util/java/PwmNumberFormat.java

@@ -20,6 +20,10 @@
 
 
 package password.pwm.util.java;
 package password.pwm.util.java;
 
 
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.text.NumberFormat;
 import java.util.Locale;
 import java.util.Locale;
 
 
@@ -42,4 +46,12 @@ public class PwmNumberFormat
         final NumberFormat numberFormat = NumberFormat.getInstance( locale );
         final NumberFormat numberFormat = NumberFormat.getInstance( locale );
         return numberFormat.format( number );
         return numberFormat.format( number );
     }
     }
+
+    public static String prettyBigDecimal( final BigDecimal bigDecimal, final int significantBits, final Locale locale )
+    {
+        final MathContext mathContext = new MathContext( significantBits, RoundingMode.HALF_EVEN );
+        final BigDecimal rounded = bigDecimal.round( mathContext );
+        final NumberFormat decimalFormat = DecimalFormat.getInstance( locale );
+        return decimalFormat.format( rounded );
+    }
 }
 }

+ 8 - 10
lib-util/src/main/java/password/pwm/util/java/StatisticAverageBundle.java

@@ -20,9 +20,9 @@
 
 
 package password.pwm.util.java;
 package password.pwm.util.java;
 
 
+import password.pwm.util.MovingAverage;
+
 import java.time.Duration;
 import java.time.Duration;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EnumMap;
 import java.util.Map;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -37,9 +37,8 @@ public class StatisticAverageBundle<K extends Enum<K>>
     public StatisticAverageBundle( final Class<K> keyType, final Duration avgPeriodLength )
     public StatisticAverageBundle( final Class<K> keyType, final Duration avgPeriodLength )
     {
     {
         this.keyType = keyType;
         this.keyType = keyType;
-        statMap = new EnumMap<>( keyType );
-        Arrays.stream( keyType.getEnumConstants() )
-                .forEach( k -> statMap.put( k, new MovingAverage( avgPeriodLength ) ) );
+        this.statMap = new EnumMap<>( keyType );
+        EnumUtil.forEach( keyType, k -> statMap.put( k, new MovingAverage( avgPeriodLength ) ) );
     }
     }
 
 
     public StatisticAverageBundle( final Class<K> keyType )
     public StatisticAverageBundle( final Class<K> keyType )
@@ -70,11 +69,10 @@ public class StatisticAverageBundle<K extends Enum<K>>
 
 
     public Map<String, String> debugStats()
     public Map<String, String> debugStats()
     {
     {
-        return Collections.unmodifiableMap( Arrays.stream( keyType.getEnumConstants() )
-                .collect( Collectors.toMap(
-                        Enum::name,
-                        this::getFormattedAverage
-                ) ) );
+        return statMap.entrySet().stream()
+                .collect( Collectors.toUnmodifiableMap(
+                        entry -> entry.getKey().name(),
+                        entry -> entry.getValue().getFormattedAverage() ) );
     }
     }
 
 
     public String debugString()
     public String debugString()

+ 11 - 11
lib-util/src/main/java/password/pwm/util/java/StatisticCounterBundle.java

@@ -20,10 +20,10 @@
 
 
 package password.pwm.util.java;
 package password.pwm.util.java;
 
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EnumMap;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.atomic.LongAccumulator;
 import java.util.concurrent.atomic.LongAccumulator;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -34,9 +34,9 @@ public class StatisticCounterBundle<K extends Enum<K>>
 
 
     public StatisticCounterBundle( final Class<K> keyType )
     public StatisticCounterBundle( final Class<K> keyType )
     {
     {
-        this.keyType = keyType;
-        statMap = new EnumMap<>( keyType );
-        Arrays.stream( keyType.getEnumConstants() ).forEach( k -> statMap.put( k, JavaHelper.newAbsLongAccumulator() ) );
+        this.keyType = Objects.requireNonNull( keyType );
+        this.statMap = new EnumMap<>( keyType );
+        EnumUtil.forEach( keyType, k -> statMap.put( k, JavaHelper.newAbsLongAccumulator() ) );
     }
     }
 
 
     public void increment( final K stat )
     public void increment( final K stat )
@@ -55,12 +55,12 @@ public class StatisticCounterBundle<K extends Enum<K>>
         return longAdder == null ? 0 : longAdder.longValue();
         return longAdder == null ? 0 : longAdder.longValue();
     }
     }
 
 
-    public Map<String, String> debugStats()
+    public Map<String, String> debugStats( final Locale locale )
     {
     {
-        return Collections.unmodifiableMap( Arrays.stream( keyType.getEnumConstants() )
-                .collect( Collectors.toMap(
-                        Enum::name,
-                        stat -> Long.toString( get( stat ) )
-                ) ) );
+        final PwmNumberFormat pwmNumberFormat = PwmNumberFormat.forLocale( locale );
+        return statMap.entrySet().stream()
+                .collect( Collectors.toUnmodifiableMap(
+                        entry -> entry.getKey().name(),
+                        entry -> pwmNumberFormat.format( entry.getValue().longValue() ) ) );
     }
     }
 }
 }

+ 83 - 0
lib-util/src/main/java/password/pwm/util/java/StatisticRateBundle.java

@@ -0,0 +1,83 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2021 The PWM Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package password.pwm.util.java;
+
+import password.pwm.util.EventRateMeter;
+
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.util.EnumMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class StatisticRateBundle<K extends Enum<K>>
+{
+    private static final Duration DEFAULT_DURATION = Duration.ofMinutes( 1 );
+
+    private final Class<K> keyType;
+    private final Map<K, EventRateMeter> statMap;
+
+    public StatisticRateBundle( final Class<K> keyType, final Duration avgPeriodLength )
+    {
+        this.keyType = keyType;
+        statMap = new EnumMap<>( keyType );
+        EnumUtil.forEach( keyType, k -> statMap.put( k, new EventRateMeter( avgPeriodLength ) ) );
+    }
+
+    public StatisticRateBundle( final Class<K> keyType )
+    {
+        this( keyType, DEFAULT_DURATION );
+    }
+
+    public void markEvent( final K stat )
+    {
+        statMap.get( stat ).markEvent();
+    }
+
+    public void markEvents( final K stat, final int count )
+    {
+        statMap.get( stat ).markEvents( count );
+    }
+
+    public BigDecimal rawEps( final K stat )
+    {
+        final EventRateMeter movingAverage = statMap.get( stat );
+        return movingAverage.rawEps();
+    }
+
+    public String prettyEps( final K stat, final Locale locale )
+    {
+        return statMap.get( stat ).prettyEps( locale );
+    }
+
+    public Map<String, String> debugStats( final Locale locale )
+    {
+        return statMap.entrySet().stream().collect( Collectors.toUnmodifiableMap(
+                entry -> entry.getKey().name(),
+                entry -> entry.getValue().prettyEps( locale ) ) );
+    }
+
+    public String debugString( final Locale locale )
+    {
+        return StringUtil.mapToString( debugStats( locale ) );
+    }
+}

+ 15 - 5
lib-util/src/main/java/password/pwm/util/java/StringUtil.java

@@ -31,6 +31,7 @@ import java.net.URLEncoder;
 import java.nio.charset.Charset;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.StandardCharsets;
 import java.text.NumberFormat;
 import java.text.NumberFormat;
+import java.time.Duration;
 import java.time.Instant;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -51,8 +52,12 @@ import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
-public abstract class StringUtil
+public final class StringUtil
 {
 {
+    private StringUtil()
+    {   
+    }
+
     private static final Charset STRING_UTIL_CHARSET = StandardCharsets.UTF_8;
     private static final Charset STRING_UTIL_CHARSET = StandardCharsets.UTF_8;
 
 
     private static final Base64.Decoder B64_MIME_DECODER = Base64.getMimeDecoder();
     private static final Base64.Decoder B64_MIME_DECODER = Base64.getMimeDecoder();
@@ -247,6 +252,11 @@ public abstract class StringUtil
         return instant == null ? "" : instant.truncatedTo( ChronoUnit.SECONDS ).toString();
         return instant == null ? "" : instant.truncatedTo( ChronoUnit.SECONDS ).toString();
     }
     }
 
 
+    public static String toIsoDuration( final Duration duration )
+    {
+        return duration == null ? "" : duration.truncatedTo( ChronoUnit.SECONDS ).toString();
+    }
+
     public enum Base64Options
     public enum Base64Options
     {
     {
         GZIP,
         GZIP,
@@ -319,7 +329,7 @@ public abstract class StringUtil
         }
         }
 
 
         final byte[] decodedBytes;
         final byte[] decodedBytes;
-        if ( JavaHelper.enumArrayContainsValue( options, Base64Options.URL_SAFE ) )
+        if ( EnumUtil.enumArrayContainsValue( options, Base64Options.URL_SAFE ) )
         {
         {
             decodedBytes = B64_URL_DECODER.decode( input.toString() );
             decodedBytes = B64_URL_DECODER.decode( input.toString() );
         }
         }
@@ -328,7 +338,7 @@ public abstract class StringUtil
             decodedBytes = B64_MIME_DECODER.decode( input.toString() );
             decodedBytes = B64_MIME_DECODER.decode( input.toString() );
         }
         }
 
 
-        if ( JavaHelper.enumArrayContainsValue( options, Base64Options.GZIP ) )
+        if ( EnumUtil.enumArrayContainsValue( options, Base64Options.GZIP ) )
         {
         {
             return JavaHelper.gunzip( decodedBytes );
             return JavaHelper.gunzip( decodedBytes );
         }
         }
@@ -341,7 +351,7 @@ public abstract class StringUtil
     public static String base64Encode( final byte[] input, final StringUtil.Base64Options... options )
     public static String base64Encode( final byte[] input, final StringUtil.Base64Options... options )
     {
     {
         final byte[] compressedBytes;
         final byte[] compressedBytes;
-        if ( JavaHelper.enumArrayContainsValue( options, Base64Options.GZIP ) )
+        if ( EnumUtil.enumArrayContainsValue( options, Base64Options.GZIP ) )
         {
         {
             try
             try
             {
             {
@@ -357,7 +367,7 @@ public abstract class StringUtil
             compressedBytes = input;
             compressedBytes = input;
         }
         }
 
 
-        if ( JavaHelper.enumArrayContainsValue( options, Base64Options.URL_SAFE ) )
+        if ( EnumUtil.enumArrayContainsValue( options, Base64Options.URL_SAFE ) )
         {
         {
             return B64_URL_ENCODER.encodeToString( compressedBytes );
             return B64_URL_ENCODER.encodeToString( compressedBytes );
         }
         }

+ 1 - 1
lib-util/src/test/java/password/pwm/util/java/CollectorUtilTest.java

@@ -98,7 +98,7 @@ public class CollectorUtilTest
     @Test
     @Test
     public void collectorToUnmodifiableEnumSet()
     public void collectorToUnmodifiableEnumSet()
     {
     {
-        final Set<TestEnum> testSet = CollectionUtil.enumStream( TestEnum.class )
+        final Set<TestEnum> testSet = EnumUtil.enumStream( TestEnum.class )
                 .collect( CollectorUtil.toUnmodifiableEnumSet( TestEnum.class, Function.identity() ) );
                 .collect( CollectorUtil.toUnmodifiableEnumSet( TestEnum.class, Function.identity() ) );
 
 
         Assertions.assertEquals( 6, testSet.size() );
         Assertions.assertEquals( 6, testSet.size() );

+ 56 - 0
lib-util/src/test/java/password/pwm/util/java/PwmNumberFormatTest.java

@@ -0,0 +1,56 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2021 The PWM Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package password.pwm.util.java;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.util.Locale;
+
+class PwmNumberFormatTest
+{
+    @Test
+    void prettyBigDecimalTest()
+    {
+        final Locale locale = new Locale( "en_US" );
+
+        Assertions.assertEquals(
+                "0.333",
+                PwmNumberFormat.prettyBigDecimal( new BigDecimal( "0.333" ), 3, locale ) );
+
+        Assertions.assertEquals(
+                "123",
+                PwmNumberFormat.prettyBigDecimal( new BigDecimal( "123.333" ), 3, locale ) );
+
+        Assertions.assertEquals(
+                "123,000,000",
+                PwmNumberFormat.prettyBigDecimal( new BigDecimal( "123456789.3333333333333" ), 3, locale ) );
+
+        Assertions.assertEquals(
+                "0",
+                PwmNumberFormat.prettyBigDecimal( new BigDecimal( "0.000000003" ), 3, locale ) );
+
+        Assertions.assertEquals(
+                "0.778",
+                PwmNumberFormat.prettyBigDecimal( new BigDecimal( "0.77777777" ), 3, locale ) );
+    }
+}

+ 1 - 1
server/pom.xml

@@ -171,7 +171,7 @@
         <dependency>
         <dependency>
             <groupId>com.github.ldapchai</groupId>
             <groupId>com.github.ldapchai</groupId>
             <artifactId>ldapchai</artifactId>
             <artifactId>ldapchai</artifactId>
-            <version>0.8.3-SNAPSHOT</version>
+            <version>0.8.2</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.jrivard.xmlchai</groupId>
             <groupId>org.jrivard.xmlchai</groupId>

+ 2 - 2
server/src/main/java/password/pwm/AppProperty.java

@@ -20,7 +20,7 @@
 
 
 package password.pwm;
 package password.pwm;
 
 
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.util.Objects;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Optional;
@@ -450,6 +450,6 @@ public enum AppProperty
 
 
     public static Optional<AppProperty> forKey( final String key )
     public static Optional<AppProperty> forKey( final String key )
     {
     {
-        return JavaHelper.readEnumFromPredicate( AppProperty.class, appProperty -> Objects.equals( appProperty.getKey(), key ) );
+        return EnumUtil.readEnumFromPredicate( AppProperty.class, appProperty -> Objects.equals( appProperty.getKey(), key ) );
     }
     }
 }
 }

+ 2 - 2
server/src/main/java/password/pwm/PwmAboutProperty.java

@@ -25,8 +25,8 @@ import password.pwm.i18n.Display;
 import password.pwm.ldap.LdapDomainService;
 import password.pwm.ldap.LdapDomainService;
 import password.pwm.svc.db.DatabaseService;
 import password.pwm.svc.db.DatabaseService;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -127,7 +127,7 @@ public enum PwmAboutProperty
             final PwmApplication pwmApplication
             final PwmApplication pwmApplication
     )
     )
     {
     {
-        return CollectionUtil.enumStream( PwmAboutProperty.class )
+        return EnumUtil.enumStream( PwmAboutProperty.class )
                 .map( aboutProp -> Map.entry( aboutProp, readAboutValue( pwmApplication, aboutProp ) ) )
                 .map( aboutProp -> Map.entry( aboutProp, readAboutValue( pwmApplication, aboutProp ) ) )
                 .filter( entry -> entry.getValue().isPresent() )
                 .filter( entry -> entry.getValue().isPresent() )
                 .collect( CollectorUtil.toUnmodifiableEnumMap( PwmAboutProperty.class,
                 .collect( CollectorUtil.toUnmodifiableEnumMap( PwmAboutProperty.class,

+ 2 - 2
server/src/main/java/password/pwm/bean/DomainID.java

@@ -22,7 +22,7 @@ package password.pwm.bean;
 
 
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.config.PwmSettingScope;
 import password.pwm.config.PwmSettingScope;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Collections;
@@ -72,7 +72,7 @@ public final class DomainID implements Comparable<DomainID>, Serializable
                 return !this.isSystem();
                 return !this.isSystem();
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( scope );
+                PwmUtil.unhandledSwitchStatement( scope );
         }
         }
 
 
         return false;
         return false;

+ 1 - 1
server/src/main/java/password/pwm/bean/LocalSessionStateBean.java

@@ -22,7 +22,7 @@ package password.pwm.bean;
 
 
 import lombok.Data;
 import lombok.Data;
 import password.pwm.user.UserInfoBean;
 import password.pwm.user.UserInfoBean;
-import password.pwm.util.java.MovingAverage;
+import password.pwm.util.MovingAverage;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 
 
 import java.io.Serializable;
 import java.io.Serializable;

+ 2 - 1
server/src/main/java/password/pwm/bean/UserIdentity.java

@@ -30,6 +30,7 @@ import password.pwm.config.profile.LdapProfile;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -89,7 +90,7 @@ public class UserIdentity implements Serializable, Comparable<UserIdentity>
             final Flag... flags
             final Flag... flags
     )
     )
     {
     {
-        final boolean canonical = JavaHelper.enumArrayContainsValue( flags, Flag.PreCanonicalized );
+        final boolean canonical = EnumUtil.enumArrayContainsValue( flags, Flag.PreCanonicalized );
         return new UserIdentity( userDN, ldapProfile, domainID, canonical );
         return new UserIdentity( userDN, ldapProfile, domainID, canonical );
     }
     }
 
 

+ 2 - 1
server/src/main/java/password/pwm/config/AppConfig.java

@@ -42,6 +42,7 @@ import password.pwm.util.PasswordData;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -184,7 +185,7 @@ public class AppConfig implements SettingReader
 
 
     public Map<AppProperty, String> readAllAppProperties()
     public Map<AppProperty, String> readAllAppProperties()
     {
     {
-        return CollectionUtil.enumStream( AppProperty.class )
+        return EnumUtil.enumStream( AppProperty.class )
                 .collect( CollectorUtil.toLinkedMap(
                 .collect( CollectorUtil.toLinkedMap(
                         Function.identity(),
                         Function.identity(),
                         this::readAppProperty
                         this::readAppProperty

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

@@ -55,7 +55,7 @@ import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.PwmSecurityKey;
 
 
 import java.security.cert.X509Certificate;
 import java.security.cert.X509Certificate;
@@ -270,7 +270,7 @@ public class DomainConfig implements SettingReader
 
 
     public Optional<TokenStorageMethod> getTokenStorageMethod( )
     public Optional<TokenStorageMethod> getTokenStorageMethod( )
     {
     {
-        return JavaHelper.readEnumFromString( TokenStorageMethod.class, readSettingAsString( PwmSetting.TOKEN_STORAGEMETHOD ) );
+        return EnumUtil.readEnumFromString( TokenStorageMethod.class, readSettingAsString( PwmSetting.TOKEN_STORAGEMETHOD ) );
     }
     }
 
 
     public PwmSettingTemplateSet getTemplate( )
     public PwmSettingTemplateSet getTemplate( )

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

@@ -25,8 +25,8 @@ import password.pwm.PwmConstants;
 import password.pwm.bean.ProfileID;
 import password.pwm.bean.ProfileID;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.macro.MacroRequest;
 import password.pwm.util.macro.MacroRequest;
@@ -457,7 +457,7 @@ public enum PwmSettingCategory
         private static PwmSettingScope readScope( final PwmSettingCategory category )
         private static PwmSettingScope readScope( final PwmSettingCategory category )
         {
         {
             final String attributeValue = readAttributeFromCategoryOrParent( category, PwmSettingXml.XML_ELEMENT_SCOPE );
             final String attributeValue = readAttributeFromCategoryOrParent( category, PwmSettingXml.XML_ELEMENT_SCOPE );
-            return JavaHelper.readEnumFromString( PwmSettingScope.class, attributeValue ).orElseThrow( () -> new IllegalStateException(
+            return EnumUtil.readEnumFromString( PwmSettingScope.class, attributeValue ).orElseThrow( () -> new IllegalStateException(
                     "unable to parse value for PwmSettingCategory '" + category + "' scope attribute" ) );
                     "unable to parse value for PwmSettingCategory '" + category + "' scope attribute" ) );
         }
         }
 
 
@@ -511,7 +511,7 @@ public enum PwmSettingCategory
 
 
         public static Set<PwmSettingCategory> readChildren( final PwmSettingCategory category )
         public static Set<PwmSettingCategory> readChildren( final PwmSettingCategory category )
         {
         {
-            return CollectionUtil.enumStream( PwmSettingCategory.class )
+            return EnumUtil.enumStream( PwmSettingCategory.class )
                     .filter( ( loopCategory ) -> loopCategory.getParent() == category )
                     .filter( ( loopCategory ) -> loopCategory.getParent() == category )
                     .collect( CollectorUtil.toUnmodifiableEnumSet( PwmSettingCategory.class, s -> s ) );
                     .collect( CollectorUtil.toUnmodifiableEnumSet( PwmSettingCategory.class, s -> s ) );
         }
         }

+ 5 - 4
server/src/main/java/password/pwm/config/PwmSettingMetaData.java

@@ -23,6 +23,7 @@ package password.pwm.config;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Value;
 import lombok.Value;
 import org.jrivard.xmlchai.XmlElement;
 import org.jrivard.xmlchai.XmlElement;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.macro.MacroRequest;
 import password.pwm.util.macro.MacroRequest;
 
 
@@ -104,7 +105,7 @@ class PwmSettingMetaData
                     flagElement.getChildren( PwmSettingXml.XML_ELEMENT_FLAG ).forEach( flagsElement ->
                     flagElement.getChildren( PwmSettingXml.XML_ELEMENT_FLAG ).forEach( flagsElement ->
                     {
                     {
                         final String value = flagsElement.getText().orElse( "" ).trim();
                         final String value = flagsElement.getText().orElse( "" ).trim();
-                        JavaHelper.readEnumFromString( PwmSettingFlag.class, value ).ifPresent( returnObj::add );
+                        EnumUtil.readEnumFromString( PwmSettingFlag.class, value ).ifPresent( returnObj::add );
                     } )
                     } )
             );
             );
             return Collections.unmodifiableSet( returnObj );
             return Collections.unmodifiableSet( returnObj );
@@ -139,10 +140,10 @@ class PwmSettingMetaData
             {
             {
                 permissionElement.getChildren( PwmSettingXml.XML_ELEMENT_LDAP ).forEach( ldapElement ->
                 permissionElement.getChildren( PwmSettingXml.XML_ELEMENT_LDAP ).forEach( ldapElement ->
                 {
                 {
-                    final Optional<LDAPPermissionInfo.Actor> actor = JavaHelper.readEnumFromString(
+                    final Optional<LDAPPermissionInfo.Actor> actor = EnumUtil.readEnumFromString(
                             LDAPPermissionInfo.Actor.class,
                             LDAPPermissionInfo.Actor.class,
                             permissionElement.getAttribute( PwmSettingXml.XML_ATTRIBUTE_PERMISSION_ACTOR ).orElse( "" ) );
                             permissionElement.getAttribute( PwmSettingXml.XML_ATTRIBUTE_PERMISSION_ACTOR ).orElse( "" ) );
-                    final Optional<LDAPPermissionInfo.Access> type = JavaHelper.readEnumFromString(
+                    final Optional<LDAPPermissionInfo.Access> type = EnumUtil.readEnumFromString(
                             LDAPPermissionInfo.Access.class,
                             LDAPPermissionInfo.Access.class,
                             permissionElement.getAttribute( PwmSettingXml.XML_ATTRIBUTE_PERMISSION_ACCESS ).orElse( "" ) );
                             permissionElement.getAttribute( PwmSettingXml.XML_ATTRIBUTE_PERMISSION_ACCESS ).orElse( "" ) );
 
 
@@ -191,7 +192,7 @@ class PwmSettingMetaData
                         final String keyAttribute = propertyElement.getAttribute( PwmSettingXml.XML_ATTRIBUTE_KEY )
                         final String keyAttribute = propertyElement.getAttribute( PwmSettingXml.XML_ATTRIBUTE_KEY )
                                 .orElseThrow( () -> new IllegalStateException( "property element is missing 'key' attribute for value " + pwmSetting.getKey() ) );
                                 .orElseThrow( () -> new IllegalStateException( "property element is missing 'key' attribute for value " + pwmSetting.getKey() ) );
 
 
-                        final PwmSettingProperty property = JavaHelper.readEnumFromString( PwmSettingProperty.class, keyAttribute )
+                        final PwmSettingProperty property = EnumUtil.readEnumFromString( PwmSettingProperty.class, keyAttribute )
                                 .orElseThrow( () -> new IllegalStateException( "property element has unknown 'key' attribute for value " + pwmSetting.getKey() ) );
                                 .orElseThrow( () -> new IllegalStateException( "property element has unknown 'key' attribute for value " + pwmSetting.getKey() ) );
 
 
                         propertyElement.getText().ifPresent( value -> newProps.put( property, value ) );
                         propertyElement.getText().ifPresent( value -> newProps.put( property, value ) );

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

@@ -20,7 +20,7 @@
 
 
 package password.pwm.config;
 package password.pwm.config;
 
 
-import password.pwm.util.java.CollectionUtil;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashMap;
@@ -42,7 +42,7 @@ public class PwmSettingStats
 
 
         returnObj.put( SettingStat.Total, PwmSetting.values().length );
         returnObj.put( SettingStat.Total, PwmSetting.values().length );
 
 
-        returnObj.put( SettingStat.hasProfile, CollectionUtil.enumStream( PwmSetting.class )
+        returnObj.put( SettingStat.hasProfile, EnumUtil.enumStream( PwmSetting.class )
                 .filter( pwmSetting -> pwmSetting.getCategory().hasProfiles() )
                 .filter( pwmSetting -> pwmSetting.getCategory().hasProfiles() )
                 .count() );
                 .count() );
 
 

+ 2 - 1
server/src/main/java/password/pwm/config/PwmSettingTemplate.java

@@ -21,6 +21,7 @@
 package password.pwm.config;
 package password.pwm.config;
 
 
 import org.jrivard.xmlchai.XmlElement;
 import org.jrivard.xmlchai.XmlElement;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 
 
 import java.util.EnumMap;
 import java.util.EnumMap;
@@ -82,7 +83,7 @@ public enum PwmSettingTemplate
 
 
     public static Set<PwmSettingTemplate> valuesForType( final Type type )
     public static Set<PwmSettingTemplate> valuesForType( final Type type )
     {
     {
-        return JavaHelper.readEnumsFromPredicate( PwmSettingTemplate.class, t -> t.getType() == type );
+        return EnumUtil.readEnumsFromPredicate( PwmSettingTemplate.class, t -> t.getType() == type );
     }
     }
 
 
     public enum Type
     public enum Type

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

@@ -22,6 +22,7 @@ package password.pwm.config;
 
 
 import lombok.Value;
 import lombok.Value;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.List;
 import java.util.List;
@@ -41,7 +42,7 @@ public class PwmSettingTemplateSet implements Serializable
                 .map( PwmSettingTemplate::getType )
                 .map( PwmSettingTemplate::getType )
                 .collect( Collectors.toSet() );
                 .collect( Collectors.toSet() );
 
 
-        workingSet.addAll( CollectionUtil.enumStream( PwmSettingTemplate.Type.class )
+        workingSet.addAll( EnumUtil.enumStream( PwmSettingTemplate.Type.class )
                 .filter( type -> !seenTypes.contains( type ) )
                 .filter( type -> !seenTypes.contains( type ) )
                 .map( PwmSettingTemplate.Type::getDefaultValue )
                 .map( PwmSettingTemplate.Type::getDefaultValue )
                 .collect( Collectors.toUnmodifiableSet( ) ) );
                 .collect( Collectors.toUnmodifiableSet( ) ) );
@@ -70,7 +71,7 @@ public class PwmSettingTemplateSet implements Serializable
      */
      */
     public static List<PwmSettingTemplateSet> allValues()
     public static List<PwmSettingTemplateSet> allValues()
     {
     {
-        return CollectionUtil.enumStream( PwmSettingTemplate.class )
+        return EnumUtil.enumStream( PwmSettingTemplate.class )
                 .map( pwmSettingTemplate -> new PwmSettingTemplateSet( Set.of( pwmSettingTemplate ) ) )
                 .map( pwmSettingTemplate -> new PwmSettingTemplateSet( Set.of( pwmSettingTemplate ) ) )
                 .collect( Collectors.toUnmodifiableList() );
                 .collect( Collectors.toUnmodifiableList() );
     }
     }

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

@@ -49,6 +49,7 @@ import password.pwm.util.PasswordData;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmHashAlgorithm;
 import password.pwm.util.secure.PwmHashAlgorithm;
@@ -191,7 +192,7 @@ public class StoredSettingReader implements SettingReader
         final String input = readSettingAsString( setting );
         final String input = readSettingAsString( setting );
 
 
         return Arrays.stream( input.split( "-" ) )
         return Arrays.stream( input.split( "-" ) )
-                .map( s ->  JavaHelper.readEnumFromString( DataStorageMethod.class, s ) )
+                .map( s ->  EnumUtil.readEnumFromString( DataStorageMethod.class, s ) )
                 .flatMap( Optional::stream )
                 .flatMap( Optional::stream )
                 .collect( Collectors.toUnmodifiableList() );
                 .collect( Collectors.toUnmodifiableList() );
     }
     }
@@ -239,7 +240,7 @@ public class StoredSettingReader implements SettingReader
                 final DomainID domainID
                 final DomainID domainID
         )
         )
         {
         {
-            return CollectionUtil.enumStream( ProfileDefinition.class )
+            return EnumUtil.enumStream( ProfileDefinition.class )
                     .filter( profileDefinition -> domainID.inScope( profileDefinition.getCategory().getScope() ) )
                     .filter( profileDefinition -> domainID.inScope( profileDefinition.getCategory().getScope() ) )
                     .collect( CollectorUtil.toUnmodifiableLinkedMap(
                     .collect( CollectorUtil.toUnmodifiableLinkedMap(
                             profileDefinition -> profileDefinition,
                             profileDefinition -> profileDefinition,

+ 2 - 2
server/src/main/java/password/pwm/config/option/WebServiceUsage.java

@@ -20,7 +20,7 @@
 
 
 package password.pwm.config.option;
 package password.pwm.config.option;
 
 
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.ws.server.RestAuthenticationType;
 import password.pwm.ws.server.RestAuthenticationType;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
@@ -59,6 +59,6 @@ public enum WebServiceUsage
 
 
     public static Set<WebServiceUsage> forType( final RestAuthenticationType type )
     public static Set<WebServiceUsage> forType( final RestAuthenticationType type )
     {
     {
-        return JavaHelper.readEnumsFromPredicate( WebServiceUsage.class, webServiceUsage -> webServiceUsage.getTypes().contains( type ) );
+        return EnumUtil.readEnumsFromPredicate( WebServiceUsage.class, webServiceUsage -> webServiceUsage.getTypes().contains( type ) );
     }
     }
 }
 }

+ 2 - 2
server/src/main/java/password/pwm/config/profile/AbstractProfile.java

@@ -31,7 +31,7 @@ import password.pwm.config.value.data.ActionConfiguration;
 import password.pwm.config.value.data.FormConfiguration;
 import password.pwm.config.value.data.FormConfiguration;
 import password.pwm.config.value.data.UserPermission;
 import password.pwm.config.value.data.UserPermission;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.security.cert.X509Certificate;
 import java.security.cert.X509Certificate;
 import java.util.Collections;
 import java.util.Collections;
@@ -176,6 +176,6 @@ public abstract class AbstractProfile implements Profile
     public GuidMode readGuidMode()
     public GuidMode readGuidMode()
     {
     {
         final String guidAttributeName = readSettingAsString( PwmSetting.LDAP_GUID_ATTRIBUTE );
         final String guidAttributeName = readSettingAsString( PwmSetting.LDAP_GUID_ATTRIBUTE );
-        return JavaHelper.readEnumFromString( GuidMode.class, guidAttributeName ).orElse( GuidMode.VENDORGUID );
+        return EnumUtil.readEnumFromString( GuidMode.class, guidAttributeName ).orElse( GuidMode.VENDORGUID );
     }
     }
 }
 }

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

@@ -36,6 +36,7 @@ import password.pwm.health.HealthMessage;
 import password.pwm.health.HealthRecord;
 import password.pwm.health.HealthRecord;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.java.LazySupplier;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -211,7 +212,7 @@ public class PwmPasswordPolicy implements Profile, Serializable
         PwmPasswordPolicy newDefaultPolicy = null;
         PwmPasswordPolicy newDefaultPolicy = null;
         try
         try
         {
         {
-            final Map<String, String> defaultPolicyMap = CollectionUtil.enumStream( PwmPasswordRule.class )
+            final Map<String, String> defaultPolicyMap = EnumUtil.enumStream( PwmPasswordRule.class )
                     .collect( Collectors.toUnmodifiableMap(
                     .collect( Collectors.toUnmodifiableMap(
                             PwmPasswordRule::getKey,
                             PwmPasswordRule::getKey,
                             PwmPasswordRule::getDefaultValue ) );
                             PwmPasswordRule::getDefaultValue ) );
@@ -285,7 +286,7 @@ public class PwmPasswordPolicy implements Profile, Serializable
             return this;
             return this;
         }
         }
 
 
-        final Map<String, String> newPasswordPolicies = CollectionUtil.enumStream( PwmPasswordRule.class )
+        final Map<String, String> newPasswordPolicies = EnumUtil.enumStream( PwmPasswordRule.class )
                 .map( rule -> Map.entry( rule, mergeValue( otherPolicy, rule ) ) )
                 .map( rule -> Map.entry( rule, mergeValue( otherPolicy, rule ) ) )
                 .filter( entry -> entry.getValue().isPresent() )
                 .filter( entry -> entry.getValue().isPresent() )
                 .collect( Collectors.toUnmodifiableMap( entry -> entry.getKey().getKey(), entry -> entry.getValue().get() ) );
                 .collect( Collectors.toUnmodifiableMap( entry -> entry.getKey().getKey(), entry -> entry.getValue().get() ) );

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

@@ -26,7 +26,7 @@ import password.pwm.config.DomainConfig;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
@@ -367,7 +367,7 @@ public enum PwmPasswordRule
         this.appProperty = null;
         this.appProperty = null;
         this.ruleType = ruleType;
         this.ruleType = ruleType;
         this.defaultValue = defaultValue;
         this.defaultValue = defaultValue;
-        this.positiveBooleanMerge = JavaHelper.enumArrayContainsValue( flags, Flag.positiveBooleanMerge );
+        this.positiveBooleanMerge = EnumUtil.enumArrayContainsValue( flags, Flag.positiveBooleanMerge );
     }
     }
 
 
     PwmPasswordRule(
     PwmPasswordRule(
@@ -382,7 +382,7 @@ public enum PwmPasswordRule
         this.appProperty = appProperty;
         this.appProperty = appProperty;
         this.ruleType = ruleType;
         this.ruleType = ruleType;
         this.defaultValue = defaultValue;
         this.defaultValue = defaultValue;
-        this.positiveBooleanMerge = JavaHelper.enumArrayContainsValue( flags, Flag.positiveBooleanMerge );
+        this.positiveBooleanMerge = EnumUtil.enumArrayContainsValue( flags, Flag.positiveBooleanMerge );
     }
     }
 
 
     public String getKey( )
     public String getKey( )

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

@@ -29,7 +29,7 @@ import password.pwm.config.PwmSettingSyntax;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
@@ -190,7 +190,7 @@ public final class StoredConfigKey implements Serializable, Comparable<StoredCon
                 break;
                 break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( recordType );
+                PwmUtil.unhandledSwitchStatement( recordType );
         }
         }
     }
     }
 
 
@@ -222,7 +222,7 @@ public final class StoredConfigKey implements Serializable, Comparable<StoredCon
                         + this.getProfileID();
                         + this.getProfileID();
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( recordType );
+                PwmUtil.unhandledSwitchStatement( recordType );
         }
         }
 
 
         throw new IllegalStateException(  );
         throw new IllegalStateException(  );
@@ -317,7 +317,7 @@ public final class StoredConfigKey implements Serializable, Comparable<StoredCon
                 return PwmSettingSyntax.LOCALIZED_STRING_ARRAY;
                 return PwmSettingSyntax.LOCALIZED_STRING_ARRAY;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( getRecordType() );
+                PwmUtil.unhandledSwitchStatement( getRecordType() );
                 throw new IllegalStateException();
                 throw new IllegalStateException();
         }
         }
     }
     }

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

@@ -43,7 +43,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmExceptionLoggingConsumer;
 import password.pwm.util.java.PwmExceptionLoggingConsumer;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -363,7 +363,7 @@ public abstract class StoredConfigurationUtil
                 return new StringValue( "" );
                 return new StringValue( "" );
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( key );
+                PwmUtil.unhandledSwitchStatement( key );
         }
         }
 
 
         throw new IllegalStateException();
         throw new IllegalStateException();

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

@@ -31,7 +31,7 @@ import password.pwm.config.value.data.ActionConfiguration;
 import password.pwm.error.PwmInternalException;
 import password.pwm.error.PwmInternalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -427,7 +427,7 @@ public class ActionValue extends AbstractValue implements StoredValue
             break;
             break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( oldAction.getType() );
+                PwmUtil.unhandledSwitchStatement( oldAction.getType() );
 
 
         }
         }
 
 

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

@@ -33,7 +33,7 @@ import password.pwm.util.PasswordData;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.security.cert.X509Certificate;
 import java.security.cert.X509Certificate;
 import java.util.Collections;
 import java.util.Collections;
@@ -266,7 +266,7 @@ public final class ValueTypeConverter
         }
         }
 
 
         final String strValue = ( String ) value.toNativeObject();
         final String strValue = ( String ) value.toNativeObject();
-        return JavaHelper.readEnumFromString( enumClass, strValue ).orElse( null );
+        return EnumUtil.readEnumFromString( enumClass, strValue ).orElse( null );
     }
     }
 
 
     public static Map<Locale, EmailItemBean> valueToLocalizedEmail( final PwmSetting setting, final StoredValue storedValue )
     public static Map<Locale, EmailItemBean> valueToLocalizedEmail( final PwmSetting setting, final StoredValue storedValue )

+ 6 - 6
server/src/main/java/password/pwm/error/PwmError.java

@@ -23,7 +23,7 @@ package password.pwm.error;
 import com.novell.ldapchai.exception.ChaiError;
 import com.novell.ldapchai.exception.ChaiError;
 import password.pwm.config.SettingReader;
 import password.pwm.config.SettingReader;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
@@ -393,9 +393,9 @@ public enum PwmError
     {
     {
         this.resourceKey = resourceKey;
         this.resourceKey = resourceKey;
         this.errorCode = errorCode;
         this.errorCode = errorCode;
-        this.errorIsPermanent = JavaHelper.enumArrayContainsValue( errorFlags, ErrorFlag.Permanent );
-        this.trivial = JavaHelper.enumArrayContainsValue( errorFlags, ErrorFlag.Trivial );
-        this.auditIgnored = JavaHelper.enumArrayContainsValue( errorFlags, ErrorFlag.AuditIgnored );
+        this.errorIsPermanent = EnumUtil.enumArrayContainsValue( errorFlags, ErrorFlag.Permanent );
+        this.trivial = EnumUtil.enumArrayContainsValue( errorFlags, ErrorFlag.Trivial );
+        this.auditIgnored = EnumUtil.enumArrayContainsValue( errorFlags, ErrorFlag.AuditIgnored );
         this.chaiErrorCode = chaiErrorCode == null ? Collections.emptySet() : Set.copyOf( chaiErrorCode );
         this.chaiErrorCode = chaiErrorCode == null ? Collections.emptySet() : Set.copyOf( chaiErrorCode );
     }
     }
 
 
@@ -406,13 +406,13 @@ public enum PwmError
 
 
     public static Optional<PwmError> forChaiError( final ChaiError errorCode )
     public static Optional<PwmError> forChaiError( final ChaiError errorCode )
     {
     {
-        return JavaHelper.readEnumFromPredicate( PwmError.class,
+        return EnumUtil.readEnumFromPredicate( PwmError.class,
                 pwmError -> pwmError.chaiErrorCode.contains( errorCode ) );
                 pwmError -> pwmError.chaiErrorCode.contains( errorCode ) );
     }
     }
 
 
     public static Optional<PwmError> forErrorNumber( final int code )
     public static Optional<PwmError> forErrorNumber( final int code )
     {
     {
-        return JavaHelper.readEnumFromPredicate( PwmError.class, pwmError -> pwmError.getErrorCode() == code );
+        return EnumUtil.readEnumFromPredicate( PwmError.class, pwmError -> pwmError.getErrorCode() == code );
     }
     }
 
 
     public boolean isTrivial()
     public boolean isTrivial()

+ 2 - 1
server/src/main/java/password/pwm/health/HealthService.java

@@ -23,6 +23,7 @@ package password.pwm.health;
 import lombok.Value;
 import lombok.Value;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmConstants;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
@@ -252,7 +253,7 @@ public class HealthService extends AbstractPwmService implements PwmService
     {
     {
         final Map<String, String> debugData = new HashMap<>();
         final Map<String, String> debugData = new HashMap<>();
         debugData.putAll( averageStats.debugStats() );
         debugData.putAll( averageStats.debugStats() );
-        debugData.putAll( counterStats.debugStats() );
+        debugData.putAll( counterStats.debugStats( PwmConstants.DEFAULT_LOCALE ) );
         return ServiceInfoBean.builder()
         return ServiceInfoBean.builder()
                 .debugProperties( Collections.unmodifiableMap( debugData ) )
                 .debugProperties( Collections.unmodifiableMap( debugData ) )
                 .build();
                 .build();

+ 2 - 2
server/src/main/java/password/pwm/health/LDAPHealthChecker.java

@@ -59,7 +59,7 @@ import password.pwm.ldap.search.SearchConfiguration;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -1161,7 +1161,7 @@ public class LDAPHealthChecker implements HealthSupplier
                 break;
                 break;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( userPermission.getType() );
+                    PwmUtil.unhandledSwitchStatement( userPermission.getType() );
             }
             }
         }
         }
         return returnList;
         return returnList;

+ 3 - 3
server/src/main/java/password/pwm/http/HttpHeader.java

@@ -21,7 +21,7 @@
 package password.pwm.http;
 package password.pwm.http;
 
 
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.util.Optional;
 import java.util.Optional;
 
 
@@ -85,11 +85,11 @@ public enum HttpHeader
 
 
     public boolean isSensitive( )
     public boolean isSensitive( )
     {
     {
-        return JavaHelper.enumArrayContainsValue( properties, Property.Sensitive );
+        return EnumUtil.enumArrayContainsValue( properties, Property.Sensitive );
     }
     }
 
 
     public static Optional<HttpHeader> forHttpHeader( final String header )
     public static Optional<HttpHeader> forHttpHeader( final String header )
     {
     {
-        return JavaHelper.readEnumFromCaseIgnoreString( HttpHeader.class, header );
+        return EnumUtil.readEnumFromCaseIgnoreString( HttpHeader.class, header );
     }
     }
 }
 }

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

@@ -20,7 +20,7 @@
 
 
 package password.pwm.http;
 package password.pwm.http;
 
 
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import java.util.Optional;
 import java.util.Optional;
 
 
@@ -44,7 +44,7 @@ public enum HttpMethod
 
 
     public static Optional<HttpMethod> fromString( final String input )
     public static Optional<HttpMethod> fromString( final String input )
     {
     {
-        return JavaHelper.readEnumFromPredicate( HttpMethod.class,
+        return EnumUtil.readEnumFromPredicate( HttpMethod.class,
                 httpMethod -> httpMethod.toString().equalsIgnoreCase( input ) );
                 httpMethod -> httpMethod.toString().equalsIgnoreCase( input ) );
     }
     }
 
 

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

@@ -30,7 +30,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.Validator;
 import password.pwm.util.Validator;
 import password.pwm.util.java.CollectionUtil;
 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.LazySupplier;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
@@ -261,7 +261,7 @@ public class PwmHttpRequestWrapper
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
         final String value = readParameterAsString( name, Flag.BypassValidation );
         final String value = readParameterAsString( name, Flag.BypassValidation );
-        return JavaHelper.readEnumFromString( enumClass, value );
+        return EnumUtil.readEnumFromString( enumClass, value );
     }
     }
 
 
     public int readParameterAsInt( final String name, final int defaultValue )
     public int readParameterAsInt( final String name, final int defaultValue )

+ 4 - 3
server/src/main/java/password/pwm/http/PwmResponse.java

@@ -33,6 +33,7 @@ import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.http.servlet.command.CommandServlet;
 import password.pwm.http.servlet.command.CommandServlet;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
 import password.pwm.util.Validator;
 import password.pwm.util.Validator;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -179,7 +180,7 @@ public class PwmResponse extends PwmHttpResponseWrapper
 
 
         pwmRequest.setAttribute( PwmRequestAttribute.PwmErrorInfo, errorInformation );
         pwmRequest.setAttribute( PwmRequestAttribute.PwmErrorInfo, errorInformation );
 
 
-        if ( JavaHelper.enumArrayContainsValue( flags, Flag.ForceLogout ) )
+        if ( EnumUtil.enumArrayContainsValue( flags, Flag.ForceLogout ) )
         {
         {
             LOGGER.debug( pwmRequest, () -> "forcing logout due to error " + errorInformation.toDebugStr() );
             LOGGER.debug( pwmRequest, () -> "forcing logout due to error " + errorInformation.toDebugStr() );
             pwmRequest.getPwmSession().unAuthenticateUser( pwmRequest );
             pwmRequest.getPwmSession().unAuthenticateUser( pwmRequest );
@@ -359,7 +360,7 @@ public class PwmResponse extends PwmHttpResponseWrapper
         }
         }
 
 
         final boolean httpOnlyEnabled = Boolean.parseBoolean( appConfig.readAppProperty( AppProperty.HTTP_COOKIE_HTTPONLY_ENABLE ) );
         final boolean httpOnlyEnabled = Boolean.parseBoolean( appConfig.readAppProperty( AppProperty.HTTP_COOKIE_HTTPONLY_ENABLE ) );
-        final boolean httpOnly = httpOnlyEnabled && !JavaHelper.enumArrayContainsValue( flags, PwmHttpResponseWrapper.Flag.NonHttpOnly );
+        final boolean httpOnly = httpOnlyEnabled && !EnumUtil.enumArrayContainsValue( flags, PwmHttpResponseWrapper.Flag.NonHttpOnly );
 
 
         final String value;
         final String value;
         {
         {
@@ -369,7 +370,7 @@ public class PwmResponse extends PwmHttpResponseWrapper
             }
             }
             else
             else
             {
             {
-                if ( JavaHelper.enumArrayContainsValue( flags, PwmHttpResponseWrapper.Flag.BypassSanitation ) )
+                if ( EnumUtil.enumArrayContainsValue( flags, PwmHttpResponseWrapper.Flag.BypassSanitation ) )
                 {
                 {
                     value = StringUtil.urlEncode( cookieValue );
                     value = StringUtil.urlEncode( cookieValue );
                 }
                 }

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

@@ -43,7 +43,7 @@ import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.user.UserInfo;
 import password.pwm.user.UserInfo;
 import password.pwm.user.UserInfoBean;
 import password.pwm.user.UserInfoBean;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -308,7 +308,7 @@ public class PwmSession implements Serializable
 
 
     public int size( )
     public int size( )
     {
     {
-        return ( int ) MiscUtil.sizeof( this );
+        return ( int ) PwmUtil.sizeof( this );
     }
     }
 
 
     PwmSecurityKey getSecurityKey( final PwmRequest pwmRequest )
     PwmSecurityKey getSecurityKey( final PwmRequest pwmRequest )

+ 3 - 3
server/src/main/java/password/pwm/http/servlet/ClientApiServlet.java

@@ -53,7 +53,7 @@ import password.pwm.svc.stats.StatisticsService;
 import password.pwm.user.UserInfo;
 import password.pwm.user.UserInfo;
 import password.pwm.util.i18n.LocaleComparators;
 import password.pwm.util.i18n.LocaleComparators;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.CollectionUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -376,11 +376,11 @@ public class ClientApiServlet extends ControlledPwmServlet
             }
             }
         }
         }
 
 
-        settingMap.put( "epsTypes", CollectionUtil.enumStream( EpsStatistic.class )
+        settingMap.put( "epsTypes", EnumUtil.enumStream( EpsStatistic.class )
                 .map( EpsStatistic::toString )
                 .map( EpsStatistic::toString )
                 .collect( Collectors.toList() ) );
                 .collect( Collectors.toList() ) );
 
 
-        settingMap.put( "epsDurations", CollectionUtil.enumStream( Statistic.EpsDuration.class )
+        settingMap.put( "epsDurations", EnumUtil.enumStream( Statistic.EpsDuration.class )
                 .map( Statistic.EpsDuration::toString )
                 .map( Statistic.EpsDuration::toString )
                 .collect( Collectors.toList() ) );
                 .collect( Collectors.toList() ) );
 
 

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

@@ -29,6 +29,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.ProcessStatus;
 import password.pwm.http.ProcessStatus;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmResponse;
 import password.pwm.http.PwmResponse;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -72,7 +73,7 @@ public abstract class ControlledPwmServlet extends AbstractPwmServlet implements
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
         final Class processStatusClass = getProcessActionsClass();
         final Class processStatusClass = getProcessActionsClass();
-        return JavaHelper.readEnumFromString( processStatusClass,  request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( processStatusClass,  request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     private ProcessStatus dispatchMethod(
     private ProcessStatus dispatchMethod(
@@ -203,7 +204,7 @@ public abstract class ControlledPwmServlet extends AbstractPwmServlet implements
             {
             {
                 final String actionName = method.getAnnotation( ActionHandler.class ).action();
                 final String actionName = method.getAnnotation( ActionHandler.class ).action();
                 final Class processActionClass = getProcessActionsClass();
                 final Class processActionClass = getProcessActionsClass();
-                final Optional<? extends ProcessAction> processAction = JavaHelper.readEnumFromString( processActionClass, actionName );
+                final Optional<? extends ProcessAction> processAction = EnumUtil.readEnumFromString( processActionClass, actionName );
                 processAction.ifPresent( action -> map.put( action, method ) );
                 processAction.ifPresent( action -> map.put( action, method ) );
 
 
             }
             }

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

@@ -50,8 +50,8 @@ import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.user.UserInfo;
 import password.pwm.user.UserInfo;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
-import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.EnumUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroRequest;
 import password.pwm.util.macro.MacroRequest;
 
 
@@ -93,7 +93,7 @@ public class ForgottenUsernameServlet extends AbstractPwmServlet
     protected Optional<ForgottenUsernameAction> readProcessAction( final PwmRequest request )
     protected Optional<ForgottenUsernameAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ForgottenUsernameAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ForgottenUsernameAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     @Override
     @Override
@@ -120,7 +120,7 @@ public class ForgottenUsernameServlet extends AbstractPwmServlet
                     return;
                     return;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( action.get() );
+                    PwmUtil.unhandledSwitchStatement( action.get() );
             }
             }
         }
         }
 
 

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

@@ -57,7 +57,7 @@ import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.util.FormMap;
 import password.pwm.util.FormMap;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmDateFormat;
 import password.pwm.util.java.PwmDateFormat;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroRequest;
 import password.pwm.util.macro.MacroRequest;
@@ -682,7 +682,7 @@ public class GuestRegistrationServlet extends ControlledPwmServlet
 
 
     private void calculateFutureDateFlags( final PwmRequest pwmRequest, final GuestRegistrationBean guestRegistrationBean )
     private void calculateFutureDateFlags( final PwmRequest pwmRequest, final GuestRegistrationBean guestRegistrationBean )
     {
     {
-        final PwmDateFormat dateFormat = MiscUtil.newPwmDateFormat( "yyyy-MM-dd" );
+        final PwmDateFormat dateFormat = PwmUtil.newPwmDateFormat( "yyyy-MM-dd" );
 
 
         final long maxValidDays = pwmRequest.getDomainConfig().readSettingAsLong( PwmSetting.GUEST_MAX_VALID_DAYS );
         final long maxValidDays = pwmRequest.getDomainConfig().readSettingAsLong( PwmSetting.GUEST_MAX_VALID_DAYS );
         pwmRequest.setAttribute( PwmRequestAttribute.GuestMaximumValidDays, String.valueOf( maxValidDays ) );
         pwmRequest.setAttribute( PwmRequestAttribute.GuestMaximumValidDays, String.valueOf( maxValidDays ) );

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

@@ -59,7 +59,7 @@ import password.pwm.http.servlet.peoplesearch.PublicPeopleSearchServlet;
 import password.pwm.http.servlet.setupresponses.SetupResponsesServlet;
 import password.pwm.http.servlet.setupresponses.SetupResponsesServlet;
 import password.pwm.http.servlet.updateprofile.UpdateProfileServlet;
 import password.pwm.http.servlet.updateprofile.UpdateProfileServlet;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 
 
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.annotation.WebServlet;
 import java.lang.annotation.Annotation;
 import java.lang.annotation.Annotation;
@@ -194,6 +194,6 @@ public enum PwmServletDefinition
 
 
     public static Set<PwmServletDefinition> withFlag( final Flag flag )
     public static Set<PwmServletDefinition> withFlag( final Flag flag )
     {
     {
-        return JavaHelper.readEnumsFromPredicate( PwmServletDefinition.class, e -> e.flags.contains( flag ) );
+        return EnumUtil.readEnumsFromPredicate( PwmServletDefinition.class, e -> e.flags.contains( flag ) );
     }
     }
 }
 }

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

@@ -41,7 +41,7 @@ import password.pwm.ldap.permission.UserPermissionUtility;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.util.java.CollectorUtil;
 import password.pwm.util.java.CollectorUtil;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
@@ -90,7 +90,7 @@ public class ShortcutServlet extends ControlledPwmServlet
     protected Optional<ShortcutAction> readProcessAction( final PwmRequest request )
     protected Optional<ShortcutAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ShortcutAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ShortcutAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     @Override
     @Override

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

@@ -63,7 +63,7 @@ import password.pwm.svc.token.TokenUtil;
 import password.pwm.user.UserInfo;
 import password.pwm.user.UserInfo;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
@@ -216,7 +216,7 @@ public class ActivateUserServlet extends ControlledPwmServlet
                 break;
                 break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( resetType );
+                PwmUtil.unhandledSwitchStatement( resetType );
         }
         }
 
 
         return ProcessStatus.Continue;
         return ProcessStatus.Continue;

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

@@ -62,7 +62,7 @@ import password.pwm.svc.stats.StatisticsService;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -940,7 +940,7 @@ public class AdminServlet extends ControlledPwmServlet
             break;
             break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( logDownloadType );
+                PwmUtil.unhandledSwitchStatement( logDownloadType );
 
 
         }
         }
 
 

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

@@ -42,6 +42,7 @@ import password.pwm.svc.node.NodeService;
 import password.pwm.svc.sessiontrack.SessionTrackService;
 import password.pwm.svc.sessiontrack.SessionTrackService;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.PwmNumberFormat;
 import password.pwm.util.java.PwmNumberFormat;
@@ -177,7 +178,7 @@ public class AppDashboardData implements Serializable
         builder.localDbInfo( makeLocalDbInfo( pwmDomain, locale ) );
         builder.localDbInfo( makeLocalDbInfo( pwmDomain, locale ) );
         builder.javaAbout( makeAboutJavaData( pwmDomain, locale ) );
         builder.javaAbout( makeAboutJavaData( pwmDomain, locale ) );
 
 
-        if ( JavaHelper.enumArrayContainsValue( flags, Flag.IncludeLocalDbTableSizes ) )
+        if ( EnumUtil.enumArrayContainsValue( flags, Flag.IncludeLocalDbTableSizes ) )
         {
         {
             builder.localDbSizes( makeLocalDbTableSizes( pwmDomain, locale ) );
             builder.localDbSizes( makeLocalDbTableSizes( pwmDomain, locale ) );
         }
         }
@@ -186,7 +187,7 @@ public class AppDashboardData implements Serializable
             builder.localDbSizes( Collections.emptyMap() );
             builder.localDbSizes( Collections.emptyMap() );
         }
         }
 
 
-        if ( JavaHelper.enumArrayContainsValue( flags, Flag.ShowThreadData ) )
+        if ( EnumUtil.enumArrayContainsValue( flags, Flag.ShowThreadData ) )
         {
         {
             builder.threads( makeThreadInfo() );
             builder.threads( makeThreadInfo() );
         }
         }

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

@@ -56,7 +56,7 @@ import password.pwm.svc.stats.AvgStatistic;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
@@ -186,7 +186,7 @@ public abstract class ChangePasswordServlet extends ControlledPwmServlet
                         break;
                         break;
 
 
                     default:
                     default:
-                        MiscUtil.unhandledSwitchStatement( warnResponse );
+                        PwmUtil.unhandledSwitchStatement( warnResponse );
                 }
                 }
             }
             }
         }
         }

+ 0 - 5
server/src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServlet.java

@@ -558,7 +558,6 @@ public class ConfigEditorServlet extends ControlledPwmServlet
     )
     )
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
-        final Instant startTime = Instant.now();
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ProfileID profileID = ProfileID.create( pwmRequest.readParameterAsString( REQ_PARAM_PROFILE ) );
         final ProfileID profileID = ProfileID.create( pwmRequest.readParameterAsString( REQ_PARAM_PROFILE ) );
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainID( PwmSetting.LDAP_SERVER_URLS );
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainID( PwmSetting.LDAP_SERVER_URLS );
@@ -586,7 +585,6 @@ public class ConfigEditorServlet extends ControlledPwmServlet
     )
     )
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
-        final Instant startTime = Instant.now();
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final AppConfig config = AppConfig.forStoredConfig( configManagerBean.getStoredConfiguration() );
         final AppConfig config = AppConfig.forStoredConfig( configManagerBean.getStoredConfiguration() );
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainID( PwmSetting.LDAP_SERVER_URLS );
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainID( PwmSetting.LDAP_SERVER_URLS );
@@ -603,7 +601,6 @@ public class ConfigEditorServlet extends ControlledPwmServlet
     )
     )
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
-        final Instant startTime = Instant.now();
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
 
 
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainID( PwmSetting.LDAP_SERVER_URLS );
         final DomainID domainID = DomainStateReader.forRequest( pwmRequest ).getDomainID( PwmSetting.LDAP_SERVER_URLS );
@@ -653,7 +650,6 @@ public class ConfigEditorServlet extends ControlledPwmServlet
     )
     )
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
-        final Instant startTime = Instant.now();
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ProfileID profileID = ProfileID.create( pwmRequest.readParameterAsString( REQ_PARAM_PROFILE ) );
         final ProfileID profileID = ProfileID.create( pwmRequest.readParameterAsString( REQ_PARAM_PROFILE ) );
 
 
@@ -754,7 +750,6 @@ public class ConfigEditorServlet extends ControlledPwmServlet
     )
     )
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
-        final Instant startTime = Instant.now();
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
 
 
         final NavTreeSettings navTreeSettings = NavTreeSettings.readFromRequest( pwmRequest );
         final NavTreeSettings navTreeSettings = NavTreeSettings.readFromRequest( pwmRequest );

+ 2 - 2
server/src/main/java/password/pwm/http/servlet/configeditor/function/OAuthCertImportFunction.java

@@ -25,7 +25,7 @@ import password.pwm.config.stored.StoredConfigKey;
 import password.pwm.config.stored.StoredConfigurationModifier;
 import password.pwm.config.stored.StoredConfigurationModifier;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 
 
 public class OAuthCertImportFunction extends AbstractUriCertImportFunction
 public class OAuthCertImportFunction extends AbstractUriCertImportFunction
 {
 {
@@ -50,7 +50,7 @@ public class OAuthCertImportFunction extends AbstractUriCertImportFunction
                 break;
                 break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( pwmSetting );
+                PwmUtil.unhandledSwitchStatement( pwmSetting );
                 return null;
                 return null;
         }
         }
 
 

+ 4 - 4
server/src/main/java/password/pwm/http/servlet/configguide/ConfigGuideServlet.java

@@ -69,8 +69,8 @@ import password.pwm.http.servlet.configeditor.data.SettingDataMaker;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
 import password.pwm.ldap.LdapBrowser;
 import password.pwm.ldap.LdapBrowser;
 import password.pwm.ldap.schema.SchemaOperationResult;
 import password.pwm.ldap.schema.SchemaOperationResult;
-import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.EnumUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
@@ -336,7 +336,7 @@ public class ConfigGuideServlet extends ControlledPwmServlet
             break;
             break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( configGuideBean.getStep() );
+                PwmUtil.unhandledSwitchStatement( configGuideBean.getStep() );
         }
         }
 
 
         final PublicHealthData jsonOutput = PublicHealthData.builder()
         final PublicHealthData jsonOutput = PublicHealthData.builder()
@@ -419,7 +419,7 @@ public class ConfigGuideServlet extends ControlledPwmServlet
 
 
         final GuideStep inputStep = StringUtil.isEmpty( requestedStep )
         final GuideStep inputStep = StringUtil.isEmpty( requestedStep )
                 ? GuideStep.START
                 ? GuideStep.START
-                : JavaHelper.readEnumFromString( GuideStep.class, requestedStep )
+                : EnumUtil.readEnumFromString( GuideStep.class, requestedStep )
                                 .orElseThrow( () -> PwmUnrecoverableException.newException(
                                 .orElseThrow( () -> PwmUnrecoverableException.newException(
                                         PwmError.ERROR_INTERNAL, "unknown step value" ) );
                                         PwmError.ERROR_INTERNAL, "unknown step value" ) );
 
 

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

@@ -63,7 +63,7 @@ import password.pwm.ldap.schema.SchemaManager;
 import password.pwm.ldap.schema.SchemaOperationResult;
 import password.pwm.ldap.schema.SchemaOperationResult;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.Percent;
+import password.pwm.util.Percent;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.X509Utils;
 import password.pwm.util.secure.X509Utils;
 import password.pwm.ws.server.RestResultBean;
 import password.pwm.ws.server.RestResultBean;

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

@@ -39,7 +39,7 @@ import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequestAttribute;
 import password.pwm.http.PwmRequestAttribute;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.X509Utils;
 import password.pwm.util.secure.X509Utils;
 import password.pwm.ws.server.RestResultBean;
 import password.pwm.ws.server.RestResultBean;
@@ -90,7 +90,7 @@ public class ConfigManagerCertificatesServlet extends AbstractPwmServlet
     protected Optional<ConfigManagerCertificateAction> readProcessAction( final PwmRequest request )
     protected Optional<ConfigManagerCertificateAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ConfigManagerCertificateAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ConfigManagerCertificateAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     @Override
     @Override

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

@@ -40,8 +40,8 @@ import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmResponse;
 import password.pwm.http.PwmResponse;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
-import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.EnumUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.localdb.LocalDB;
 import password.pwm.util.localdb.LocalDB;
 import password.pwm.util.localdb.LocalDBFactory;
 import password.pwm.util.localdb.LocalDBFactory;
@@ -96,7 +96,7 @@ public class ConfigManagerLocalDBServlet extends AbstractPwmServlet
     protected Optional<ConfigManagerAction> readProcessAction( final PwmRequest request )
     protected Optional<ConfigManagerAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ConfigManagerAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ConfigManagerAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     @Override
     @Override
@@ -119,7 +119,7 @@ public class ConfigManagerLocalDBServlet extends AbstractPwmServlet
                     return;
                     return;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( processAction.get() );
+                    PwmUtil.unhandledSwitchStatement( processAction.get() );
 
 
 
 
             }
             }

+ 4 - 3
server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerLoginServlet.java

@@ -49,8 +49,9 @@ import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.http.servlet.PwmServletDefinition;
 import password.pwm.svc.intruder.IntruderRecordType;
 import password.pwm.svc.intruder.IntruderRecordType;
 import password.pwm.svc.intruder.IntruderServiceClient;
 import password.pwm.svc.intruder.IntruderServiceClient;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -117,7 +118,7 @@ public class ConfigManagerLoginServlet extends AbstractPwmServlet
                     break;
                     break;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( processAction.get() );
+                    PwmUtil.unhandledSwitchStatement( processAction.get() );
 
 
             }
             }
             return;
             return;
@@ -168,7 +169,7 @@ public class ConfigManagerLoginServlet extends AbstractPwmServlet
     protected Optional<ConfigManagerLoginAction> readProcessAction( final PwmRequest request )
     protected Optional<ConfigManagerLoginAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ConfigManagerLoginAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ConfigManagerLoginAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
 
 

+ 5 - 5
server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerServlet.java

@@ -58,8 +58,8 @@ import password.pwm.ldap.LdapPermissionCalculator;
 import password.pwm.util.debug.DebugItemGenerator;
 import password.pwm.util.debug.DebugItemGenerator;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.EnumUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.ws.server.RestResultBean;
 import password.pwm.ws.server.RestResultBean;
@@ -120,7 +120,7 @@ public class ConfigManagerServlet extends AbstractPwmServlet
     protected Optional<ConfigManagerAction> readProcessAction( final PwmRequest request )
     protected Optional<ConfigManagerAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ConfigManagerAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ConfigManagerAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     public static void verifyConfigAccess( final PwmRequest pwmRequest )
     public static void verifyConfigAccess( final PwmRequest pwmRequest )
@@ -179,7 +179,7 @@ public class ConfigManagerServlet extends AbstractPwmServlet
                     return;
                     return;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( processAction.get() );
+                    PwmUtil.unhandledSwitchStatement( processAction.get() );
             }
             }
             return;
             return;
         }
         }
@@ -412,7 +412,7 @@ public class ConfigManagerServlet extends AbstractPwmServlet
                 pwmRequest.getDomainConfig().readAppProperty( AppProperty.DOWNLOAD_FILENAME_LDAP_PERMISSION_CSV )
                 pwmRequest.getDomainConfig().readAppProperty( AppProperty.DOWNLOAD_FILENAME_LDAP_PERMISSION_CSV )
         );
         );
 
 
-        try ( CSVPrinter csvPrinter = MiscUtil.makeCsvPrinter( pwmRequest.getPwmResponse().getOutputStream() ) )
+        try ( CSVPrinter csvPrinter = PwmUtil.makeCsvPrinter( pwmRequest.getPwmResponse().getOutputStream() ) )
         {
         {
 
 
             final LdapPermissionCalculator ldapPermissionCalculator = new LdapPermissionCalculator( pwmRequest.getDomainConfig() );
             final LdapPermissionCalculator ldapPermissionCalculator = new LdapPermissionCalculator( pwmRequest.getDomainConfig() );

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

@@ -40,8 +40,8 @@ import password.pwm.svc.wordlist.WordlistSourceType;
 import password.pwm.svc.wordlist.WordlistStatus;
 import password.pwm.svc.wordlist.WordlistStatus;
 import password.pwm.svc.wordlist.WordlistType;
 import password.pwm.svc.wordlist.WordlistType;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.EnumUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.ws.server.RestResultBean;
 import password.pwm.ws.server.RestResultBean;
@@ -94,7 +94,7 @@ public class ConfigManagerWordlistServlet extends AbstractPwmServlet
     protected Optional<ConfigManagerAction> readProcessAction( final PwmRequest request )
     protected Optional<ConfigManagerAction> readProcessAction( final PwmRequest request )
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
-        return JavaHelper.readEnumFromString( ConfigManagerAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
+        return EnumUtil.readEnumFromString( ConfigManagerAction.class, request.readParameterAsString( PwmConstants.PARAM_ACTION_REQUEST ) );
     }
     }
 
 
     @Override
     @Override
@@ -121,7 +121,7 @@ public class ConfigManagerWordlistServlet extends AbstractPwmServlet
                     return;
                     return;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( processAction.get() );
+                    PwmUtil.unhandledSwitchStatement( processAction.get() );
             }
             }
             return;
             return;
         }
         }
@@ -134,7 +134,7 @@ public class ConfigManagerWordlistServlet extends AbstractPwmServlet
 
 
     {
     {
         final HttpServletRequest req = pwmRequest.getHttpServletRequest();
         final HttpServletRequest req = pwmRequest.getHttpServletRequest();
-        final Optional<WordlistType> wordlistType = JavaHelper.readEnumFromString( WordlistType.class, pwmRequest.readParameterAsString( "wordlist" ) );
+        final Optional<WordlistType> wordlistType = EnumUtil.readEnumFromString( WordlistType.class, pwmRequest.readParameterAsString( "wordlist" ) );
 
 
         if ( wordlistType.isEmpty() )
         if ( wordlistType.isEmpty() )
         {
         {
@@ -176,7 +176,7 @@ public class ConfigManagerWordlistServlet extends AbstractPwmServlet
     void restClearWordlist( final PwmRequest pwmRequest )
     void restClearWordlist( final PwmRequest pwmRequest )
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
-        final Optional<WordlistType> wordlistType = JavaHelper.readEnumFromString( WordlistType.class, pwmRequest.readParameterAsString( "wordlist" ) );
+        final Optional<WordlistType> wordlistType = EnumUtil.readEnumFromString( WordlistType.class, pwmRequest.readParameterAsString( "wordlist" ) );
 
 
         if ( wordlistType.isEmpty() )
         if ( wordlistType.isEmpty() )
         {
         {

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

@@ -87,7 +87,7 @@ import password.pwm.user.UserInfo;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
@@ -292,7 +292,7 @@ public class ForgottenPasswordServlet extends ControlledPwmServlet
                         break;
                         break;
 
 
                     default:
                     default:
-                        MiscUtil.unhandledSwitchStatement( actionChoice );
+                        PwmUtil.unhandledSwitchStatement( actionChoice );
                 }
                 }
             }
             }
         }
         }
@@ -329,7 +329,7 @@ public class ForgottenPasswordServlet extends ControlledPwmServlet
                 break;
                 break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( resetType );
+                PwmUtil.unhandledSwitchStatement( resetType );
 
 
         }
         }
 
 

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

@@ -83,7 +83,7 @@ import password.pwm.user.UserInfo;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -513,7 +513,7 @@ public class HelpdeskServlet extends ControlledPwmServlet
 
 
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( searchMode );
+                PwmUtil.unhandledSwitchStatement( searchMode );
         }
         }
 
 
         final UserSearchService userSearchService = pwmRequest.getPwmDomain().getUserSearchEngine();
         final UserSearchService userSearchService = pwmRequest.getPwmDomain().getUserSearchEngine();
@@ -565,7 +565,7 @@ public class HelpdeskServlet extends ControlledPwmServlet
 
 
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( searchMode );
+                    PwmUtil.unhandledSwitchStatement( searchMode );
             }
             }
 
 
             searchConfiguration = builder.build();
             searchConfiguration = builder.build();

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

@@ -59,7 +59,7 @@ import password.pwm.svc.token.TokenUtil;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.CaptchaUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
-import password.pwm.util.java.Percent;
+import password.pwm.util.Percent;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;

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

@@ -70,7 +70,7 @@ import password.pwm.svc.token.TokenUtil;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -834,7 +834,7 @@ class NewUserUtils
                 return newUserProfile.getTokenDurationSMS( domainConfig );
                 return newUserProfile.getTokenDurationSMS( domainConfig );
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( tokenDestinationItem );
+                PwmUtil.unhandledSwitchStatement( tokenDestinationItem );
         }
         }
 
 
         return null;
         return null;

+ 4 - 4
server/src/main/java/password/pwm/http/servlet/oauth/OAuthConsumerServlet.java

@@ -42,7 +42,7 @@ import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.ldap.auth.PwmAuthenticationSource;
 import password.pwm.ldap.auth.PwmAuthenticationSource;
 import password.pwm.ldap.auth.SessionAuthenticator;
 import password.pwm.ldap.auth.SessionAuthenticator;
 import password.pwm.ldap.search.UserSearchService;
 import password.pwm.ldap.search.UserSearchService;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
@@ -143,7 +143,7 @@ public class OAuthConsumerServlet extends AbstractPwmServlet
                     return;
                     return;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( oAuthUseCaseCase );
+                    PwmUtil.unhandledSwitchStatement( oAuthUseCaseCase );
             }
             }
 
 
         }
         }
@@ -185,7 +185,7 @@ public class OAuthConsumerServlet extends AbstractPwmServlet
                         return;
                         return;
 
 
                     default:
                     default:
-                        MiscUtil.unhandledSwitchStatement( oAuthUseCaseCase );
+                        PwmUtil.unhandledSwitchStatement( oAuthUseCaseCase );
                 }
                 }
             }
             }
             catch ( final PwmUnrecoverableException e )
             catch ( final PwmUnrecoverableException e )
@@ -324,7 +324,7 @@ public class OAuthConsumerServlet extends AbstractPwmServlet
                 return OAuthSettings.forForgottenPassword( profile );
                 return OAuthSettings.forForgottenPassword( profile );
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( oAuthUseCase );
+                PwmUtil.unhandledSwitchStatement( oAuthUseCase );
 
 
         }
         }
 
 

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

@@ -64,7 +64,7 @@ import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.user.UserInfo;
 import password.pwm.user.UserInfo;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -891,7 +891,7 @@ class PeopleSearchDataReader
             break;
             break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( searchMode );
+                PwmUtil.unhandledSwitchStatement( searchMode );
         }
         }
 
 
         return Optional.of( builder.build() );
         return Optional.of( builder.build() );

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

@@ -44,7 +44,7 @@ import password.pwm.http.servlet.peoplesearch.bean.UserDetailBean;
 import password.pwm.bean.PhotoDataBean;
 import password.pwm.bean.PhotoDataBean;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.svc.stats.StatisticsClient;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
@@ -291,7 +291,7 @@ public abstract class PeopleSearchServlet extends ControlledPwmServlet
         pwmRequest.getPwmResponse().getHttpServletResponse().setBufferSize( 0 );
         pwmRequest.getPwmResponse().getHttpServletResponse().setBufferSize( 0 );
         pwmRequest.getPwmResponse().markAsDownload( HttpContentType.csv, "userData.csv" );
         pwmRequest.getPwmResponse().markAsDownload( HttpContentType.csv, "userData.csv" );
 
 
-        try ( CSVPrinter csvPrinter = MiscUtil.makeCsvPrinter( pwmRequest.getPwmResponse().getOutputStream() ) )
+        try ( CSVPrinter csvPrinter = PwmUtil.makeCsvPrinter( pwmRequest.getPwmResponse().getOutputStream() ) )
         {
         {
             peopleSearchDataReader.writeUserOrgChartDetailToCsv( csvPrinter, userIdentity, effectiveDepth );
             peopleSearchDataReader.writeUserOrgChartDetailToCsv( csvPrinter, userIdentity, effectiveDepth );
         }
         }

+ 3 - 3
server/src/main/java/password/pwm/http/servlet/peoplesearch/PhotoDataReader.java

@@ -47,7 +47,7 @@ import password.pwm.svc.httpclient.PwmHttpClientRequest;
 import password.pwm.svc.httpclient.PwmHttpClientResponse;
 import password.pwm.svc.httpclient.PwmHttpClientResponse;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -158,7 +158,7 @@ public class PhotoDataReader
                 return Optional.of( returnUrl );
                 return Optional.of( returnUrl );
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( method );
+                PwmUtil.unhandledSwitchStatement( method );
 
 
         }
         }
 
 
@@ -191,7 +191,7 @@ public class PhotoDataReader
                     break;
                     break;
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( method );
+                    PwmUtil.unhandledSwitchStatement( method );
             }
             }
         }
         }
         finally
         finally

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

@@ -35,7 +35,7 @@ import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.Percent;
+import password.pwm.util.Percent;
 import password.pwm.util.java.StatisticAverageBundle;
 import password.pwm.util.java.StatisticAverageBundle;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
@@ -194,7 +194,7 @@ public class ResourceServletService extends AbstractPwmService implements PwmSer
     {
     {
         final Map<String, String> debugInfo = new HashMap<>();
         final Map<String, String> debugInfo = new HashMap<>();
         debugInfo.putAll( averageStats.debugStats() );
         debugInfo.putAll( averageStats.debugStats() );
-        debugInfo.putAll( countingStats.debugStats() );
+        debugInfo.putAll( countingStats.debugStats( PwmConstants.DEFAULT_LOCALE ) );
         return ServiceInfoBean.builder()
         return ServiceInfoBean.builder()
                 .debugProperties( debugInfo )
                 .debugProperties( debugInfo )
                 .build();
                 .build();

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

@@ -57,7 +57,7 @@ import password.pwm.svc.token.TokenUtil;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.CollectionUtil;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -281,7 +281,7 @@ public class UpdateProfileServlet extends ControlledPwmServlet
                 return ProcessStatus.Halt;
                 return ProcessStatus.Halt;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( resetType );
+                PwmUtil.unhandledSwitchStatement( resetType );
 
 
         }
         }
 
 

+ 2 - 2
server/src/main/java/password/pwm/http/state/SessionStateService.java

@@ -32,7 +32,7 @@ import password.pwm.http.PwmRequest;
 import password.pwm.http.bean.PwmSessionBean;
 import password.pwm.http.bean.PwmSessionBean;
 import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import java.time.Instant;
 import java.time.Instant;
@@ -103,7 +103,7 @@ public class SessionStateService extends AbstractPwmService implements PwmServic
                             break;
                             break;
 
 
                         default:
                         default:
-                            MiscUtil.unhandledSwitchStatement( loginSessionMode );
+                            PwmUtil.unhandledSwitchStatement( loginSessionMode );
                     }
                     }
                 }
                 }
                 sessionLoginProvider.init( pwmApplication );
                 sessionLoginProvider.init( pwmApplication );

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

@@ -37,7 +37,7 @@ import password.pwm.util.ProgressInfoCalculator;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.java.PwmTimeUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
-import password.pwm.util.java.Percent;
+import password.pwm.util.Percent;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.password.PasswordUtility;
 import password.pwm.util.password.PasswordUtility;

+ 1 - 1
server/src/main/java/password/pwm/ldap/search/UserSearchService.java

@@ -701,7 +701,7 @@ public class UserSearchService extends AbstractPwmService implements PwmService
 
 
     private Map<String, String> debugProperties( )
     private Map<String, String> debugProperties( )
     {
     {
-        final Map<String, String> properties = new TreeMap<>( counters.debugStats() );
+        final Map<String, String> properties = new TreeMap<>( counters.debugStats( PwmConstants.DEFAULT_LOCALE ) );
         properties.put( "jvmThreadCount", Integer.toString( Thread.activeCount() ) );
         properties.put( "jvmThreadCount", Integer.toString( Thread.activeCount() ) );
         if ( executor == null )
         if ( executor == null )
         {
         {

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

@@ -21,6 +21,7 @@
 package password.pwm.svc;
 package password.pwm.svc;
 
 
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmConstants;
 import password.pwm.PwmEnvironment;
 import password.pwm.PwmEnvironment;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
@@ -124,7 +125,7 @@ public class PwmServiceManager
 
 
         initialized = true;
         initialized = true;
 
 
-        LOGGER.trace( sessionLabel, () -> logVerb + "ed services, " + statCounter.debugStats(), TimeDuration.fromCurrent( startTime ) );
+        LOGGER.trace( sessionLabel, () -> logVerb + "ed services, " + statCounter.debugStats( PwmConstants.DEFAULT_LOCALE ), TimeDuration.fromCurrent( startTime ) );
     }
     }
 
 
     private String debugSvcType()
     private String debugSvcType()

+ 7 - 4
server/src/main/java/password/pwm/svc/cache/CacheService.java

@@ -22,6 +22,7 @@ package password.pwm.svc.cache;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmConstants;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.DomainID;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
@@ -103,15 +104,17 @@ public class CacheService extends AbstractPwmService implements PwmService
         final Map<String, String> debugInfo = new TreeMap<>( );
         final Map<String, String> debugInfo = new TreeMap<>( );
         debugInfo.put( "itemCount", String.valueOf( memoryCacheStore.itemCount() ) );
         debugInfo.put( "itemCount", String.valueOf( memoryCacheStore.itemCount() ) );
         debugInfo.put( "byteCount", String.valueOf( memoryCacheStore.byteCount() ) );
         debugInfo.put( "byteCount", String.valueOf( memoryCacheStore.byteCount() ) );
-        debugInfo.putAll( JsonFactory.get().deserializeStringMap( JsonFactory.get().serializeMap( memoryCacheStore.getCacheStoreInfo().debugStats() ) ) );
-        debugInfo.putAll( JsonFactory.get().deserializeStringMap( JsonFactory.get().serializeMap( memoryCacheStore.storedClassHistogram( "histogram." ) ) ) );
+        debugInfo.putAll( JsonFactory.get().deserializeStringMap(
+                JsonFactory.get().serializeMap( memoryCacheStore.getCacheStoreInfo().debugStats( PwmConstants.DEFAULT_LOCALE ) ) ) );
+        debugInfo.putAll( JsonFactory.get().deserializeStringMap(
+                JsonFactory.get().serializeMap( memoryCacheStore.storedClassHistogram( "histogram." ) ) ) );
         return ServiceInfoBean.builder().debugProperties( debugInfo ).build();
         return ServiceInfoBean.builder().debugProperties( debugInfo ).build();
     }
     }
 
 
     public Map<String, Serializable> debugInfo( )
     public Map<String, Serializable> debugInfo( )
     {
     {
         final Map<String, Serializable> debugInfo = new LinkedHashMap<>( );
         final Map<String, Serializable> debugInfo = new LinkedHashMap<>( );
-        debugInfo.put( "memory-statistics", JsonFactory.get().serializeMap( memoryCacheStore.getCacheStoreInfo().debugStats() ) );
+        debugInfo.put( "memory-statistics", JsonFactory.get().serializeMap( memoryCacheStore.getCacheStoreInfo().debugStats( PwmConstants.DEFAULT_LOCALE ) ) );
         debugInfo.put( "memory-items", new ArrayList<Serializable>( memoryCacheStore.getCacheDebugItems() ) );
         debugInfo.put( "memory-items", new ArrayList<Serializable>( memoryCacheStore.getCacheDebugItems() ) );
         debugInfo.put( "memory-histogram", new HashMap<>( memoryCacheStore.storedClassHistogram( "" ) ) );
         debugInfo.put( "memory-histogram", new HashMap<>( memoryCacheStore.storedClassHistogram( "" ) ) );
         return Collections.unmodifiableMap( debugInfo );
         return Collections.unmodifiableMap( debugInfo );
@@ -184,7 +187,7 @@ public class CacheService extends AbstractPwmService implements PwmService
             {
             {
                 final StatisticCounterBundle<CacheStore.DebugKey> info = memoryCacheStore.getCacheStoreInfo();
                 final StatisticCounterBundle<CacheStore.DebugKey> info = memoryCacheStore.getCacheStoreInfo();
                 traceOutput.append( "memCache=" );
                 traceOutput.append( "memCache=" );
-                traceOutput.append( JsonFactory.get().serializeMap( info.debugStats() ) );
+                traceOutput.append( JsonFactory.get().serializeMap( info.debugStats( PwmConstants.DEFAULT_LOCALE ) ) );
                 traceOutput.append( ", histogram=" );
                 traceOutput.append( ", histogram=" );
                 traceOutput.append( JsonFactory.get().serializeMap( memoryCacheStore.storedClassHistogram( "" ) ) );
                 traceOutput.append( JsonFactory.get().serializeMap( memoryCacheStore.storedClassHistogram( "" ) ) );
             }
             }

+ 1 - 1
server/src/main/java/password/pwm/svc/email/EmailServer.java

@@ -26,7 +26,7 @@ import password.pwm.bean.ProfileID;
 import password.pwm.config.option.SmtpServerType;
 import password.pwm.config.option.SmtpServerType;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
-import password.pwm.util.java.MovingAverage;
+import password.pwm.util.MovingAverage;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;

+ 2 - 2
server/src/main/java/password/pwm/svc/event/AuditEvent.java

@@ -24,7 +24,7 @@ import password.pwm.config.SettingReader;
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.PwmDisplayBundle;
 import password.pwm.i18n.PwmDisplayBundle;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 
 
 import java.util.Locale;
 import java.util.Locale;
@@ -109,7 +109,7 @@ public enum AuditEvent
 
 
     public static Optional<AuditEvent> forKey( final String key )
     public static Optional<AuditEvent> forKey( final String key )
     {
     {
-        return JavaHelper.readEnumFromPredicate( AuditEvent.class, auditEvent ->
+        return EnumUtil.readEnumFromPredicate( AuditEvent.class, auditEvent ->
         {
         {
             final Message message = auditEvent.getMessage();
             final Message message = auditEvent.getMessage();
             return message != null && Objects.equals( message.getKey(), key );
             return message != null && Objects.equals( message.getKey(), key );

+ 4 - 4
server/src/main/java/password/pwm/svc/event/AuditService.java

@@ -45,7 +45,7 @@ import password.pwm.svc.PwmService;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.StatisticCounterBundle;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
@@ -182,7 +182,7 @@ public class AuditService extends AbstractPwmService implements PwmService
                 break;
                 break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( record.getEventCode().getType() );
+                PwmUtil.unhandledSwitchStatement( record.getEventCode().getType() );
 
 
         }
         }
     }
     }
@@ -327,7 +327,7 @@ public class AuditService extends AbstractPwmService implements PwmService
     {
     {
         final AppConfig config = getPwmApplication().getConfig();
         final AppConfig config = getPwmApplication().getConfig();
 
 
-        final CSVPrinter csvPrinter = MiscUtil.makeCsvPrinter( outputStream );
+        final CSVPrinter csvPrinter = PwmUtil.makeCsvPrinter( outputStream );
 
 
         csvPrinter.printComment( " " + PwmConstants.PWM_APP_NAME + " audit record output " );
         csvPrinter.printComment( " " + PwmConstants.PWM_APP_NAME + " audit record output " );
         csvPrinter.printComment( " " + StringUtil.toIsoDate( Instant.now() ) );
         csvPrinter.printComment( " " + StringUtil.toIsoDate( Instant.now() ) );
@@ -401,7 +401,7 @@ public class AuditService extends AbstractPwmService implements PwmService
     {
     {
         return ServiceInfoBean.builder()
         return ServiceInfoBean.builder()
                 .storageMethod( DataStorageMethod.LOCALDB )
                 .storageMethod( DataStorageMethod.LOCALDB )
-                .debugProperties( statisticCounterBundle.debugStats() )
+                .debugProperties( statisticCounterBundle.debugStats( PwmConstants.DEFAULT_LOCALE ) )
                 .build();
                 .build();
     }
     }
 
 

+ 2 - 2
server/src/main/java/password/pwm/svc/event/LocalDbAuditVault.java

@@ -27,7 +27,7 @@ import password.pwm.svc.PwmService;
 import password.pwm.util.PwmScheduler;
 import password.pwm.util.PwmScheduler;
 import password.pwm.util.TransactionSizeCalculator;
 import password.pwm.util.TransactionSizeCalculator;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
-import password.pwm.util.java.Percent;
+import password.pwm.util.Percent;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.localdb.LocalDB;
 import password.pwm.util.localdb.LocalDB;
 import password.pwm.util.localdb.LocalDBException;
 import password.pwm.util.localdb.LocalDBException;
@@ -200,7 +200,7 @@ public class LocalDbAuditVault implements AuditVault
         // keep transaction duration around 100ms if possible.
         // keep transaction duration around 100ms if possible.
         final TransactionSizeCalculator transactionSizeCalculator = new TransactionSizeCalculator(
         final TransactionSizeCalculator transactionSizeCalculator = new TransactionSizeCalculator(
                 TransactionSizeCalculator.Settings.builder()
                 TransactionSizeCalculator.Settings.builder()
-                        .durationGoal( TimeDuration.of( 101, TimeDuration.Unit.MILLISECONDS ) )
+                        .durationGoal( TimeDuration.of( 101, TimeDuration.Unit.MILLISECONDS ).asMillis() )
                         .maxTransactions( 5003 )
                         .maxTransactions( 5003 )
                         .minTransactions( 3 )
                         .minTransactions( 3 )
                         .build()
                         .build()

+ 2 - 2
server/src/main/java/password/pwm/svc/event/SyslogAuditService.java

@@ -53,7 +53,7 @@ import password.pwm.health.HealthRecord;
 import password.pwm.health.HealthTopic;
 import password.pwm.health.HealthTopic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.svc.stats.StatisticsClient;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.localdb.LocalDB;
 import password.pwm.util.localdb.LocalDB;
@@ -135,7 +135,7 @@ public class SyslogAuditService
                 return new CEFAuditFormatter();
                 return new CEFAuditFormatter();
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( syslogOutputFormat );
+                PwmUtil.unhandledSwitchStatement( syslogOutputFormat );
                 throw new IllegalStateException();
                 throw new IllegalStateException();
         }
         }
     }
     }

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

@@ -22,6 +22,7 @@ package password.pwm.svc.httpclient;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmConstants;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
@@ -156,7 +157,7 @@ public class HttpClientService extends AbstractPwmService implements PwmService
     @Override
     @Override
     public ServiceInfoBean serviceInfo()
     public ServiceInfoBean serviceInfo()
     {
     {
-        final Map<String, String> debugMap = new HashMap<>( stats.debugStats() );
+        final Map<String, String> debugMap = new HashMap<>( stats.debugStats( PwmConstants.DEFAULT_LOCALE ) );
         debugMap.put( "issuedClients", Integer.toString( issuedClients.size() ) );
         debugMap.put( "issuedClients", Integer.toString( issuedClients.size() ) );
         debugMap.put( "openClients", Long.toString( openClients() ) );
         debugMap.put( "openClients", Long.toString( openClients() ) );
         return ServiceInfoBean.builder()
         return ServiceInfoBean.builder()

+ 2 - 2
server/src/main/java/password/pwm/svc/httpclient/HttpTrustManagerHelper.java

@@ -25,7 +25,7 @@ import password.pwm.AppProperty;
 import password.pwm.config.AppConfig;
 import password.pwm.config.AppConfig;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.secure.CertificateReadingTrustManager;
 import password.pwm.util.secure.CertificateReadingTrustManager;
 import password.pwm.util.secure.PromiscuousTrustManager;
 import password.pwm.util.secure.PromiscuousTrustManager;
 import password.pwm.util.secure.PwmHashAlgorithm;
 import password.pwm.util.secure.PwmHashAlgorithm;
@@ -109,7 +109,7 @@ class HttpTrustManagerHelper
             }
             }
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( trustManagerType );
+                PwmUtil.unhandledSwitchStatement( trustManagerType );
 
 
         }
         }
 
 

+ 2 - 2
server/src/main/java/password/pwm/svc/intruder/IntruderDomainService.java

@@ -52,7 +52,7 @@ import password.pwm.svc.stats.StatisticsClient;
 import password.pwm.util.DataStore;
 import password.pwm.util.DataStore;
 import password.pwm.util.DataStoreFactory;
 import password.pwm.util.DataStoreFactory;
 import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.i18n.LocaleHelper;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
@@ -239,7 +239,7 @@ public class IntruderDomainService extends AbstractPwmService implements PwmServ
                     throw new PwmUnrecoverableException( PwmError.ERROR_INTRUDER_USER );
                     throw new PwmUnrecoverableException( PwmError.ERROR_INTRUDER_USER );
 
 
                 default:
                 default:
-                    MiscUtil.unhandledSwitchStatement( recordType );
+                    PwmUtil.unhandledSwitchStatement( recordType );
             }
             }
         }
         }
     }
     }

+ 2 - 2
server/src/main/java/password/pwm/svc/intruder/IntruderSettings.java

@@ -26,7 +26,7 @@ import password.pwm.AppProperty;
 import password.pwm.config.DomainConfig;
 import password.pwm.config.DomainConfig;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.option.IntruderStorageMethod;
 import password.pwm.config.option.IntruderStorageMethod;
-import password.pwm.util.java.JavaHelper;
+import password.pwm.util.java.EnumUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.secure.PwmHashAlgorithm;
 import password.pwm.util.secure.PwmHashAlgorithm;
 
 
@@ -45,7 +45,7 @@ public class IntruderSettings
 
 
     public static IntruderSettings fromConfiguration( final DomainConfig config )
     public static IntruderSettings fromConfiguration( final DomainConfig config )
     {
     {
-        final PwmHashAlgorithm storageHashAlgorithm = JavaHelper.readEnumFromString( PwmHashAlgorithm.class, config.readAppProperty( AppProperty.INTRUDER_STORAGE_HASH_ALGORITHM ) )
+        final PwmHashAlgorithm storageHashAlgorithm = EnumUtil.readEnumFromString( PwmHashAlgorithm.class, config.readAppProperty( AppProperty.INTRUDER_STORAGE_HASH_ALGORITHM ) )
                 .orElse( PwmHashAlgorithm.SHA256 );
                 .orElse( PwmHashAlgorithm.SHA256 );
 
 
         return IntruderSettings.builder()
         return IntruderSettings.builder()

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

@@ -22,6 +22,7 @@ package password.pwm.svc.intruder;
 
 
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
+import password.pwm.PwmConstants;
 import password.pwm.PwmDomain;
 import password.pwm.PwmDomain;
 import password.pwm.bean.DomainID;
 import password.pwm.bean.DomainID;
 import password.pwm.config.AppConfig;
 import password.pwm.config.AppConfig;
@@ -93,7 +94,7 @@ public class IntruderSystemService extends AbstractPwmService implements PwmServ
     public ServiceInfoBean serviceInfo()
     public ServiceInfoBean serviceInfo()
     {
     {
         return ServiceInfoBean.builder()
         return ServiceInfoBean.builder()
-                .debugProperties( recordStore.getStats().debugStats() )
+                .debugProperties( recordStore.getStats().debugStats( PwmConstants.DEFAULT_LOCALE ) )
                 .storageMethod( dataStorageMethod )
                 .storageMethod( dataStorageMethod )
                 .build();
                 .build();
     }
     }

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

@@ -34,7 +34,7 @@ import password.pwm.health.HealthMessage;
 import password.pwm.health.HealthRecord;
 import password.pwm.health.HealthRecord;
 import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.json.JsonFactory;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
@@ -89,7 +89,7 @@ public class NodeService extends AbstractPwmService implements PwmService
 
 
                     default:
                     default:
                         LOGGER.debug( () -> "no suitable storage method configured " );
                         LOGGER.debug( () -> "no suitable storage method configured " );
-                        MiscUtil.unhandledSwitchStatement( dataStore );
+                        PwmUtil.unhandledSwitchStatement( dataStore );
                         return STATUS.CLOSED;
                         return STATUS.CLOSED;
 
 
                 }
                 }

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

@@ -46,7 +46,7 @@ import password.pwm.http.PwmRequest;
 import password.pwm.ldap.LdapOperationsHelper;
 import password.pwm.ldap.LdapOperationsHelper;
 import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.AbstractPwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
-import password.pwm.util.java.MiscUtil;
+import password.pwm.util.java.PwmUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
@@ -201,7 +201,7 @@ public class OtpService extends AbstractPwmService implements PwmService
                 break;
                 break;
 
 
             default:
             default:
-                MiscUtil.unhandledSwitchStatement( settings.getOtpType() );
+                PwmUtil.unhandledSwitchStatement( settings.getOtpType() );
         }
         }
 
 
         final List<String> rawRecoveryCodes;
         final List<String> rawRecoveryCodes;

Some files were not shown because too many files changed in this diff