[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