[java-support] branch master updated: JSPT-79 - Review date and time handling for Java 8

Scott Cantor cantor.2 at osu.edu
Fri Mar 8 13:36:38 EST 2019


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch master
in repository java-support.

View the commit online:
http://git.shibboleth.net/view/?p=java-support.git;a=commit;h=d7e8463a9006c22e233aa062cc938a4f3d53f064

The following commit(s) were added to refs/heads/master by this push:
       new  d7e8463   JSPT-79 - Review date and time handling for Java 8
d7e8463 is described below

commit d7e8463a9006c22e233aa062cc938a4f3d53f064
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Fri Mar 8 13:36:35 2019 -0500

    JSPT-79 - Review date and time handling for Java 8
    
    https://issues.shibboleth.net/jira/browse/JSPT-79
    
    Remediate Duration annotation use out of java-support.
---
 .../support/security/BasicKeystoreKeyStrategy.java | 25 +++++++--------
 .../java/support/security/DataSealer.java          |  6 ++--
 .../support/service/AbstractReloadableService.java | 36 ++++++++++++----------
 .../security/BasicKeystoreKeyStrategyTest.java     |  3 +-
 .../java/support/security/DataSealerTest.java      | 18 ++++++-----
 5 files changed, 48 insertions(+), 40 deletions(-)

diff --git a/src/main/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategy.java b/src/main/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategy.java
index 39b1152..d699d64 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategy.java
+++ b/src/main/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategy.java
@@ -26,6 +26,7 @@ import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
 import java.security.cert.CertificateException;
+import java.time.Duration;
 import java.util.Properties;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -34,8 +35,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.crypto.SecretKey;
 
-import net.shibboleth.utilities.java.support.annotation.Duration;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonNegative;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.collection.Pair;
@@ -92,8 +91,8 @@ public class BasicKeystoreKeyStrategy extends AbstractInitializableComponent imp
     /** Current default key loaded. */
     @NonnullAfterInit private SecretKey defaultKey;
     
-    /** Number of milliseconds between key update checks. Default value: (PT15M). */
-    @Duration @NonNegative private long updateInterval;
+    /** Time between key update checks. Default value: (PT15M). */
+    @Nonnull private Duration updateInterval;
 
     /** Timer used to schedule update tasks. */
     private Timer updateTaskTimer;
@@ -107,7 +106,7 @@ public class BasicKeystoreKeyStrategy extends AbstractInitializableComponent imp
     /** Constructor. */
     public BasicKeystoreKeyStrategy() {
         keystoreType = "JCEKS";
-        updateInterval = 15 * 60 * 1000L;
+        updateInterval = Duration.ofMinutes(15);
     }
     
     /**
@@ -202,18 +201,20 @@ public class BasicKeystoreKeyStrategy extends AbstractInitializableComponent imp
     }
 
     /**
-     * Set the number of milliseconds between key update checks. A value of 0 indicates that no updates will be
+     * Set the time between key update checks. A value of 0 indicates that no updates will be
      * performed.
      * 
      * This setting cannot be changed after the service has been initialized.
      * 
-     * @param interval number of milliseconds between key update checks
+     * @param interval time between key update checks
      */
-    @Duration public void setUpdateInterval(@Duration @NonNegative final long interval) {
+    public void setUpdateInterval(@Nonnull final Duration interval) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        
+        Constraint.isNotNull(interval, "Interval cannot be null");
+        Constraint.isFalse(interval.isNegative(), "Interval cannot be negative");
 
-        updateInterval = Constraint.isGreaterThanOrEqual(0, interval,
-                "Update interval must be greater than or equal to zero");
+        updateInterval = interval;
     }
 
     /**
@@ -249,7 +250,7 @@ public class BasicKeystoreKeyStrategy extends AbstractInitializableComponent imp
             throw new ComponentInitializationException("Exception loading the default key", e);
         }
 
-        if (updateInterval > 0) {
+        if (!updateInterval.isZero()) {
             updateTask = new TimerTask() {
                 @Override
                 public void run() {
@@ -265,7 +266,7 @@ public class BasicKeystoreKeyStrategy extends AbstractInitializableComponent imp
             } else {
                 internalTaskTimer = updateTaskTimer;
             }
-            internalTaskTimer.schedule(updateTask, updateInterval, updateInterval);
+            internalTaskTimer.schedule(updateTask, updateInterval.toMillis(), updateInterval.toMillis());
         }
     }
 
diff --git a/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java b/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java
index b9543c2..c3b88f5 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java
+++ b/src/main/java/net/shibboleth/utilities/java/support/security/DataSealer.java
@@ -27,6 +27,7 @@ import java.nio.charset.StandardCharsets;
 import java.security.GeneralSecurityException;
 import java.security.KeyException;
 import java.security.SecureRandom;
+import java.time.Instant;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 
@@ -312,7 +313,8 @@ public class DataSealer extends AbstractInitializableComponent {
      * @return the encoded blob
      * @throws DataSealerException if the wrapping operation fails
      */
-    @Nonnull public String wrap(@Nonnull @NotEmpty final String data, final long exp) throws DataSealerException {
+    @Nonnull public String wrap(@Nonnull @NotEmpty final String data, @Nonnull final Instant exp)
+            throws DataSealerException {
 
         if (data == null || data.length() == 0) {
             throw new IllegalArgumentException("Data must be supplied for the wrapping operation");
@@ -334,7 +336,7 @@ public class DataSealer extends AbstractInitializableComponent {
             final GZIPOutputStream compressedStream = new GZIPOutputStream(byteStream);
             final DataOutputStream dataStream = new DataOutputStream(compressedStream);
 
-            dataStream.writeLong(exp);
+            dataStream.writeLong(exp.toEpochMilli());
             
             int count = 0;
             int start = 0;
diff --git a/src/main/java/net/shibboleth/utilities/java/support/service/AbstractReloadableService.java b/src/main/java/net/shibboleth/utilities/java/support/service/AbstractReloadableService.java
index 8e4684f..48d28fe 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/service/AbstractReloadableService.java
+++ b/src/main/java/net/shibboleth/utilities/java/support/service/AbstractReloadableService.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.utilities.java.support.service;
 
+import java.time.Duration;
 import java.time.Instant;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -24,12 +25,12 @@ import java.util.TimerTask;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import net.shibboleth.utilities.java.support.annotation.Duration;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.component.UnmodifiableComponent;
+import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.primitive.TimerSupport;
 
 import org.slf4j.Logger;
@@ -49,8 +50,8 @@ public abstract class AbstractReloadableService<T> extends AbstractIdentifiableI
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractReloadableService.class);
 
-    /** Number of milliseconds between one reload check and another. */
-    @Duration private long reloadCheckDelay;
+    /** Time between one reload check and another. */
+    @Nonnull private Duration reloadCheckDelay;
 
     /** Timer used to schedule configuration reload tasks. */
     @Nullable private Timer reloadTaskTimer;
@@ -78,35 +79,35 @@ public abstract class AbstractReloadableService<T> extends AbstractIdentifiableI
 
     /** Constructor. */
     public AbstractReloadableService() {
-        reloadCheckDelay = 0;
+        reloadCheckDelay = Duration.ZERO;
     }
 
     /**
-     * Gets the number of milliseconds between one reload check and another. A value of 0 or less indicates that no
+     * Gets the time between one reload check and another. A value of 0 or less indicates that no
      * reloading will be performed.
      * 
      * <p>
      * Default value: 0
      * </p>
      * 
-     * @return number of milliseconds between one reload check and another
+     * @return time between one reload check and another
      */
-    @Duration public long getReloadCheckDelay() {
+    @Nonnull public Duration getReloadCheckDelay() {
         return reloadCheckDelay;
     }
 
     /**
-     * Sets the number of milliseconds between one reload check and another. A value of 0 or less indicates that no
+     * Sets the time between one reload check and another. A value of 0 or less indicates that no
      * reloading will be performed.
      * 
-     * This setting can not be changed after the service has been initialized.
+     * <p>This setting cannot be changed after the service has been initialized.</p>
      * 
      * @param delay number of milliseconds between one reload check and another
      */
-    @Duration public void setReloadCheckDelay(@Duration final long delay) {
+    public void setReloadCheckDelay(@Nonnull final Duration delay) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
-        reloadCheckDelay = delay;
+        reloadCheckDelay = Constraint.isNotNull(delay, "Delay cannot be null");
     }
 
     /**
@@ -179,25 +180,26 @@ public abstract class AbstractReloadableService<T> extends AbstractIdentifiableI
                 throw new ComponentInitializationException(getLogPrefix() + " could not perform initial load", e);
             }
             log.error("{} Initial load failed", getLogPrefix(), e);
-            if (reloadCheckDelay > 0) {
-                log.info("{} Continuing to poll configuration", getLogPrefix());
-            } else {
+            
+            if (reloadCheckDelay.isNegative() || reloadCheckDelay.isZero()) {
                 log.error("{} No further attempts will be made to reload", getLogPrefix());
+            } else {
+                log.info("{} Continuing to poll configuration", getLogPrefix());
             }
         } catch (final Exception e) {
             throw new ComponentInitializationException(getLogPrefix() + " Unexpected error during initial load", e);
         }
 
-        if (reloadCheckDelay > 0) {
+        if (!(reloadCheckDelay.isNegative() || reloadCheckDelay.isZero())) {
             if (null == reloadTaskTimer) {
                 log.debug("{} No reload task timer specified, creating default", getLogPrefix());
                 internalTaskTimer = new Timer(TimerSupport.getTimerName(this), true);
             } else {
                 internalTaskTimer = reloadTaskTimer;
             }
-            log.info("{} Reload time set to: {}, starting refresh thread", getLogPrefix(), reloadCheckDelay);
+            log.info("{} Reload interval set to: {}, starting refresh thread", getLogPrefix(), reloadCheckDelay);
             reloadTask = new ServiceReloadTask();
-            internalTaskTimer.schedule(reloadTask, reloadCheckDelay, reloadCheckDelay);
+            internalTaskTimer.schedule(reloadTask, reloadCheckDelay.toMillis(), reloadCheckDelay.toMillis());
         }
     }
 
diff --git a/src/test/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategyTest.java b/src/test/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategyTest.java
index 97e6082..2e5f6c6 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategyTest.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/security/BasicKeystoreKeyStrategyTest.java
@@ -19,6 +19,7 @@ package net.shibboleth.utilities.java.support.security;
 
 import java.io.File;
 import java.security.KeyException;
+import java.time.Duration;
 
 import net.shibboleth.utilities.java.support.resource.TestResourceConverter;
 
@@ -51,7 +52,7 @@ public class BasicKeystoreKeyStrategyTest {
         strategy.setKeystorePassword("password");
         strategy.setKeystoreResource(TestResourceConverter.of(new FileSystemResource(keystoreFile)));
         strategy.setKeyVersionResource(TestResourceConverter.of(new FileSystemResource(versionFile)));
-        strategy.setUpdateInterval(1000);
+        strategy.setUpdateInterval(Duration.ofSeconds(1));
         strategy.initialize();
         
         Assert.assertEquals(strategy.getDefaultKey().getFirst(), "secret1");
diff --git a/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java b/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java
index 22af5d3..d84f3c4 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/security/DataSealerTest.java
@@ -22,6 +22,8 @@ import net.shibboleth.utilities.java.support.component.ComponentInitializationEx
 import net.shibboleth.utilities.java.support.resource.Resource;
 import net.shibboleth.utilities.java.support.resource.TestResourceConverter;
 
+import java.time.Duration;
+import java.time.Instant;
 import java.util.Arrays;
 
 import javax.annotation.Nonnull;
@@ -45,7 +47,7 @@ public class DataSealerTest {
             + "THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA"
             + "THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA"
             + "THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA THIS IS SOME TEST DATA";
-    final private long THE_DELAY = 500;
+    final private Duration THE_DELAY = Duration.ofMillis(500);
 
     @BeforeClass public void initializeKeystoreResource() {
         ClassPathResource resource =
@@ -105,7 +107,7 @@ public class DataSealerTest {
     @Test public void encodeDecode() throws DataSealerException, ComponentInitializationException {
         final DataSealer sealer = createDataSealer();
 
-        final String encoded = sealer.wrap(THE_DATA, System.currentTimeMillis() + 50000);
+        final String encoded = sealer.wrap(THE_DATA, Instant.now().plusSeconds(50));
         final StringBuffer alias = new StringBuffer(); 
         Assert.assertEquals(sealer.unwrap(encoded, alias), THE_DATA);
         Assert.assertEquals(alias.toString(), "secret1");
@@ -116,7 +118,7 @@ public class DataSealerTest {
         final DataSealer sealer2 = createDataSealer2();
 
         final StringBuffer alias = new StringBuffer(); 
-        final String encoded = sealer.wrap(THE_DATA, System.currentTimeMillis() + 50000);
+        final String encoded = sealer.wrap(THE_DATA, Instant.now().plusSeconds(50));
         Assert.assertEquals(sealer.unwrap(encoded, alias), THE_DATA);
         Assert.assertEquals(alias.toString(), "secret1");
         alias.setLength(0);
@@ -127,8 +129,8 @@ public class DataSealerTest {
     @Test public void timeOut() throws DataSealerException, InterruptedException, ComponentInitializationException {
         final DataSealer sealer = createDataSealer();
 
-        String encoded = sealer.wrap(THE_DATA, System.currentTimeMillis() + THE_DELAY);
-        Thread.sleep(THE_DELAY + 1);
+        String encoded = sealer.wrap(THE_DATA, Instant.now().plus(THE_DELAY));
+        Thread.sleep(THE_DELAY.toMillis() + 1);
         try {
             sealer.unwrap(encoded);
             Assert.fail("Should have timed out");
@@ -143,7 +145,7 @@ public class DataSealerTest {
         char[] buffer = new char[1000000];
         Arrays.fill(buffer, 'x');
         final String longData = new String(buffer);
-        final String encoded = sealer.wrap(longData, System.currentTimeMillis() + 50000);
+        final String encoded = sealer.wrap(longData, Instant.now().plusSeconds(50));
         final StringBuffer alias = new StringBuffer(); 
         Assert.assertEquals(sealer.unwrap(encoded, alias), longData);
         Assert.assertEquals(alias.toString(), "secret1");
@@ -175,7 +177,7 @@ public class DataSealerTest {
             // OK
         }
 
-        final String wrapped = sealer.wrap(THE_DATA, 3600 * 1000);
+        final String wrapped = sealer.wrap(THE_DATA, Instant.now().plusSeconds(3600));
 
         final String corrupted = wrapped.substring(0, 25) + "A" + wrapped.substring(27);
 
@@ -187,7 +189,7 @@ public class DataSealerTest {
         }
 
         try {
-            sealer.wrap(nullValue(), 10);
+            sealer.wrap(nullValue(), Instant.ofEpochMilli(10));
             Assert.fail("no data");
         } catch (IllegalArgumentException e) {
             // OK

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list