From 5b34a94e9139c1b07a244530873704d6b6b6b858 Mon Sep 17 00:00:00 2001 From: jgwatkincoveo <144667762+jgwatkincoveo@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:12:50 +0000 Subject: [PATCH 1/5] Minimum required to set user agent --- .../coveo/pushapiclient/PlatformClient.java | 29 +++++++++++++---- .../pushapiclient/UpdateStreamService.java | 32 +++++++++++++++++++ .../com/coveo/pushapiclient/UserAgent.java | 10 ++++++ 3 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/coveo/pushapiclient/UserAgent.java diff --git a/src/main/java/com/coveo/pushapiclient/PlatformClient.java b/src/main/java/com/coveo/pushapiclient/PlatformClient.java index 22a2d067..07cf18c6 100644 --- a/src/main/java/com/coveo/pushapiclient/PlatformClient.java +++ b/src/main/java/com/coveo/pushapiclient/PlatformClient.java @@ -21,6 +21,7 @@ public class PlatformClient { private final String organizationId; private final ApiCore api; private final PlatformUrl platformUrl; + private UserAgent userAgent; /** * Construct a PlatformClient @@ -571,12 +572,18 @@ private String[] getAuthorizationHeader() { private String[] getContentTypeApplicationJSONHeader() { MavenXpp3Reader reader = new MavenXpp3Reader(); - String version = ""; - try { - Model model = reader.read(new FileReader("pom.xml")); - version = model.getVersion(); - } catch (Exception e) { - version = "Not-Available"; + String userAgentValue = ""; + if (userAgent != null) { + userAgentValue = userAgent.toString(); + } else { + String version = ""; + try { + Model model = reader.read(new FileReader("pom.xml")); + version = model.getVersion(); + } catch (Exception e) { + version = "Not-Available"; + } + userAgentValue = String.format("CoveoSDKJava/%s", version); } return new String[] { @@ -585,7 +592,7 @@ private String[] getContentTypeApplicationJSONHeader() { "Accept", "application/json", "User-Agent", - String.format("CoveoSDKJava/%s", version) + userAgentValue }; } @@ -600,4 +607,12 @@ private String[] getContentTypeApplicationOctetStreamHeader() { private String toJSON(HashMap hashMap) { return new Gson().toJson(hashMap, new TypeToken>() {}.getType()); } + + public UserAgent getUserAgent() { + return userAgent; + } + + public void setUserAgent(UserAgent userAgent) { + this.userAgent = userAgent; + } } diff --git a/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java b/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java index a9a58946..41f798a5 100644 --- a/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java +++ b/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java @@ -14,6 +14,21 @@ public class UpdateStreamService { private FileContainer fileContainer; + /** + * Creates a service to stream your documents to the provided source by interacting with the + * Stream API. This provides the ability to incrementally add, update, or delete documents via a + * stream. + * + *

To perform a full source rebuild, use the + * {@StreamService} + * + * @param source The source to which you want to send your documents. + * @param userAgent The user agent to use for the requests. + */ + public UpdateStreamService(StreamEnabledSource source, UserAgent userAgent) { + this(source, new BackoffOptionsBuilder().build(), userAgent); + } + /** * Creates a service to stream your documents to the provided source by interacting with the * Stream API. This provides the ability to incrementally add, update, or delete documents via a @@ -40,10 +55,27 @@ public UpdateStreamService(StreamEnabledSource source) { * @param options The configuration options for exponential backoff. */ public UpdateStreamService(StreamEnabledSource source, BackoffOptions options) { + this(source, options, null); + } + + /** + * Creates a service to stream your documents to the provided source by interacting with the + * Stream API. This provides the ability to incrementally add, update, or delete documents via a + * stream. + * + *

To perform a full source rebuild, use the + * {@StreamService} + * + * @param source The source to which you want to send your documents. + * @param options The configuration options for exponential backoff. + * @param userAgent The user agent to use for the requests. + */ + public UpdateStreamService(StreamEnabledSource source, BackoffOptions options, UserAgent userAgent) { Logger logger = LogManager.getLogger(UpdateStreamService.class); this.platformClient = new PlatformClient( source.getApiKey(), source.getOrganizationId(), source.getPlatformUrl(), options); + this.platformClient.setUserAgent(userAgent); this.updateStreamServiceInternal = new UpdateStreamServiceInternal( source, new DocumentUploadQueue(this.getUploadStrategy()), this.platformClient, logger); diff --git a/src/main/java/com/coveo/pushapiclient/UserAgent.java b/src/main/java/com/coveo/pushapiclient/UserAgent.java new file mode 100644 index 00000000..c8644586 --- /dev/null +++ b/src/main/java/com/coveo/pushapiclient/UserAgent.java @@ -0,0 +1,10 @@ +package com.coveo.pushapiclient; + +public enum UserAgent { + SAP_COMMERCE_CLOUD { + @Override + public String toString() { + return "SAP Commerce Cloud"; + } + } +} From 7e5b6452aedfe21c8146a57090d177856d1a830b Mon Sep 17 00:00:00 2001 From: jgwatkincoveo <144667762+jgwatkincoveo@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:09:00 +0000 Subject: [PATCH 2/5] Support for multiple connector versions --- .../coveo/pushapiclient/StreamService.java | 35 ++++++++++++++++++- .../com/coveo/pushapiclient/UserAgent.java | 16 +++++++-- .../pushapiclient/PlatformClientTest.java | 32 +++++++++++++++++ 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/coveo/pushapiclient/StreamService.java b/src/main/java/com/coveo/pushapiclient/StreamService.java index 525e2941..7d97fa6a 100644 --- a/src/main/java/com/coveo/pushapiclient/StreamService.java +++ b/src/main/java/com/coveo/pushapiclient/StreamService.java @@ -14,6 +14,22 @@ public class StreamService { private String streamId; private DocumentUploadQueue queue; + /** + * Creates a service to stream your documents to the provided source by interacting with the + * Stream API. + * + *

To perform full document updates or + * deletions, use the {@UpdateStreamService}, since pushing documents with the + * {@StreamService} is equivalent to triggering a full source rebuild. The {@StreamService} can + * also be used for an initial catalog upload. + * + * @param source The source to which you want to send your documents. + * @param userAgent The user agent to use for the requests. + */ + public StreamService(StreamEnabledSource source, UserAgent userAgent) { + this(source, new BackoffOptionsBuilder().build(), userAgent); + } + /** * Creates a service to stream your documents to the provided source by interacting with the * Stream API. @@ -42,6 +58,23 @@ public StreamService(StreamEnabledSource source) { * @param options The configuration options for exponential backoff. */ public StreamService(StreamEnabledSource source, BackoffOptions options) { + this(source, options, null); + } + + /** + * Creates a service to stream your documents to the provided source by interacting with the + * Stream API. + * + *

To perform full document updates or + * deletions, use the {@UpdateStreamService}, since pushing documents with the + * {@StreamService} is equivalent to triggering a full source rebuild. The {@StreamService} can + * also be used for an initial catalog upload. + * + * @param source The source to which you want to send your documents. + * @param options The configuration options for exponential backoff. + * @param userAgent The user agent to use for the requests. + */ + public StreamService(StreamEnabledSource source, BackoffOptions options, UserAgent userAgent) { String apiKey = source.getApiKey(); String organizationId = source.getOrganizationId(); PlatformUrl platformUrl = source.getPlatformUrl(); @@ -51,7 +84,7 @@ public StreamService(StreamEnabledSource source, BackoffOptions options) { this.source = source; this.queue = new DocumentUploadQueue(uploader); this.platformClient = new PlatformClient(apiKey, organizationId, platformUrl, options); - + platformClient.setUserAgent(userAgent); this.service = new StreamServiceInternal(this.source, this.queue, this.platformClient, logger); } diff --git a/src/main/java/com/coveo/pushapiclient/UserAgent.java b/src/main/java/com/coveo/pushapiclient/UserAgent.java index c8644586..44a31829 100644 --- a/src/main/java/com/coveo/pushapiclient/UserAgent.java +++ b/src/main/java/com/coveo/pushapiclient/UserAgent.java @@ -1,10 +1,22 @@ package com.coveo.pushapiclient; public enum UserAgent { - SAP_COMMERCE_CLOUD { + SAP_COMMERCE_CLOUD_V1 { @Override public String toString() { - return "SAP Commerce Cloud"; + return "SAPCommerceCloud/v1"; + } + }, + SAP_COMMERCE_CLOUD_V2 { + @Override + public String toString() { + return "SAPCommerceCloud/v2"; + } + }, + SAP_COMMERCE_CLOUD_V3 { + @Override + public String toString() { + return "SAPCommerceCloud/v3"; } } } diff --git a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java index 5571ce18..fc60a48a 100644 --- a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java +++ b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java @@ -7,6 +7,8 @@ import static org.mockito.Mockito.verify; import com.google.gson.Gson; + +import java.io.FileReader; import java.io.IOException; import java.net.http.HttpClient; import java.net.http.HttpRequest; @@ -14,6 +16,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; + +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -39,6 +45,11 @@ public void assertApplicationJsonHeader() { assertTrue(this.argument.getValue().headers().map().get("Accept").contains("application/json")); } + public void assertUserAgentHeader(String userAgentValue) { + assertTrue( + this.argument.getValue().headers().map().get("User-Agent").contains(userAgentValue)); + } + public SecurityIdentityModel securityIdentityModel() { return new SecurityIdentityModel(identityModels(), identityModel(), identityModels()); } @@ -472,4 +483,25 @@ public void testDeleteDocument() throws IOException, InterruptedException { assertApplicationJsonHeader(); assertAuthorizationHeader(); } + + @Test + public void testCorrectUserAgentHeader() throws IOException, InterruptedException { + client.setUserAgent(UserAgent.SAP_COMMERCE_CLOUD_V1); + client.createSource("the_name", SourceType.PUSH, SourceVisibility.SECURED); + verify(httpClient) + .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); + + assertUserAgentHeader(UserAgent.SAP_COMMERCE_CLOUD_V1.toString()); + } + + @Test + public void testDefaultUserAgentHeader() throws IOException, InterruptedException, XmlPullParserException { + client.createSource("the_name", SourceType.PUSH, SourceVisibility.SECURED); + verify(httpClient) + .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); + MavenXpp3Reader reader = new MavenXpp3Reader(); + Model model = reader.read(new FileReader("pom.xml")); + String version = model.getVersion(); + assertUserAgentHeader(String.format("CoveoSDKJava/%s", version)); + } } From e835900fbc124f4aad5463f3bd39e5c045a00d94 Mon Sep 17 00:00:00 2001 From: jgwatkincoveo <144667762+jgwatkincoveo@users.noreply.github.com> Date: Wed, 27 Mar 2024 09:44:06 +0000 Subject: [PATCH 3/5] Applied formatting with spotless --- .../coveo/pushapiclient/PlatformClient.java | 7 +--- .../pushapiclient/UpdateStreamService.java | 3 +- .../com/coveo/pushapiclient/UserAgent.java | 34 +++++++++---------- .../pushapiclient/PlatformClientTest.java | 12 +++---- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/coveo/pushapiclient/PlatformClient.java b/src/main/java/com/coveo/pushapiclient/PlatformClient.java index 07cf18c6..2a397d82 100644 --- a/src/main/java/com/coveo/pushapiclient/PlatformClient.java +++ b/src/main/java/com/coveo/pushapiclient/PlatformClient.java @@ -587,12 +587,7 @@ private String[] getContentTypeApplicationJSONHeader() { } return new String[] { - "Content-Type", - "application/json", - "Accept", - "application/json", - "User-Agent", - userAgentValue + "Content-Type", "application/json", "Accept", "application/json", "User-Agent", userAgentValue }; } diff --git a/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java b/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java index f8b77de1..67b497ae 100644 --- a/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java +++ b/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java @@ -70,7 +70,8 @@ public UpdateStreamService(StreamEnabledSource source, BackoffOptions options) { * @param options The configuration options for exponential backoff. * @param userAgent The user agent to use for the requests. */ - public UpdateStreamService(StreamEnabledSource source, BackoffOptions options, UserAgent userAgent) { + public UpdateStreamService( + StreamEnabledSource source, BackoffOptions options, UserAgent userAgent) { Logger logger = LogManager.getLogger(UpdateStreamService.class); this.platformClient = new PlatformClient( diff --git a/src/main/java/com/coveo/pushapiclient/UserAgent.java b/src/main/java/com/coveo/pushapiclient/UserAgent.java index 44a31829..7c46634e 100644 --- a/src/main/java/com/coveo/pushapiclient/UserAgent.java +++ b/src/main/java/com/coveo/pushapiclient/UserAgent.java @@ -1,22 +1,22 @@ package com.coveo.pushapiclient; public enum UserAgent { - SAP_COMMERCE_CLOUD_V1 { - @Override - public String toString() { - return "SAPCommerceCloud/v1"; - } - }, - SAP_COMMERCE_CLOUD_V2 { - @Override - public String toString() { - return "SAPCommerceCloud/v2"; - } - }, - SAP_COMMERCE_CLOUD_V3 { - @Override - public String toString() { - return "SAPCommerceCloud/v3"; - } + SAP_COMMERCE_CLOUD_V1 { + @Override + public String toString() { + return "SAPCommerceCloud/v1"; } + }, + SAP_COMMERCE_CLOUD_V2 { + @Override + public String toString() { + return "SAPCommerceCloud/v2"; + } + }, + SAP_COMMERCE_CLOUD_V3 { + @Override + public String toString() { + return "SAPCommerceCloud/v3"; + } + } } diff --git a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java index fc60a48a..6442bb07 100644 --- a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java +++ b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java @@ -7,7 +7,6 @@ import static org.mockito.Mockito.verify; import com.google.gson.Gson; - import java.io.FileReader; import java.io.IOException; import java.net.http.HttpClient; @@ -16,7 +15,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; - import org.apache.maven.model.Model; import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; @@ -46,8 +44,7 @@ public void assertApplicationJsonHeader() { } public void assertUserAgentHeader(String userAgentValue) { - assertTrue( - this.argument.getValue().headers().map().get("User-Agent").contains(userAgentValue)); + assertTrue(this.argument.getValue().headers().map().get("User-Agent").contains(userAgentValue)); } public SecurityIdentityModel securityIdentityModel() { @@ -489,16 +486,17 @@ public void testCorrectUserAgentHeader() throws IOException, InterruptedExceptio client.setUserAgent(UserAgent.SAP_COMMERCE_CLOUD_V1); client.createSource("the_name", SourceType.PUSH, SourceVisibility.SECURED); verify(httpClient) - .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); + .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); assertUserAgentHeader(UserAgent.SAP_COMMERCE_CLOUD_V1.toString()); } @Test - public void testDefaultUserAgentHeader() throws IOException, InterruptedException, XmlPullParserException { + public void testDefaultUserAgentHeader() + throws IOException, InterruptedException, XmlPullParserException { client.createSource("the_name", SourceType.PUSH, SourceVisibility.SECURED); verify(httpClient) - .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); + .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); MavenXpp3Reader reader = new MavenXpp3Reader(); Model model = reader.read(new FileReader("pom.xml")); String version = model.getVersion(); From ec908052cdfb9cf56a0e210f7acfdf2185abc17e Mon Sep 17 00:00:00 2001 From: jgwatkincoveo <144667762+jgwatkincoveo@users.noreply.github.com> Date: Wed, 3 Apr 2024 12:19:05 +0100 Subject: [PATCH 4/5] Changed user agent attribute from an enum to an array string --- .../coveo/pushapiclient/PlatformClient.java | 54 ++++++++++++------- .../coveo/pushapiclient/StreamService.java | 12 ++--- .../pushapiclient/UpdateStreamService.java | 12 ++--- .../com/coveo/pushapiclient/UserAgent.java | 22 -------- .../pushapiclient/PlatformClientTest.java | 35 ++++++++++-- 5 files changed, 77 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/com/coveo/pushapiclient/UserAgent.java diff --git a/src/main/java/com/coveo/pushapiclient/PlatformClient.java b/src/main/java/com/coveo/pushapiclient/PlatformClient.java index 2a397d82..1f340ac9 100644 --- a/src/main/java/com/coveo/pushapiclient/PlatformClient.java +++ b/src/main/java/com/coveo/pushapiclient/PlatformClient.java @@ -21,7 +21,7 @@ public class PlatformClient { private final String organizationId; private final ApiCore api; private final PlatformUrl platformUrl; - private UserAgent userAgent; + private String[] userAgents; /** * Construct a PlatformClient @@ -571,26 +571,34 @@ private String[] getAuthorizationHeader() { } private String[] getContentTypeApplicationJSONHeader() { - MavenXpp3Reader reader = new MavenXpp3Reader(); - String userAgentValue = ""; - if (userAgent != null) { - userAgentValue = userAgent.toString(); - } else { - String version = ""; - try { - Model model = reader.read(new FileReader("pom.xml")); - version = model.getVersion(); - } catch (Exception e) { - version = "Not-Available"; - } - userAgentValue = String.format("CoveoSDKJava/%s", version); + StringBuilder userAgentValue = new StringBuilder(); + String sdkVersion = getSdkVersion(); + userAgentValue.append(String.format("CoveoSDKJava/%s", sdkVersion)); + + if (userAgents != null && userAgents.length > 0) { + userAgentValue.append(" ").append(String.join(" ", userAgents)); } return new String[] { - "Content-Type", "application/json", "Accept", "application/json", "User-Agent", userAgentValue + "Content-Type", + "application/json", + "Accept", + "application/json", + "User-Agent", + userAgentValue.toString() }; } + private String getSdkVersion() { + MavenXpp3Reader reader = new MavenXpp3Reader(); + try { + Model model = reader.read(new FileReader("pom.xml")); + return model.getVersion(); + } catch (Exception e) { + return "Not-Available"; + } + } + private String[] getAes256Header() { return new String[] {"x-amz-server-side-encryption", "AES256"}; } @@ -603,11 +611,19 @@ private String toJSON(HashMap hashMap) { return new Gson().toJson(hashMap, new TypeToken>() {}.getType()); } - public UserAgent getUserAgent() { - return userAgent; + public String[] getUserAgents() { + return userAgents; + } + + public void setUserAgents(String[] userAgents) { + if (!validUserAgents(userAgents)) { + throw new IllegalArgumentException("Invalid user agents"); + } + this.userAgents = userAgents; } - public void setUserAgent(UserAgent userAgent) { - this.userAgent = userAgent; + protected boolean validUserAgents(String[] userAgents) { + String pattern = "^.+/v(\\d+\\.?)+$"; + return Arrays.stream(userAgents).allMatch(agent -> agent.matches(pattern)); } } diff --git a/src/main/java/com/coveo/pushapiclient/StreamService.java b/src/main/java/com/coveo/pushapiclient/StreamService.java index 7d97fa6a..eda7bcb3 100644 --- a/src/main/java/com/coveo/pushapiclient/StreamService.java +++ b/src/main/java/com/coveo/pushapiclient/StreamService.java @@ -24,10 +24,10 @@ public class StreamService { * also be used for an initial catalog upload. * * @param source The source to which you want to send your documents. - * @param userAgent The user agent to use for the requests. + * @param userAgents The user agent to use for the requests. */ - public StreamService(StreamEnabledSource source, UserAgent userAgent) { - this(source, new BackoffOptionsBuilder().build(), userAgent); + public StreamService(StreamEnabledSource source, String[] userAgents) { + this(source, new BackoffOptionsBuilder().build(), userAgents); } /** @@ -72,9 +72,9 @@ public StreamService(StreamEnabledSource source, BackoffOptions options) { * * @param source The source to which you want to send your documents. * @param options The configuration options for exponential backoff. - * @param userAgent The user agent to use for the requests. + * @param userAgents The user agent to use for the requests. */ - public StreamService(StreamEnabledSource source, BackoffOptions options, UserAgent userAgent) { + public StreamService(StreamEnabledSource source, BackoffOptions options, String[] userAgents) { String apiKey = source.getApiKey(); String organizationId = source.getOrganizationId(); PlatformUrl platformUrl = source.getPlatformUrl(); @@ -84,7 +84,7 @@ public StreamService(StreamEnabledSource source, BackoffOptions options, UserAge this.source = source; this.queue = new DocumentUploadQueue(uploader); this.platformClient = new PlatformClient(apiKey, organizationId, platformUrl, options); - platformClient.setUserAgent(userAgent); + platformClient.setUserAgents(userAgents); this.service = new StreamServiceInternal(this.source, this.queue, this.platformClient, logger); } diff --git a/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java b/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java index 67b497ae..4500d11f 100644 --- a/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java +++ b/src/main/java/com/coveo/pushapiclient/UpdateStreamService.java @@ -23,10 +23,10 @@ public class UpdateStreamService { * {@StreamService} * * @param source The source to which you want to send your documents. - * @param userAgent The user agent to use for the requests. + * @param userAgents The user agent to use for the requests. */ - public UpdateStreamService(StreamEnabledSource source, UserAgent userAgent) { - this(source, new BackoffOptionsBuilder().build(), userAgent); + public UpdateStreamService(StreamEnabledSource source, String[] userAgents) { + this(source, new BackoffOptionsBuilder().build(), userAgents); } /** @@ -68,15 +68,15 @@ public UpdateStreamService(StreamEnabledSource source, BackoffOptions options) { * * @param source The source to which you want to send your documents. * @param options The configuration options for exponential backoff. - * @param userAgent The user agent to use for the requests. + * @param userAgents The user agent to use for the requests. */ public UpdateStreamService( - StreamEnabledSource source, BackoffOptions options, UserAgent userAgent) { + StreamEnabledSource source, BackoffOptions options, String[] userAgents) { Logger logger = LogManager.getLogger(UpdateStreamService.class); this.platformClient = new PlatformClient( source.getApiKey(), source.getOrganizationId(), source.getPlatformUrl(), options); - this.platformClient.setUserAgent(userAgent); + this.platformClient.setUserAgents(userAgents); this.updateStreamServiceInternal = new UpdateStreamServiceInternal( source, diff --git a/src/main/java/com/coveo/pushapiclient/UserAgent.java b/src/main/java/com/coveo/pushapiclient/UserAgent.java deleted file mode 100644 index 7c46634e..00000000 --- a/src/main/java/com/coveo/pushapiclient/UserAgent.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coveo.pushapiclient; - -public enum UserAgent { - SAP_COMMERCE_CLOUD_V1 { - @Override - public String toString() { - return "SAPCommerceCloud/v1"; - } - }, - SAP_COMMERCE_CLOUD_V2 { - @Override - public String toString() { - return "SAPCommerceCloud/v2"; - } - }, - SAP_COMMERCE_CLOUD_V3 { - @Override - public String toString() { - return "SAPCommerceCloud/v3"; - } - } -} diff --git a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java index 6442bb07..197fd47f 100644 --- a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java +++ b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java @@ -482,13 +482,23 @@ public void testDeleteDocument() throws IOException, InterruptedException { } @Test - public void testCorrectUserAgentHeader() throws IOException, InterruptedException { - client.setUserAgent(UserAgent.SAP_COMMERCE_CLOUD_V1); + public void testCorrectUserAgentHeader() + throws IOException, InterruptedException, XmlPullParserException { + String[] userAgents = { + "SAPCommerceCloud/v1", "SAPCommerceCloud/v2.1", "SAPCommerceCloud/v3.1.1" + }; + String version = getVersionFromPom(); + String defaultAgent = String.format("CoveoSDKJava/%s", version); + String[] userAgentsWithDefault = new String[userAgents.length + 1]; + userAgentsWithDefault[0] = defaultAgent; + System.arraycopy(userAgents, 0, userAgentsWithDefault, 1, userAgents.length); + + client.setUserAgents(userAgents); client.createSource("the_name", SourceType.PUSH, SourceVisibility.SECURED); verify(httpClient) .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); - assertUserAgentHeader(UserAgent.SAP_COMMERCE_CLOUD_V1.toString()); + assertUserAgentHeader(String.join(" ", userAgentsWithDefault)); } @Test @@ -497,9 +507,24 @@ public void testDefaultUserAgentHeader() client.createSource("the_name", SourceType.PUSH, SourceVisibility.SECURED); verify(httpClient) .send(argument.capture(), any(HttpResponse.BodyHandlers.ofString().getClass())); + String version = getVersionFromPom(); + assertUserAgentHeader(String.format("CoveoSDKJava/%s", version)); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidHeaderValue() { + String[] userAgents = { + "SAPCommerceCloud/v1", + "SAPCommerceCloud/v2.1", + "SAPCommerceCloud/v3.1.1", + "invalidHeaderValue" + }; + client.setUserAgents(userAgents); + } + + private String getVersionFromPom() throws IOException, XmlPullParserException { MavenXpp3Reader reader = new MavenXpp3Reader(); Model model = reader.read(new FileReader("pom.xml")); - String version = model.getVersion(); - assertUserAgentHeader(String.format("CoveoSDKJava/%s", version)); + return model.getVersion(); } } From 440e5baca7c5e0897d408f21f122c7835424c7c7 Mon Sep 17 00:00:00 2001 From: jgwatkincoveo <144667762+jgwatkincoveo@users.noreply.github.com> Date: Fri, 5 Apr 2024 10:04:01 +0100 Subject: [PATCH 5/5] Improved regex --- .../com/coveo/pushapiclient/PlatformClient.java | 2 +- .../coveo/pushapiclient/PlatformClientTest.java | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/coveo/pushapiclient/PlatformClient.java b/src/main/java/com/coveo/pushapiclient/PlatformClient.java index 1f340ac9..8523a5d5 100644 --- a/src/main/java/com/coveo/pushapiclient/PlatformClient.java +++ b/src/main/java/com/coveo/pushapiclient/PlatformClient.java @@ -623,7 +623,7 @@ public void setUserAgents(String[] userAgents) { } protected boolean validUserAgents(String[] userAgents) { - String pattern = "^.+/v(\\d+\\.?)+$"; + String pattern = "^.+/v(\\d+(\\.\\d+){0,2})$"; return Arrays.stream(userAgents).allMatch(agent -> agent.matches(pattern)); } } diff --git a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java index 197fd47f..0d774e0e 100644 --- a/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java +++ b/src/test/java/com/coveo/pushapiclient/PlatformClientTest.java @@ -484,9 +484,7 @@ public void testDeleteDocument() throws IOException, InterruptedException { @Test public void testCorrectUserAgentHeader() throws IOException, InterruptedException, XmlPullParserException { - String[] userAgents = { - "SAPCommerceCloud/v1", "SAPCommerceCloud/v2.1", "SAPCommerceCloud/v3.1.1" - }; + String[] userAgents = {"MyAgent/v1", "MyAgent/v2.1", "MyAgent/v3.1.1"}; String version = getVersionFromPom(); String defaultAgent = String.format("CoveoSDKJava/%s", version); String[] userAgentsWithDefault = new String[userAgents.length + 1]; @@ -513,12 +511,13 @@ public void testDefaultUserAgentHeader() @Test(expected = IllegalArgumentException.class) public void testInvalidHeaderValue() { - String[] userAgents = { - "SAPCommerceCloud/v1", - "SAPCommerceCloud/v2.1", - "SAPCommerceCloud/v3.1.1", - "invalidHeaderValue" - }; + String[] userAgents = {"MyAgent/v1", "MyAgent/v2.1", "MyAgent/v3.1.1", "invalidHeaderValue"}; + client.setUserAgents(userAgents); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidSemanticVersionHeaderValue() { + String[] userAgents = {"MyAgent/v1.1.1.1"}; client.setUserAgents(userAgents); }