Browse Source

Merge branch 'master' into enh-domainadmin

Jason Rivard 3 years ago
parent
commit
ab2e56968b

+ 19 - 0
server/src/main/java/password/pwm/util/json/GsonJsonAdaptors.java

@@ -37,6 +37,7 @@ import password.pwm.util.PasswordData;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.PwmDateFormat;
 import password.pwm.util.java.StringUtil;
+import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 
 import java.io.ByteArrayInputStream;
@@ -46,6 +47,7 @@ import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.text.DateFormat;
 import java.text.ParseException;
+import java.time.Duration;
 import java.time.Instant;
 import java.util.Date;
 import java.util.TimeZone;
@@ -64,6 +66,7 @@ class GsonJsonAdaptors
         gsonBuilder.registerTypeAdapter( PwmLdapVendorTypeAdaptor.class, new PwmLdapVendorTypeAdaptor() );
         gsonBuilder.registerTypeAdapter( DomainID.class, new DomainIDTypeAdaptor() );
         gsonBuilder.registerTypeAdapter( LongAdder.class, new LongAdderTypeAdaptor() );
+        gsonBuilder.registerTypeAdapter( TimeDuration.class, new TimeDurationAdaptor() );
         return gsonBuilder;
     }
 
@@ -275,4 +278,20 @@ class GsonJsonAdaptors
             return new JsonPrimitive( src.longValue() );
         }
     }
+
+    private static class TimeDurationAdaptor implements JsonSerializer<TimeDuration>, JsonDeserializer<TimeDuration>
+    {
+        @Override
+        public TimeDuration deserialize( final JsonElement json, final Type typeOfT, final JsonDeserializationContext context ) throws JsonParseException
+        {
+            final String stringValue = json.getAsString();
+            return TimeDuration.fromDuration( Duration.parse( stringValue ) );
+        }
+
+        @Override
+        public JsonElement serialize( final TimeDuration src, final Type typeOfSrc, final JsonSerializationContext context )
+        {
+            return new JsonPrimitive( src.asDuration().toString() );
+        }
+    }
 }

+ 30 - 0
server/src/main/java/password/pwm/util/json/MoshiJsonAdaptors.java

@@ -33,6 +33,7 @@ import password.pwm.util.PasswordData;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.PwmDateFormat;
 import password.pwm.util.java.StringUtil;
+import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 
 import java.io.ByteArrayInputStream;
@@ -43,6 +44,7 @@ import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.text.DateFormat;
 import java.text.ParseException;
+import java.time.Duration;
 import java.time.Instant;
 import java.util.Date;
 import java.util.Locale;
@@ -63,6 +65,7 @@ class MoshiJsonAdaptors
         moshiBuilder.add( LongAdder.class, applyFlagsToAdapter( new LongAdderTypeAdaptor(), flags ) );
         moshiBuilder.add( BigInteger.class, applyFlagsToAdapter( new BigIntegerTypeAdaptor(), flags ) );
         moshiBuilder.add( Locale.class, applyFlagsToAdapter( new LocaleTypeAdaptor(), flags ) );
+        moshiBuilder.add( TimeDuration.class, applyFlagsToAdapter( new TimeDurationAdaptor(), flags ) );
     }
 
     static <T> JsonAdapter<T> applyFlagsToAdapter( final JsonAdapter<T> adapter, final JsonProvider.Flag... flags )
@@ -375,4 +378,31 @@ class MoshiJsonAdaptors
             writer.value( value.toString() );
         }
     }
+
+    private static class TimeDurationAdaptor extends JsonAdapter<TimeDuration>
+    {
+        @Nullable
+        @Override
+        public TimeDuration fromJson( final JsonReader reader ) throws IOException
+        {
+            final String strValue = reader.nextString();
+            if ( StringUtil.isEmpty( strValue ) )
+            {
+                return null;
+            }
+            return TimeDuration.fromDuration( Duration.parse( strValue ) );
+        }
+
+        @Override
+        public void toJson( final JsonWriter writer, @Nullable final TimeDuration value ) throws IOException
+        {
+            if ( value == null )
+            {
+                writer.nullValue();
+                return;
+            }
+
+            writer.value( value.asDuration().toString() );
+        }
+    }
 }

+ 31 - 18
server/src/test/java/password/pwm/util/json/JsonProviderTest.java

@@ -36,6 +36,7 @@ import password.pwm.http.servlet.configeditor.data.NavTreeSettings;
 import password.pwm.ldap.PwmLdapVendor;
 import password.pwm.ldap.permission.UserPermissionType;
 import password.pwm.util.PasswordData;
+import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogEvent;
 import password.pwm.util.logging.PwmLogLevel;
 import password.pwm.util.secure.X509Utils;
@@ -43,7 +44,6 @@ import password.pwm.ws.server.RestResultBean;
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.math.BigDecimal;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.time.Instant;
@@ -165,23 +165,18 @@ public class JsonProviderTest
     @Test
     public void serializeNestedListMap()
     {
-        {
-            final List<Map<String, Object>> srcObject = new ArrayList<>();
-            srcObject.add( Map.of( "key1", "value1" ) );
-            final String jsonOutput = instance.serializeCollection( srcObject );
-            Assert.assertEquals( "[{\"key1\":\"value1\"}]", jsonOutput );
-        }
+        final List<Map<String, Object>> srcObject = new ArrayList<>();
+        srcObject.add( Map.of( "key1", "value1" ) );
+        final String jsonOutput = instance.serializeCollection( srcObject );
+        Assert.assertEquals( "[{\"key1\":\"value1\"}]", jsonOutput );
     }
 
     @Test
     public void deserializeNestedListMap()
     {
-        {
-
-            final String srcJson = "[{\"key1\":\"value1\"}]";
-            //final List tempObj = instance.deserializeList( srcJson, List.class );
 
-        }
+        final String srcJson = "[{\"key1\":\"value1\"}]";
+        //final List tempObj = instance.deserializeList( srcJson, List.class );
 
     }
 
@@ -268,9 +263,23 @@ public class JsonProviderTest
         Assert.assertEquals( srcList, deserializedList );
     }
 
+    @Test
+    public void typeTimeDurationJsonTest()
+    {
+        {
+            final TimeDuration timeDuration = TimeDuration.MINUTE;
+            final String json = instance.serialize( timeDuration );
+            Assert.assertEquals( "\"PT1M\"", json );
+        }
+        {
+            final String json = "\"PT1M\"";
+            final TimeDuration timeDuration = instance.deserialize( json, TimeDuration.class );
+            Assert.assertEquals( TimeDuration.MINUTE, timeDuration );
+        }
+    }
+
     public static class TestObject1 implements Serializable
     {
-        static final BigDecimal VALUE_BIG_DECIMAL1 = new BigDecimal( "3.0404040400404040404040404040404" );
         static final X509Certificate VALUE_X509_CERT1;
         static final Date VALUE_DATE1 = Date.from( Instant.parse( "2000-01-01T01:01:01Z" ) );
         static final DomainID VALUE_DOMAINID1 = DomainID.create( "acme1" );
@@ -281,6 +290,7 @@ public class JsonProviderTest
         static final String VALUE_STRING1 = "stringValue1";
         static final PwmLogEvent VALUE_LOG_EVENT1;
         static final Locale VALUE_LOCALE1 = new Locale( "jp" );
+        static final TimeDuration VALUE_TIME_DURATION1 = TimeDuration.MINUTE;
 
         private static final String DATA_CERT1 = "MIIC1TCCAb2gAwIBAgIJAMIrQtIBUHNJMA0GCSqGSIb3DQEBBQUAMBoxGDAWBgNV"
                 + "BAMTD3d3dy5leGFtcGxlLmNvbTAeFw0yMTA5MDUyMTQ2NDlaFw0zMTA5MDMyMTQ2"
@@ -352,7 +362,8 @@ public class JsonProviderTest
                     + "\"logEvent1\":" + jsonProvider.serialize( VALUE_LOG_EVENT1, PwmLogEvent.class ) + ","
                     + "\"longAdder1\":9223372036854775807" + ","
                     + "\"passwordData1\":\"super-secret-password\"" + ","
-                    + "\"string1\":\"" + VALUE_STRING1 + "\""
+                    + "\"string1\":\"" + VALUE_STRING1 + "\"" + ","
+                    + "\"timeDuration1\":\"" + VALUE_TIME_DURATION1.asDuration().toString() + "\""
                     + "}";
         }
 
@@ -369,7 +380,8 @@ public class JsonProviderTest
                     VALUE_LONG_ADDER1,
                     VALUE_PASSWORD_DATA1,
                     VALUE_STRING1,
-                    VALUE_LOG_EVENT1 );
+                    VALUE_LOG_EVENT1,
+                    VALUE_TIME_DURATION1 );
         }
 
         private final X509Certificate certificate1;
@@ -382,6 +394,7 @@ public class JsonProviderTest
         private final LongAdder longAdder1;
         private final PasswordData passwordData1;
         private final String string1;
+        private final TimeDuration timeDuration1;
 
         @SuppressWarnings( "checkstyle:ParameterNumber" )
         public TestObject1(
@@ -394,7 +407,8 @@ public class JsonProviderTest
                 final LongAdder longAdder1,
                 final PasswordData passwordData1,
                 final String string1,
-                final PwmLogEvent logEvent1
+                final PwmLogEvent logEvent1,
+                final TimeDuration timeDuration
         )
         {
             this.certificate1 = certificate1;
@@ -407,6 +421,7 @@ public class JsonProviderTest
             this.passwordData1 = passwordData1;
             this.string1 = string1;
             this.logEvent1 = logEvent1;
+            this.timeDuration1 = timeDuration;
         }
 
         public X509Certificate getCertificate1()
@@ -459,6 +474,4 @@ public class JsonProviderTest
             return locale1;
         }
     }
-
 }
-