diff --git a/src/main/java/com/ekotrope/maven/CodeArtifactTokenManager.java b/src/main/java/com/ekotrope/maven/CodeArtifactTokenManager.java new file mode 100644 index 0000000..8c39af7 --- /dev/null +++ b/src/main/java/com/ekotrope/maven/CodeArtifactTokenManager.java @@ -0,0 +1,44 @@ +package com.ekotrope.maven; + +import com.amazonaws.services.codeartifact.AWSCodeArtifact; +import com.amazonaws.services.codeartifact.AWSCodeArtifactClientBuilder; +import com.amazonaws.services.codeartifact.model.GetAuthorizationTokenRequest; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.Random; + +public class CodeArtifactTokenManager { + private static CodeArtifactTokenManager instance; + private String cachedToken = ""; + + private CodeArtifactTokenManager() { + // Private constructor to prevent instantiation from outside the class. + } + + public static synchronized CodeArtifactTokenManager getInstance() { + if (instance == null) { + instance = new CodeArtifactTokenManager(); + } + return instance; + } + + public synchronized String getToken(String domain, String owner) + { + if (cachedToken.isEmpty()) { + setUpCodeArtifactToken(domain, owner); + } + return cachedToken; + } + + private void setUpCodeArtifactToken(String domain, String owner) + { + AWSCodeArtifact codeartifact = AWSCodeArtifactClientBuilder.defaultClient(); + + cachedToken = codeartifact.getAuthorizationToken(new GetAuthorizationTokenRequest() + .withDomain(domain) + .withDomainOwner(owner) + .withDurationSeconds(Duration.of(8, ChronoUnit.HOURS).getSeconds()) + ).getAuthorizationToken(); + } +} diff --git a/src/main/java/com/ekotrope/maven/CodeArtifactWagon.java b/src/main/java/com/ekotrope/maven/CodeArtifactWagon.java index e398893..d9fbf23 100644 --- a/src/main/java/com/ekotrope/maven/CodeArtifactWagon.java +++ b/src/main/java/com/ekotrope/maven/CodeArtifactWagon.java @@ -29,6 +29,8 @@ public class CodeArtifactWagon extends HttpWagon // "/" is not an acceptable character in either the domain or repository name, and owner is strictly numeric, so it's a safe delimiter private static final Pattern URL_FORMAT = Pattern.compile("codeartifact:(?.*)/(?.*)/(?.*)"); + + @Override public void connect(Repository repository, AuthenticationInfo authenticationInfo, ProxyInfoProvider proxyInfoProvider ) throws AuthenticationException, ConnectionException { @@ -43,11 +45,13 @@ public void connect(Repository repository, AuthenticationInfo authenticationInfo String owner = urlPartsMatcher.group("owner"); String repositoryName = urlPartsMatcher.group("repositoryName"); + repository.setUrl(getCodeArtifactEndpoint(domain, owner, repositoryName)); authenticationInfo = new AuthenticationInfo(); authenticationInfo.setUserName("aws"); - authenticationInfo.setPassword(getCodeArtifactToken(domain, owner)); + authenticationInfo.setPassword(CodeArtifactTokenManager.getInstance().getToken(domain, owner)); + //System.out.println("token used: " + CodeArtifactTokenManager.getInstance().getToken(domain, owner)); } else { @@ -58,17 +62,6 @@ public void connect(Repository repository, AuthenticationInfo authenticationInfo super.connect(repository, authenticationInfo, proxyInfoProvider); } - private String getCodeArtifactToken(String domain, String owner) - { - AWSCodeArtifact codeartifact = AWSCodeArtifactClientBuilder.defaultClient(); - - return codeartifact.getAuthorizationToken(new GetAuthorizationTokenRequest() - .withDomain(domain) - .withDomainOwner(owner) - .withDurationSeconds(Duration.of(8, HOURS).getSeconds()) - ).getAuthorizationToken(); - } - private String getCodeArtifactEndpoint(String domain, String owner, String repositoryName) { AWSCodeArtifact codeartifact = AWSCodeArtifactClientBuilder.defaultClient();