From e91e5ddfda4e350c23b3e3f79b4a3bc8efc24855 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 4 Jul 2022 22:17:37 +0200 Subject: [PATCH] Use pattern match on instanceof Java 17 gives us a nice way to prevent duplicate casts, use it to simplify our code. Change-Id: I5e8e0dd110bacc04affba9348c448b2ffcc7ead2 Signed-off-by: Robert Varga --- .../org/opendaylight/aaa/encrypt/PKIUtil.java | 17 +++++---- .../filters/AuthenticationTokenUtils.java | 6 ++-- .../aaa/shiro/realm/KeystoneAuthRealm.java | 14 +++----- .../MDSALDynamicAuthorizationFilter.java | 6 ++-- .../aaa/shiro/realm/MoonRealm.java | 8 ++--- .../aaa/shiro/realm/TokenAuthRealm.java | 4 +-- .../MDSALDynamicAuthorizationFilterTest.java | 8 ++--- .../auth/AuthenticationBuilder.java | 28 ++++++--------- .../aaa/tokenauthrealm/auth/ClaimBuilder.java | 36 ++++++++----------- .../auth/PasswordCredentialBuilder.java | 22 +++++------- .../aaa/web/osgi/WhiteboardWebServer.java | 8 ++--- 11 files changed, 66 insertions(+), 91 deletions(-) diff --git a/aaa-encrypt-service/api/src/main/java/org/opendaylight/aaa/encrypt/PKIUtil.java b/aaa-encrypt-service/api/src/main/java/org/opendaylight/aaa/encrypt/PKIUtil.java index acbf6bef4..128a84d9c 100644 --- a/aaa-encrypt-service/api/src/main/java/org/opendaylight/aaa/encrypt/PKIUtil.java +++ b/aaa-encrypt-service/api/src/main/java/org/opendaylight/aaa/encrypt/PKIUtil.java @@ -186,8 +186,8 @@ public class PKIUtil { public String encodePublicKey(final PublicKey publicKey) throws IOException { ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); - if (publicKey instanceof RSAPublicKey && publicKey.getAlgorithm().equals(KEY_FACTORY_TYPE_RSA)) { - RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; + if (publicKey instanceof RSAPublicKey rsaPublicKey + && rsaPublicKey.getAlgorithm().equals(KEY_FACTORY_TYPE_RSA)) { DataOutputStream dataOutputStream = new DataOutputStream(byteOs); dataOutputStream.writeInt(KEY_TYPE_RSA.getBytes(StandardCharsets.UTF_8).length); dataOutputStream.write(KEY_TYPE_RSA.getBytes(StandardCharsets.UTF_8)); @@ -195,8 +195,8 @@ public class PKIUtil { dataOutputStream.write(rsaPublicKey.getPublicExponent().toByteArray()); dataOutputStream.writeInt(rsaPublicKey.getModulus().toByteArray().length); dataOutputStream.write(rsaPublicKey.getModulus().toByteArray()); - } else if (publicKey instanceof DSAPublicKey && publicKey.getAlgorithm().equals(KEY_FACTORY_TYPE_DSA)) { - DSAPublicKey dsaPublicKey = (DSAPublicKey) publicKey; + } else if (publicKey instanceof DSAPublicKey dsaPublicKey + && dsaPublicKey.getAlgorithm().equals(KEY_FACTORY_TYPE_DSA)) { DSAParams dsaParams = dsaPublicKey.getParams(); DataOutputStream dataOutputStream = new DataOutputStream(byteOs); dataOutputStream.writeInt(KEY_TYPE_DSA.getBytes(StandardCharsets.UTF_8).length); @@ -209,8 +209,8 @@ public class PKIUtil { dataOutputStream.write(dsaParams.getG().toByteArray()); dataOutputStream.writeInt(dsaPublicKey.getY().toByteArray().length); dataOutputStream.write(dsaPublicKey.getY().toByteArray()); - } else if (publicKey instanceof BCECPublicKey && publicKey.getAlgorithm().equals(KEY_FACTORY_TYPE_ECDSA)) { - BCECPublicKey ecPublicKey = (BCECPublicKey) publicKey; + } else if (publicKey instanceof BCECPublicKey ecPublicKey + && ecPublicKey.getAlgorithm().equals(KEY_FACTORY_TYPE_ECDSA)) { DataOutputStream dataOutputStream = new DataOutputStream(byteOs); dataOutputStream.writeInt(KEY_TYPE_ECDSA.getBytes(StandardCharsets.UTF_8).length); dataOutputStream.write(KEY_TYPE_ECDSA.getBytes(StandardCharsets.UTF_8)); @@ -248,9 +248,8 @@ public class PKIUtil { Object privateKey = keyReader.readObject(); KeyPair keyPair; - if (privateKey instanceof PEMEncryptedKeyPair) { - PEMKeyPair decryptedKeyPair = ((PEMEncryptedKeyPair) privateKey).decryptKeyPair(decryptionProv); - keyPair = converter.getKeyPair(decryptedKeyPair); + if (privateKey instanceof PEMEncryptedKeyPair pemPrivateKey) { + keyPair = converter.getKeyPair(pemPrivateKey.decryptKeyPair(decryptionProv)); } else { keyPair = converter.getKeyPair((PEMKeyPair) privateKey); } diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/filters/AuthenticationTokenUtils.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/filters/AuthenticationTokenUtils.java index fedabde5b..ae0b43a6f 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/filters/AuthenticationTokenUtils.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/filters/AuthenticationTokenUtils.java @@ -58,8 +58,7 @@ public final class AuthenticationTokenUtils { * @return the username, DEFAULT_USERNAME or DEFAULT_TOKEN depending on input */ public static String extractUsername(final AuthenticationToken token) { - if (isUsernamePasswordToken(token)) { - final UsernamePasswordToken upt = (UsernamePasswordToken) token; + if (token instanceof UsernamePasswordToken upt) { return extractField(upt.getUsername(), DEFAULT_USERNAME); } return DEFAULT_TOKEN; @@ -76,8 +75,7 @@ public final class AuthenticationTokenUtils { * @return the hostname, or DEFAULT_USERNAME depending on input */ public static String extractHostname(final AuthenticationToken token) { - if (isUsernamePasswordToken(token)) { - final UsernamePasswordToken upt = (UsernamePasswordToken) token; + if (token instanceof UsernamePasswordToken upt) { return extractField(upt.getHost(), DEFAULT_HOSTNAME); } return DEFAULT_HOSTNAME; diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/KeystoneAuthRealm.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/KeystoneAuthRealm.java index 7de57278a..604b5ca9e 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/KeystoneAuthRealm.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/KeystoneAuthRealm.java @@ -119,8 +119,8 @@ public class KeystoneAuthRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(final PrincipalCollection principalCollection) { final var primaryPrincipal = getAvailablePrincipal(principalCollection); - if (primaryPrincipal instanceof ODLPrincipal) { - return new SimpleAuthorizationInfo(((ODLPrincipal) primaryPrincipal).getRoles()); + if (primaryPrincipal instanceof ODLPrincipal odlPrincipal) { + return new SimpleAuthorizationInfo(odlPrincipal.getRoles()); } LOG.error("Unsupported principal {}", primaryPrincipal); @@ -151,26 +151,22 @@ public class KeystoneAuthRealm extends AuthorizingRealm { protected AuthenticationInfo doGetAuthenticationInfo( final AuthenticationToken authenticationToken, final SimpleHttpClient client) { - - final URI theServerUri = getServerUri(); - final String theDefaultDomain = getDefaultDomain(); - - if (!(authenticationToken instanceof UsernamePasswordToken)) { + if (!(authenticationToken instanceof UsernamePasswordToken usernamePasswordToken)) { LOG.error("Only basic authentication is supported"); throw new AuthenticationException(FATAL_ERROR_BASIC_AUTH_ONLY); } + final URI theServerUri = getServerUri(); if (theServerUri == null) { LOG.error("Invalid URL to Keystone server"); throw new AuthenticationException(FATAL_ERROR_INVALID_URL); } - final UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken; final String qualifiedUser = usernamePasswordToken.getUsername(); final String password = new String(usernamePasswordToken.getPassword()); final String[] qualifiedUserArray = qualifiedUser.split(USERNAME_DOMAIN_SEPARATOR, 2); final String username = qualifiedUserArray.length > 0 ? qualifiedUserArray[0] : qualifiedUser; - final String domain = qualifiedUserArray.length > 1 ? qualifiedUserArray[1] : theDefaultDomain; + final String domain = qualifiedUserArray.length > 1 ? qualifiedUserArray[1] : getDefaultDomain(); final KeystoneAuth keystoneAuth = new KeystoneAuth(username, password, domain); final SimpleHttpRequest httpRequest = client.requestBuilder(KeystoneToken.class) diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilter.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilter.java index 4f6656e2e..38c6ee8bc 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilter.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilter.java @@ -7,7 +7,6 @@ */ package org.opendaylight.aaa.shiro.realm; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; @@ -106,10 +105,11 @@ public class MDSALDynamicAuthorizationFilter extends AuthorizationFilter @Override public boolean isAccessAllowed(final ServletRequest request, final ServletResponse response, final Object mappedValue) { - checkArgument(request instanceof HttpServletRequest, "Expected HttpServletRequest, received {}", request); + if (!(request instanceof HttpServletRequest httpServletRequest)) { + throw new IllegalArgumentException("Expected HttpServletRequest, received " + request); + } final Subject subject = getSubject(request, response); - final HttpServletRequest httpServletRequest = (HttpServletRequest)request; final String requestURI = httpServletRequest.getRequestURI(); LOG.debug("isAccessAllowed for user={} to requestURI={}", subject, requestURI); diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MoonRealm.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MoonRealm.java index 4bd67c318..6814feeec 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MoonRealm.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/MoonRealm.java @@ -67,17 +67,17 @@ public class MoonRealm extends AuthorizingRealm { protected AuthenticationInfo doGetAuthenticationInfo(final AuthenticationToken authenticationToken) throws AuthenticationException { final var principal = authenticationToken.getPrincipal(); - if (!(principal instanceof String)) { + if (!(principal instanceof String stringPrincipal)) { throw new AuthenticationException("Non-string principal " + principal); } - if (!(authenticationToken instanceof UsernamePasswordToken)) { + if (!(authenticationToken instanceof UsernamePasswordToken userPassToken)) { throw new AuthenticationException("Token is not UsernamePasswordToken: " + authenticationToken); } - final var password = new String(((UsernamePasswordToken) authenticationToken).getPassword()); + final var password = new String(userPassToken.getPassword()); // FIXME: make the domain name configurable - final var moonPrincipal = moonAuthenticate((String) principal, password, MOON_DEFAULT_DOMAIN); + final var moonPrincipal = moonAuthenticate(stringPrincipal, password, MOON_DEFAULT_DOMAIN); return moonPrincipal == null ? null : new SimpleAuthenticationInfo(moonPrincipal, password.toCharArray(), getName()); } diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java index bb8048dd9..18733487c 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java @@ -90,8 +90,8 @@ public class TokenAuthRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(final PrincipalCollection principalCollection) { final var primaryPrincipal = principalCollection.getPrimaryPrincipal(); - if (primaryPrincipal instanceof ODLPrincipal) { - return new SimpleAuthorizationInfo(((ODLPrincipal) primaryPrincipal).getRoles()); + if (primaryPrincipal instanceof ODLPrincipal odlPrincipal) { + return new SimpleAuthorizationInfo(odlPrincipal.getRoles()); } LOG.error("Could not decode authorization request: {} is not a known principal type", primaryPrincipal); diff --git a/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilterTest.java b/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilterTest.java index c662fa08c..852326bf7 100644 --- a/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilterTest.java +++ b/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/MDSALDynamicAuthorizationFilterTest.java @@ -43,11 +43,11 @@ public class MDSALDynamicAuthorizationFilterTest { private static DataBroker mockDataBroker(final Object readData) { final ReadTransaction readOnlyTransaction = mock(ReadTransaction.class); - if (readData instanceof DataObject) { - doReturn(immediateFluentFuture(Optional.of((DataObject)readData))) + if (readData instanceof DataObject dataObject) { + doReturn(immediateFluentFuture(Optional.of(dataObject))) .when(readOnlyTransaction).read(any(), any()); - } else if (readData instanceof Exception) { - doReturn(immediateFailedFluentFuture((Exception)readData)).when(readOnlyTransaction).read(any(), any()); + } else if (readData instanceof Exception cause) { + doReturn(immediateFailedFluentFuture(cause)).when(readOnlyTransaction).read(any(), any()); } else { doReturn(immediateFluentFuture(Optional.empty())).when(readOnlyTransaction).read(any(), any()); } diff --git a/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/AuthenticationBuilder.java b/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/AuthenticationBuilder.java index dee4f1b05..069a8e08a 100644 --- a/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/AuthenticationBuilder.java +++ b/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/AuthenticationBuilder.java @@ -26,11 +26,11 @@ public class AuthenticationBuilder { private long expiration = 0L; private final Claim claim; - public AuthenticationBuilder(Claim claim) { + public AuthenticationBuilder(final Claim claim) { this.claim = claim; } - public AuthenticationBuilder setExpiration(long expiration) { + public AuthenticationBuilder setExpiration(final long expiration) { this.expiration = expiration; return this; } @@ -45,7 +45,7 @@ public class AuthenticationBuilder { long expiration = 0L; Claim claim; - private ImmutableAuthentication(AuthenticationBuilder base) { + private ImmutableAuthentication(final AuthenticationBuilder base) { if (base.claim == null) { throw new IllegalStateException("The Claim is null."); } @@ -88,20 +88,14 @@ public class AuthenticationBuilder { } @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (!(object instanceof Authentication)) { - return false; - } - Authentication authentication = (Authentication) object; - return expiration == authentication.expiration() - && Objects.equals(claim.roles(), authentication.roles()) - && Objects.equals(claim.domain(), authentication.domain()) - && Objects.equals(claim.userId(), authentication.userId()) - && Objects.equals(claim.user(), authentication.user()) - && Objects.equals(claim.clientId(), authentication.clientId()); + public boolean equals(final Object obj) { + return this == obj || obj instanceof Authentication other + && expiration == other.expiration() + && Objects.equals(claim.roles(), other.roles()) + && Objects.equals(claim.domain(), other.domain()) + && Objects.equals(claim.userId(), other.userId()) + && Objects.equals(claim.user(), other.user()) + && Objects.equals(claim.clientId(), other.clientId()); } @Override diff --git a/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/ClaimBuilder.java b/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/ClaimBuilder.java index 37edb47c6..362efa8cf 100644 --- a/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/ClaimBuilder.java +++ b/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/ClaimBuilder.java @@ -31,7 +31,7 @@ public class ClaimBuilder { public ClaimBuilder() { } - public ClaimBuilder(Claim claim) { + public ClaimBuilder(final Claim claim) { clientId = claim.clientId(); userId = claim.userId(); user = claim.user(); @@ -39,34 +39,34 @@ public class ClaimBuilder { roles.addAll(claim.roles()); } - public ClaimBuilder setClientId(String clientId) { + public ClaimBuilder setClientId(final String clientId) { this.clientId = Strings.nullToEmpty(clientId).trim(); return this; } - public ClaimBuilder setUserId(String userId) { + public ClaimBuilder setUserId(final String userId) { this.userId = Strings.nullToEmpty(userId).trim(); return this; } - public ClaimBuilder setUser(String userName) { + public ClaimBuilder setUser(final String userName) { user = Strings.nullToEmpty(userName).trim(); return this; } - public ClaimBuilder setDomain(String domain) { + public ClaimBuilder setDomain(final String domain) { this.domain = Strings.nullToEmpty(domain).trim(); return this; } - public ClaimBuilder addRoles(Set theRoles) { + public ClaimBuilder addRoles(final Set theRoles) { for (String role : theRoles) { addRole(role); } return this; } - public ClaimBuilder addRole(String role) { + public ClaimBuilder addRole(final String role) { roles.add(Strings.nullToEmpty(role).trim()); return this; } @@ -84,7 +84,7 @@ public class ClaimBuilder { protected String domain; protected ImmutableSet roles; - protected ImmutableClaim(ClaimBuilder base) { + protected ImmutableClaim(final ClaimBuilder base) { clientId = base.clientId; userId = base.userId; user = base.user; @@ -123,19 +123,13 @@ public class ClaimBuilder { } @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (!(object instanceof Claim)) { - return false; - } - Claim claim = (Claim) object; - return Objects.equals(roles, claim.roles()) - && Objects.equals(domain, claim.domain()) - && Objects.equals(userId, claim.userId()) - && Objects.equals(user, claim.user()) - && Objects.equals(clientId, claim.clientId()); + public boolean equals(final Object obj) { + return this == obj || obj instanceof Claim other + && Objects.equals(roles, other.roles()) + && Objects.equals(domain, other.domain()) + && Objects.equals(userId, other.userId()) + && Objects.equals(user, other.user()) + && Objects.equals(clientId, other.clientId()); } @Override diff --git a/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/PasswordCredentialBuilder.java b/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/PasswordCredentialBuilder.java index 0d2996dc8..340a627db 100644 --- a/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/PasswordCredentialBuilder.java +++ b/aaa-tokenauthrealm/src/main/java/org/opendaylight/aaa/tokenauthrealm/auth/PasswordCredentialBuilder.java @@ -18,17 +18,17 @@ import org.opendaylight.aaa.api.PasswordCredentials; public class PasswordCredentialBuilder { private final MutablePasswordCredentials pc = new MutablePasswordCredentials(); - public PasswordCredentialBuilder setUserName(String username) { + public PasswordCredentialBuilder setUserName(final String username) { pc.username = username; return this; } - public PasswordCredentialBuilder setPassword(String password) { + public PasswordCredentialBuilder setPassword(final String password) { pc.password = password; return this; } - public PasswordCredentialBuilder setDomain(String domain) { + public PasswordCredentialBuilder setDomain(final String domain) { pc.domain = domain; return this; } @@ -59,17 +59,11 @@ public class PasswordCredentialBuilder { } @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (!(object instanceof PasswordCredentials)) { - return false; - } - PasswordCredentials passwordCredentials = (PasswordCredentials) object; - return Objects.equals(username, passwordCredentials.username()) - && Objects.equals(password, passwordCredentials.password()) - && Objects.equals(domain, passwordCredentials.domain()); + public boolean equals(final Object obj) { + return this == obj || obj instanceof PasswordCredentials other + && Objects.equals(username, other.username()) + && Objects.equals(password, other.password()) + && Objects.equals(domain, other.domain()); } @Override diff --git a/web/impl-osgi/src/main/java/org/opendaylight/aaa/web/osgi/WhiteboardWebServer.java b/web/impl-osgi/src/main/java/org/opendaylight/aaa/web/osgi/WhiteboardWebServer.java index a1b3f1626..141a6825d 100644 --- a/web/impl-osgi/src/main/java/org/opendaylight/aaa/web/osgi/WhiteboardWebServer.java +++ b/web/impl-osgi/src/main/java/org/opendaylight/aaa/web/osgi/WhiteboardWebServer.java @@ -75,10 +75,10 @@ public final class WhiteboardWebServer implements WebServer { @Override public String getBaseURL() { final var endpoint = serviceRuntime.getProperty(HttpServiceRuntimeConstants.HTTP_SERVICE_ENDPOINT); - if (endpoint instanceof String) { - return (String) endpoint; - } else if (endpoint instanceof String[]) { - return getBaseURL(Arrays.asList((String[]) endpoint)); + if (endpoint instanceof String str) { + return str; + } else if (endpoint instanceof String[] endpoints) { + return getBaseURL(Arrays.asList(endpoints)); } else if (endpoint instanceof Collection) { // Safe as per OSGi Compendium R7 section 140.15.3.1 @SuppressWarnings("unchecked") -- 2.36.6