From cccca65ea01cfc1959e036506341b5331e83fbe5 Mon Sep 17 00:00:00 2001 From: Dustin Jenkins Date: Wed, 18 Oct 2023 15:30:49 -0700 Subject: [PATCH 1/6] Implement UserMap and GroupMap output. --- cadc-gms/build.gradle | 2 +- .../org/opencadc/auth/PosixMapperClient.java | 153 +++++++++++++----- 2 files changed, 112 insertions(+), 43 deletions(-) diff --git a/cadc-gms/build.gradle b/cadc-gms/build.gradle index 47490068..4b5000b6 100644 --- a/cadc-gms/build.gradle +++ b/cadc-gms/build.gradle @@ -16,7 +16,7 @@ sourceCompatibility = 1.8 group = 'org.opencadc' -version = '1.0.8' +version = '1.0.9' description = 'OpenCADC GMS API library' def git_url = 'https://github.com/opencadc/ac' diff --git a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java index 3be6448c..2853ed03 100644 --- a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java +++ b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java @@ -71,7 +71,6 @@ import ca.nrc.cadc.auth.AuthenticationUtil; import ca.nrc.cadc.auth.HttpPrincipal; import ca.nrc.cadc.auth.PosixPrincipal; -import ca.nrc.cadc.cred.client.CredUtil; import ca.nrc.cadc.net.HttpGet; import ca.nrc.cadc.net.ResourceAlreadyExistsException; import ca.nrc.cadc.net.ResourceNotFoundException; @@ -86,10 +85,7 @@ import java.io.InputStreamReader; import java.net.URI; import java.net.URL; -import java.security.AccessControlException; import java.security.Principal; -import java.security.cert.CertificateExpiredException; -import java.security.cert.CertificateNotYetValidException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -109,7 +105,8 @@ public class PosixMapperClient { private final String service; private final Capabilities capabilities; - private final RegistryClient regClient = new RegistryClient(); + private final TSVPosixGroupParser posixGroupMarshaller = new TSVPosixGroupParser(); + private final TSVPosixPrincipalParser posixPrincipalMarshaller = new TSVPosixPrincipalParser(); public PosixMapperClient(URI resourceID) { if (resourceID == null) { @@ -117,6 +114,7 @@ public PosixMapperClient(URI resourceID) { } this.service = resourceID.toASCIIString(); try { + final RegistryClient regClient = new RegistryClient(); this.capabilities = regClient.getCapabilities(resourceID); } catch (ResourceNotFoundException | IOException ex) { throw new RuntimeException("failed to read capabilities for " + service, ex); @@ -186,23 +184,11 @@ public Subject augment(Subject subject) try (BufferedReader reader = new BufferedReader(new InputStreamReader(get.getInputStream()))) { String line = reader.readLine(); - String[] tokens = line.split("\\s"); - if (tokens.length != 3) { - throw new IllegalStateException( - String.format("error parsing query results, expected 3 values, found %s: %s", - tokens.length, line)); - } - // format - username uid gid - String username = tokens[0]; - int userID = Integer.parseInt(tokens[1]); - int groupID = Integer.parseInt(tokens[2]); + final PosixPrincipal posixPrincipal = posixPrincipalMarshaller.parse(line); Set principals = new HashSet<>(); - PosixPrincipal posixPrincipal = new PosixPrincipal(userID); - posixPrincipal.username = username; - posixPrincipal.defaultGroup = groupID; principals.add(posixPrincipal); - principals.add(new HttpPrincipal(username)); + principals.add(new HttpPrincipal(posixPrincipal.username)); for (Principal p : subject.getPrincipals()) { if (!(p instanceof HttpPrincipal) && !(p instanceof PosixPrincipal)) { principals.add(p); @@ -233,19 +219,80 @@ public List getURI(List groups) return getPosixGroups(null, groups); } - // use case: skaha needs the complete username-uid map for user containers - // change: adding defaultGroup and username to PosixPrincipal, all fields would be returned here - // note: Iterator allows the client to consume the stream and process it without having to - // store it in memory... scalable but sometimes awkward - public Iterator getUserMap() { - throw new UnsupportedOperationException(); + /** + * Obtain the full mapping of Username -> UID mapping to populate the POSIX system mappings. It is assumed + * the underlying API supports writing TSV output. + *

+ * use case: skaha needs the complete username-uid map for user containers + * change: adding defaultGroup and username to PosixPrincipal, all fields would be returned here + * note: Iterator allows the client to consume the stream and process it without having to + * store it in memory... scalable but sometimes awkward + * + * @return Iterator over POSIX principals + */ + public Iterator getUserMap() throws IOException, ResourceNotFoundException, + ResourceAlreadyExistsException, InterruptedException { + final URL userMapURL = getServiceURL(Standards.POSIX_USERMAP); + final HttpGet get = new HttpGet(userMapURL, true); + get.setRequestProperty("accept", "text/tab-separated-values"); + get.prepare(); + + return new Iterator() { + private final BufferedReader reader = new BufferedReader(new InputStreamReader(get.getInputStream())); + private String line; + + @Override + public boolean hasNext() { + try { + return reader.ready() && (line = reader.readLine()) != null; + } catch (IOException ioException) { + throw new RuntimeException(ioException.getMessage(), ioException); + } + } + + @Override + public PosixPrincipal next() { + final PosixPrincipal nextPrincipal = posixPrincipalMarshaller.parse(line); + line = null; + return nextPrincipal; + } + }; } - // use case: skaha needs the complete groupname-gid map for user containers - // note: Iterator allows the client to consume the stream and process it without having to - // store it in memory... scalable but sometimes awkward - public Iterator getGroupMap() { - throw new UnsupportedOperationException(); + /** + * Obtain the full Group Name -> GID Mapping. It is assumed the underlying API supports writing TSV output. + *

+ * use case: skaha needs the complete groupname-gid map for user containers + * note: Iterator allows the client to consume the stream and process it without having to + * store it in memory... scalable but sometimes awkward + * @return @return Iterator over POSIX Groups + */ + public Iterator getGroupMap() throws IOException, ResourceNotFoundException, + ResourceAlreadyExistsException, InterruptedException { + final URL userMapURL = getServiceURL(Standards.POSIX_GROUPMAP); + final HttpGet get = new HttpGet(userMapURL, true); + get.setRequestProperty("accept", "text/tab-separated-values"); + get.prepare(); + + return new Iterator() { + private final BufferedReader reader = new BufferedReader(new InputStreamReader(get.getInputStream())); + private String line; + @Override + public boolean hasNext() { + try { + return reader.ready() && (line = reader.readLine()) != null; + } catch (IOException ioException) { + throw new RuntimeException(ioException.getMessage(), ioException); + } + } + + @Override + public PosixGroup next() { + final PosixGroup posixGroup = posixGroupMarshaller.parse(line); + line = null; + return posixGroup; + } + }; } private List getPosixGroups(List groupURIs, List groupGIDs) @@ -276,23 +323,13 @@ private List getPosixGroups(List groupURIs, List List posixGroups = new ArrayList<>(); while (reader.ready()) { String line = reader.readLine(); - log.debug("line: " + line); - String[] tokens = line.split("\\s+"); - if (tokens.length != 2) { - throw new IllegalStateException( - String.format("error parsing query results, expected 2 values, found %s: %s", - tokens.length, line)); - } - GroupURI groupURI = new GroupURI(URI.create(tokens[0])); - Integer gid = Integer.parseInt(tokens[1]); - posixGroups.add(new PosixGroup(gid, groupURI)); + posixGroups.add(posixGroupMarshaller.parse(line)); } return posixGroups; } } - private URL getServiceURL(URI standardID) - throws IOException, ResourceNotFoundException { + private URL getServiceURL(URI standardID) { // this probably failed in ctor already if (capabilities == null) { throw new RuntimeException("BUG: capabilities not found and went undetected"); @@ -315,4 +352,36 @@ private URL getServiceURL(URI standardID) return iface.getAccessURL().getURL(); } + private static class TSVPosixGroupParser { + final PosixGroup parse(final String line) { + log.debug("line: " + line); + final String[] tokens = line.split("\\s+"); + if (tokens.length != 2) { + throw new IllegalStateException( + String.format("error parsing query results, expected 2 values, found %s: %s", + tokens.length, line)); + } + + final GroupURI groupURI = new GroupURI(URI.create(tokens[0])); + final Integer gid = Integer.parseInt(tokens[1]); + + return new PosixGroup(gid, groupURI); + } + } + + private static class TSVPosixPrincipalParser { + final PosixPrincipal parse(final String line) { + log.debug("line: " + line); + final String[] tokens = line.split("\\s+"); + if (tokens.length != 3) { + throw new IllegalStateException( + String.format("error parsing query results, expected 3 values, found %s: %s", + tokens.length, line)); + } + final PosixPrincipal posixPrincipal = new PosixPrincipal(Integer.parseInt(tokens[1])); + posixPrincipal.username = tokens[0]; + posixPrincipal.defaultGroup = Integer.parseInt(tokens[2]); + return posixPrincipal; + } + } } From dccad4d1baf0ffbfa878753bec2dafc367f1b8bd Mon Sep 17 00:00:00 2001 From: Dustin Jenkins Date: Wed, 18 Oct 2023 15:42:32 -0700 Subject: [PATCH 2/6] Hush the linter. --- .../java/org/opencadc/auth/PosixMapperClient.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java index 2853ed03..42652d4d 100644 --- a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java +++ b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java @@ -220,7 +220,7 @@ public List getURI(List groups) } /** - * Obtain the full mapping of Username -> UID mapping to populate the POSIX system mappings. It is assumed + * Obtain the full mapping of Username to UID mapping to populate the POSIX system mappings. It is assumed * the underlying API supports writing TSV output. *

* use case: skaha needs the complete username-uid map for user containers @@ -229,6 +229,10 @@ public List getURI(List groups) * store it in memory... scalable but sometimes awkward * * @return Iterator over POSIX principals + * @throws IOException Any I/O related (catch-all) errors. + * @throws ResourceNotFoundException If the UID POSIX Mapping service cannot be found. + * @throws ResourceAlreadyExistsException Not used. + * @throws InterruptedException Should not ever happen. */ public Iterator getUserMap() throws IOException, ResourceNotFoundException, ResourceAlreadyExistsException, InterruptedException { @@ -260,12 +264,16 @@ public PosixPrincipal next() { } /** - * Obtain the full Group Name -> GID Mapping. It is assumed the underlying API supports writing TSV output. + * Obtain the full Group Name to GID Mapping. It is assumed the underlying API supports writing TSV output. *

* use case: skaha needs the complete groupname-gid map for user containers * note: Iterator allows the client to consume the stream and process it without having to * store it in memory... scalable but sometimes awkward * @return @return Iterator over POSIX Groups + * @throws IOException Any I/O related (catch-all) errors. + * @throws ResourceNotFoundException If the GID POSIX Mapping service cannot be found. + * @throws ResourceAlreadyExistsException Not used. + * @throws InterruptedException Should not ever happen. */ public Iterator getGroupMap() throws IOException, ResourceNotFoundException, ResourceAlreadyExistsException, InterruptedException { From 652d4a700df6371beb0bd28c38b8bcafe4c4afd6 Mon Sep 17 00:00:00 2001 From: Dustin Jenkins Date: Thu, 19 Oct 2023 09:46:48 -0700 Subject: [PATCH 3/6] Add the accepted `preferred_username` to the "name" output for consistency. --- cadc-access-control-server/build.gradle | 2 +- .../src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java | 2 +- .../src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cadc-access-control-server/build.gradle b/cadc-access-control-server/build.gradle index c8bc364c..15df99d2 100644 --- a/cadc-access-control-server/build.gradle +++ b/cadc-access-control-server/build.gradle @@ -13,7 +13,7 @@ sourceCompatibility = 1.8 group = 'org.opencadc' -version = '1.3.33' +version = '1.3.34' description = 'OpenCADC User+Group server library' def git_url = 'https://github.com/opencadc/ac' diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java index b5d9d904..15bca1b6 100644 --- a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java +++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java @@ -81,7 +81,6 @@ import ca.nrc.cadc.auth.NumericPrincipal; import ca.nrc.cadc.auth.SignedToken; import ca.nrc.cadc.net.TransientException; -import ca.nrc.cadc.util.FileUtil; import ca.nrc.cadc.util.MultiValuedProperties; import ca.nrc.cadc.util.PropertiesReader; import ca.nrc.cadc.util.RsaSignatureGenerator; @@ -335,6 +334,7 @@ private static Map buildTokenClaimsSet(RelyParty rp, String requ if (rp.getClaims().contains(RelyParty.Claim.NAME)) { claimsMap.put(RelyParty.Claim.NAME.getValue(), useridPrincipal.getName()); + claimsMap.put(RelyParty.Claim.PREFERRED_USERNAME.getValue(), useridPrincipal.getName()); } if (rp.getClaims().contains(RelyParty.Claim.EMAIL)) { claimsMap.put(RelyParty.Claim.EMAIL.getValue(), email); diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java index 30433ec0..ada3ef81 100644 --- a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java +++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java @@ -138,6 +138,7 @@ public boolean equals(Object o) { public enum Claim { NAME("name", "Name"), + PREFERRED_USERNAME("preferred_username", "Username"), EMAIL("email", "Email Address"), GROUPS("memberOf", "Group Memberships"); From 14e00e1a6951dfedaecaf1e7174156e6c3cde6dd Mon Sep 17 00:00:00 2001 From: Dustin Jenkins Date: Mon, 23 Oct 2023 09:04:20 -0700 Subject: [PATCH 4/6] Rework for client, and undo access-control-server changes. --- cadc-access-control-server/build.gradle | 2 +- .../ca/nrc/cadc/ac/server/oidc/OIDCUtil.java | 2 +- .../ca/nrc/cadc/ac/server/oidc/RelyParty.java | 1 - cadc-gms/build.gradle | 2 +- .../org/opencadc/auth/PosixMapperClient.java | 22 ++++++++++++++----- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/cadc-access-control-server/build.gradle b/cadc-access-control-server/build.gradle index 15df99d2..c8bc364c 100644 --- a/cadc-access-control-server/build.gradle +++ b/cadc-access-control-server/build.gradle @@ -13,7 +13,7 @@ sourceCompatibility = 1.8 group = 'org.opencadc' -version = '1.3.34' +version = '1.3.33' description = 'OpenCADC User+Group server library' def git_url = 'https://github.com/opencadc/ac' diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java index 15bca1b6..b5d9d904 100644 --- a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java +++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/OIDCUtil.java @@ -81,6 +81,7 @@ import ca.nrc.cadc.auth.NumericPrincipal; import ca.nrc.cadc.auth.SignedToken; import ca.nrc.cadc.net.TransientException; +import ca.nrc.cadc.util.FileUtil; import ca.nrc.cadc.util.MultiValuedProperties; import ca.nrc.cadc.util.PropertiesReader; import ca.nrc.cadc.util.RsaSignatureGenerator; @@ -334,7 +335,6 @@ private static Map buildTokenClaimsSet(RelyParty rp, String requ if (rp.getClaims().contains(RelyParty.Claim.NAME)) { claimsMap.put(RelyParty.Claim.NAME.getValue(), useridPrincipal.getName()); - claimsMap.put(RelyParty.Claim.PREFERRED_USERNAME.getValue(), useridPrincipal.getName()); } if (rp.getClaims().contains(RelyParty.Claim.EMAIL)) { claimsMap.put(RelyParty.Claim.EMAIL.getValue(), email); diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java index ada3ef81..30433ec0 100644 --- a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java +++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/oidc/RelyParty.java @@ -138,7 +138,6 @@ public boolean equals(Object o) { public enum Claim { NAME("name", "Name"), - PREFERRED_USERNAME("preferred_username", "Username"), EMAIL("email", "Email Address"), GROUPS("memberOf", "Group Memberships"); diff --git a/cadc-gms/build.gradle b/cadc-gms/build.gradle index 4b5000b6..240a5d5b 100644 --- a/cadc-gms/build.gradle +++ b/cadc-gms/build.gradle @@ -16,7 +16,7 @@ sourceCompatibility = 1.8 group = 'org.opencadc' -version = '1.0.9' +version = '1.0.10' description = 'OpenCADC GMS API library' def git_url = 'https://github.com/opencadc/ac' diff --git a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java index 42652d4d..8de1285f 100644 --- a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java +++ b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java @@ -71,6 +71,7 @@ import ca.nrc.cadc.auth.AuthenticationUtil; import ca.nrc.cadc.auth.HttpPrincipal; import ca.nrc.cadc.auth.PosixPrincipal; +import ca.nrc.cadc.io.ResourceIterator; import ca.nrc.cadc.net.HttpGet; import ca.nrc.cadc.net.ResourceAlreadyExistsException; import ca.nrc.cadc.net.ResourceNotFoundException; @@ -88,7 +89,6 @@ import java.security.Principal; import java.util.ArrayList; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; import javax.security.auth.Subject; @@ -234,14 +234,14 @@ public List getURI(List groups) * @throws ResourceAlreadyExistsException Not used. * @throws InterruptedException Should not ever happen. */ - public Iterator getUserMap() throws IOException, ResourceNotFoundException, - ResourceAlreadyExistsException, InterruptedException { + public ResourceIterator getUserMap() throws IOException, ResourceNotFoundException, + ResourceAlreadyExistsException, InterruptedException { final URL userMapURL = getServiceURL(Standards.POSIX_USERMAP); final HttpGet get = new HttpGet(userMapURL, true); get.setRequestProperty("accept", "text/tab-separated-values"); get.prepare(); - return new Iterator() { + return new ResourceIterator() { private final BufferedReader reader = new BufferedReader(new InputStreamReader(get.getInputStream())); private String line; @@ -260,6 +260,11 @@ public PosixPrincipal next() { line = null; return nextPrincipal; } + + @Override + public void close() throws IOException { + reader.close(); + } }; } @@ -275,14 +280,14 @@ public PosixPrincipal next() { * @throws ResourceAlreadyExistsException Not used. * @throws InterruptedException Should not ever happen. */ - public Iterator getGroupMap() throws IOException, ResourceNotFoundException, + public ResourceIterator getGroupMap() throws IOException, ResourceNotFoundException, ResourceAlreadyExistsException, InterruptedException { final URL userMapURL = getServiceURL(Standards.POSIX_GROUPMAP); final HttpGet get = new HttpGet(userMapURL, true); get.setRequestProperty("accept", "text/tab-separated-values"); get.prepare(); - return new Iterator() { + return new ResourceIterator() { private final BufferedReader reader = new BufferedReader(new InputStreamReader(get.getInputStream())); private String line; @Override @@ -300,6 +305,11 @@ public PosixGroup next() { line = null; return posixGroup; } + + @Override + public void close() throws IOException { + reader.close(); + } }; } From 73df13e8e61ba3c2056eeda766ab87c98a803a09 Mon Sep 17 00:00:00 2001 From: Dustin Jenkins Date: Mon, 23 Oct 2023 09:05:28 -0700 Subject: [PATCH 5/6] Variable name correction. --- .../java/org/opencadc/auth/PosixMapperClient.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java index 8de1285f..18d255e8 100644 --- a/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java +++ b/cadc-gms/src/main/java/org/opencadc/auth/PosixMapperClient.java @@ -105,8 +105,8 @@ public class PosixMapperClient { private final String service; private final Capabilities capabilities; - private final TSVPosixGroupParser posixGroupMarshaller = new TSVPosixGroupParser(); - private final TSVPosixPrincipalParser posixPrincipalMarshaller = new TSVPosixPrincipalParser(); + private final TSVPosixGroupParser tsvPosixGroupParser = new TSVPosixGroupParser(); + private final TSVPosixPrincipalParser tsvPosixPrincipalParser = new TSVPosixPrincipalParser(); public PosixMapperClient(URI resourceID) { if (resourceID == null) { @@ -184,7 +184,7 @@ public Subject augment(Subject subject) try (BufferedReader reader = new BufferedReader(new InputStreamReader(get.getInputStream()))) { String line = reader.readLine(); - final PosixPrincipal posixPrincipal = posixPrincipalMarshaller.parse(line); + final PosixPrincipal posixPrincipal = tsvPosixPrincipalParser.parse(line); Set principals = new HashSet<>(); principals.add(posixPrincipal); @@ -256,7 +256,7 @@ public boolean hasNext() { @Override public PosixPrincipal next() { - final PosixPrincipal nextPrincipal = posixPrincipalMarshaller.parse(line); + final PosixPrincipal nextPrincipal = tsvPosixPrincipalParser.parse(line); line = null; return nextPrincipal; } @@ -301,7 +301,7 @@ public boolean hasNext() { @Override public PosixGroup next() { - final PosixGroup posixGroup = posixGroupMarshaller.parse(line); + final PosixGroup posixGroup = tsvPosixGroupParser.parse(line); line = null; return posixGroup; } @@ -341,7 +341,7 @@ private List getPosixGroups(List groupURIs, List List posixGroups = new ArrayList<>(); while (reader.ready()) { String line = reader.readLine(); - posixGroups.add(posixGroupMarshaller.parse(line)); + posixGroups.add(tsvPosixGroupParser.parse(line)); } return posixGroups; } From d3a6591b011b586aaac48ae0d928ded356bc9fcb Mon Sep 17 00:00:00 2001 From: Dustin Jenkins Date: Mon, 23 Oct 2023 09:09:14 -0700 Subject: [PATCH 6/6] Linter fixes. --- cadc-gms/src/main/java/org/opencadc/gms/GroupUtil.java | 6 +++--- .../src/main/java/org/opencadc/gms/NoOpGroupClient.java | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/cadc-gms/src/main/java/org/opencadc/gms/GroupUtil.java b/cadc-gms/src/main/java/org/opencadc/gms/GroupUtil.java index 10092ada..7ac1081f 100644 --- a/cadc-gms/src/main/java/org/opencadc/gms/GroupUtil.java +++ b/cadc-gms/src/main/java/org/opencadc/gms/GroupUtil.java @@ -87,11 +87,11 @@ public class GroupUtil { * Construct a GMS Client from the classpath or fallback to * the default, no-op implementation if a GMS Client has not * been configured. Classpath loaded implementations - * must provide a contructor that takes the service URI as + * must provide a constructor that takes the service URI as * an argument. - * + *

* @param serviceID GMS Service ID. If null, the default no-op - * implementation of GMS Client is returned. + * implementation of GMS Client is returned. * * @return A GMSClient instance. */ diff --git a/cadc-gms/src/main/java/org/opencadc/gms/NoOpGroupClient.java b/cadc-gms/src/main/java/org/opencadc/gms/NoOpGroupClient.java index a9cc9d7d..fa1b2f47 100644 --- a/cadc-gms/src/main/java/org/opencadc/gms/NoOpGroupClient.java +++ b/cadc-gms/src/main/java/org/opencadc/gms/NoOpGroupClient.java @@ -73,11 +73,10 @@ import java.util.List; /** - * * This is the default implementation of GroupClient that performs no group membership * operations. It allows libraries to use the GroupClient without requiring a * Groups or a GMS implementation. - * + *

* This client will be created by GroupClient.getGroupClient() when another implementation * is not discovered in the classpath. *