From 0aa92e7f8fb0b8bbbdcdd04435d505f144ccd9c0 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 13:52:58 -0700 Subject: [PATCH 01/15] chore: add docs examples for PreviewStorageClient --- .github/workflows/ci.yml | 9 ++ .github/workflows/on-push-to-main-branch.yml | 9 ++ examples/cache-with-aws/build.gradle.kts | 2 +- examples/cache/build.gradle.kts | 2 +- examples/lambda/docker/build.gradle.kts | 4 +- examples/settings.gradle.kts | 1 + examples/storage/README.template.md | 75 ++++++++++ examples/storage/build.gradle.kts | 60 ++++++++ .../example/doc_examples/CheatSheet.java | 16 ++ .../doc_examples/DocExamplesJavaAPIs.java | 141 ++++++++++++++++++ examples/token/build.gradle.kts | 2 +- examples/topic/build.gradle.kts | 2 +- 12 files changed, 317 insertions(+), 6 deletions(-) create mode 100644 examples/storage/README.template.md create mode 100644 examples/storage/build.gradle.kts create mode 100644 examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java create mode 100644 examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6d5805a..49f2ad0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,15 @@ jobs: sdk_language: Java dev_docs_slug: java + - name: Verify Storage examples README generation + uses: momentohq/standards-and-practices/github-actions/oss-readme-template@gh-actions-v2 + with: + project_status: official + project_stability: beta + project_type: other + template_file: ./examples/storage/README.template.md + output_file: ./examples/storage/README.md + - name: Commitlint and Other Shared Build Steps uses: momentohq/standards-and-practices/github-actions/shared-build@gh-actions-v1 env: diff --git a/.github/workflows/on-push-to-main-branch.yml b/.github/workflows/on-push-to-main-branch.yml index 23b8bf92..78a919db 100644 --- a/.github/workflows/on-push-to-main-branch.yml +++ b/.github/workflows/on-push-to-main-branch.yml @@ -21,3 +21,12 @@ jobs: project_type: sdk sdk_language: Java dev_docs_slug: java + + - name: Verify Storage examples README generation + uses: momentohq/standards-and-practices/github-actions/generate-and-commit-oss-readme@gh-actions-v2 + with: + project_status: official + project_stability: beta + project_type: other + template_file: ./examples/storage/README.template.md + output_file: ./examples/storage/README.md diff --git a/examples/cache-with-aws/build.gradle.kts b/examples/cache-with-aws/build.gradle.kts index fc817ceb..87f9af59 100644 --- a/examples/cache-with-aws/build.gradle.kts +++ b/examples/cache-with-aws/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("software.momento.java:sdk:1.11.0") + implementation("software.momento.java:sdk:1.14.1") // For examples to store secrets in AWS Secrets Manager implementation("software.amazon.awssdk:secretsmanager:2.20.93") diff --git a/examples/cache/build.gradle.kts b/examples/cache/build.gradle.kts index 05042d76..26eb05b4 100644 --- a/examples/cache/build.gradle.kts +++ b/examples/cache/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("software.momento.java:sdk:1.11.0") + implementation("software.momento.java:sdk:1.14.1") implementation("com.google.guava:guava:31.1-android") diff --git a/examples/lambda/docker/build.gradle.kts b/examples/lambda/docker/build.gradle.kts index 7b55b052..6a7a7553 100644 --- a/examples/lambda/docker/build.gradle.kts +++ b/examples/lambda/docker/build.gradle.kts @@ -12,7 +12,7 @@ repositories { dependencies { implementation("com.amazonaws:aws-lambda-java-core:1.2.1") - implementation("software.momento.java:sdk:1.11.0") + implementation("software.momento.java:sdk:1.14.1") } tasks.jar { @@ -25,4 +25,4 @@ tasks.shadowJar { archiveBaseName.set("docker") archiveClassifier.set("all") mergeServiceFiles() -} \ No newline at end of file +} diff --git a/examples/settings.gradle.kts b/examples/settings.gradle.kts index 803eadb1..35d139af 100644 --- a/examples/settings.gradle.kts +++ b/examples/settings.gradle.kts @@ -25,3 +25,4 @@ include("cache-with-aws") include("lambda:docker") include("token") include("topic") +include("storage") diff --git a/examples/storage/README.template.md b/examples/storage/README.template.md new file mode 100644 index 00000000..6441210e --- /dev/null +++ b/examples/storage/README.template.md @@ -0,0 +1,75 @@ +# Java Client SDK + +
+ +## Running the Examples + +- You do not need gradle to be installed +- JDK 14 or above is required to run the example +- To get started with Momento you will need a Momento API key. You can get one from the + [Momento Console](https://console.gomomento.com). + +### Basic +```bash +MOMENTO_API_KEY= ./gradlew basic +``` + +Example Code: [BasicExample.java](cache/src/main/java/momento/client/example/BasicExample.java) + + +### List +```bash +MOMENTO_API_KEY= ./gradlew list +``` + +Example Code: [ListExample.java](cache/src/main/java/momento/client/example/ListExample.java) + +### Set +```bash +MOMENTO_API_KEY= ./gradlew set +``` + +Example Code: [SetExample.java](cache/src/main/java/momento/client/example/SetExample.java) + +### Dictionary +```bash +MOMENTO_API_KEY= ./gradlew dictionary +``` + +Example Code: [DictionaryExample.java](cache/src/main/java/momento/client/example/DictionaryExample.java) + +### Sorted Set +```bash +MOMENTO_API_KEY= ./gradlew sortedSet +``` + +Example Code: [SortedSetExample.java](cache/src/main/java/momento/client/example/SortedSetExample.java) + +### Batch Util +```bash +MOMENTO_API_KEY= ./gradlew sortedSet +``` + +Example Code: [SortedSetExample.java](cache/src/main/java/momento/client/example/SortedSetExample.java) + + +### With a Backing Database +```bash +MOMENTO_API_KEY= ./gradlew withDatabase +``` + +Example Code: [WithDatabaseExample.java](cache/src/main/java/momento/client/example/advanced/WithDatabaseExample.java) + +## Using the Java SDK in your project + +### Gradle Configuration + +Update your Gradle build to include the components + +**build.gradle.kts** + +```kotlin +dependencies { + implementation("software.momento.java:sdk:0.24.0") +} +``` diff --git a/examples/storage/build.gradle.kts b/examples/storage/build.gradle.kts new file mode 100644 index 00000000..4392fde1 --- /dev/null +++ b/examples/storage/build.gradle.kts @@ -0,0 +1,60 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java library project to get you started. + * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle + * User Manual available at https://docs.gradle.org/7.2/userguide/building_java_projects.html + */ + +plugins { + application + id("com.diffplug.spotless") version "5.15.1" +} + +repositories { + // Use Maven Central for resolving dependencies. + mavenCentral() +} + +dependencies { + implementation("software.momento.java:sdk:1.14.1") + + implementation("com.google.guava:guava:31.1-android") + + // Logging framework to log and enable logging in the Momento client. + implementation("ch.qos.logback:logback-classic:1.4.7") + + // Use JUnit Jupiter for testing. + testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") +} + +spotless { + java { + removeUnusedImports() + googleJavaFormat("1.11.0") + } +} + +tasks.test { + // Use JUnit Platform for unit tests. + useJUnitPlatform() +} + +task("docExamples", JavaExec::class) { + description = "Validate that the API doc examples run" + classpath = sourceSets.main.get().runtimeClasspath + mainClass.set("momento.client.example.doc_examples.DocExamplesJavaAPIs") +} + +task("docCheatSheet", JavaExec::class) { + description = "Validate that the doc cheat sheet runs" + classpath = sourceSets.main.get().runtimeClasspath + mainClass.set("momento.client.example.doc_examples.CheatSheet") +} + +task("docsTasks") { + dependsOn("docExamples") + dependsOn("docCheatSheet") +} + +task("prepareKotlinBuildScriptModel") {} diff --git a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java new file mode 100644 index 00000000..5e6c978d --- /dev/null +++ b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java @@ -0,0 +1,16 @@ +package momento.client.example.doc_examples; + +import momento.sdk.PreviewStorageClient; +import momento.sdk.auth.CredentialProvider; +import momento.sdk.config.StorageConfigurations; + +public class CheatSheet { + public static void main(String[] args) { + try (final var storageClient = + new PreviewStorageClient( + CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), + StorageConfigurations.Laptop.latest())) { + // ... + } + } +} diff --git a/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java b/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java new file mode 100644 index 00000000..9497e26a --- /dev/null +++ b/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java @@ -0,0 +1,141 @@ +package momento.client.example.doc_examples; + +import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; +import momento.sdk.PreviewStorageClient; +import momento.sdk.auth.CredentialProvider; +import momento.sdk.config.StorageConfigurations; +import momento.sdk.exceptions.StoreAlreadyExistsException; +import momento.sdk.responses.storage.*; + + +public class DocExamplesJavaAPIs { + + @SuppressWarnings("EmptyTryBlock") + public static void example_API_Storage_InstantiateClient() { + try (PreviewStorageClient storageClient = + new PreviewStorageClient( + CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), + StorageConfigurations.Laptop.latest())) { + // ... + } + } + + public static void example_API_Storage_CreateStore(PreviewStorageClient storageClient) { + final CreateStoreResponse response = storageClient.createStore("test-store").join(); + if (response instanceof CreateStoreResponse.Success) { + System.out.println("Store 'test-store' created"); + } else if (response instanceof CreateStoreResponse.Error error) { + if (error.getCause() instanceof StoreAlreadyExistsException) { + System.out.println("Store 'test-store' already exists"); + } else { + throw new RuntimeException( + "An error occurred while attempting to create store 'test-store': " + + error.getErrorCode(), + error); + } + } + } + + public static void example_API_Storage_DeleteStore(PreviewStorageClient storageClient) { + final DeleteStoreResponse response = storageClient.deleteStore("test-store").join(); + if (response instanceof DeleteStoreResponse.Success) { + System.out.println("Store 'test-store' deleted"); + } else if (response instanceof DeleteStoreResponse.Error error) { + throw new RuntimeException( + "An error occurred while attempting to delete store 'test-store': " + + error.getErrorCode(), + error); + } + } + + public static void example_API_Storage_ListStores(PreviewStorageClient storageClient) { + final ListStoresResponse response = storageClient.listStores().join(); + if (response instanceof ListStoresResponse.Success success) { + final String stores = + success.getStores().stream().map(StoreInfo::getName).collect(Collectors.joining("\n")); + System.out.println("Stores:\n" + stores); + } else if (response instanceof ListStoresResponse.Error error) { + throw new RuntimeException( + "An error occurred while attempting to list stores: " + error.getErrorCode(), error); + } + } + + public static void example_API_Storage_Put(PreviewStorageClient storageClient) { + // this example illustrates how to store a String value + final PutResponse response = storageClient.put("test-store", "test-key", "test-value").join(); + if (response instanceof PutResponse.Success) { + System.out.println("Key 'test-key' stored successfully"); + } else if (response instanceof PutResponse.Error error) { + throw new RuntimeException( + "An error occurred while attempting to store key 'test-key' in store 'test-store': " + + error.getErrorCode(), + error); + } + + // Momento Storage also supports storing values of type byte[], long, and double: + byte[] bytesValue = "test-byte-array-value".getBytes(StandardCharsets.UTF_8); + storageClient.put("test-store", "test-byte-array-key", bytesValue).join(); + storageClient.put("test-store", "test-integer-key", 42L).join(); + storageClient.put("test-store", "test-double-key", 42.0).join(); + } + + public static void example_API_Storage_Get(PreviewStorageClient storageClient) { + final GetResponse response = storageClient.get("test-store", "test-key").join(); + + // simplified style to access the value, if you're confident the value exists and you know the type. + // The optionals in this chain will throw exceptions when you call `.get()` if the item did not + // exist in the store, or is another type besides a String + final String value = response.valueWhenFound().get().getString().get(); + + // Or, you can use pattern-matching for more production-safe code: + if (response instanceof GetResponse.Found found) { + // if you know the value is a String: + String stringValue = found.value().getString().orElseThrow(() -> new RuntimeException("Value was not a String!")); + // if you don't know the type of the value: + switch (found.value().getType()) { + case STRING -> System.out.println("String value: " + found.value().getString().get()); + case BYTE_ARRAY -> System.out.println("Byte array value: " + found.value().getByteArray().get()); + case LONG -> System.out.println("Long value: " + found.value().getLong().get()); + case DOUBLE -> System.out.println("Double value: " + found.value().getDouble().get()); + } + } else if (response instanceof GetResponse.NotFound) { + System.out.println("Key 'test-key' was not found in store 'test-store'"); + } else if (response instanceof GetResponse.Error error) { + throw new RuntimeException( + "An error occurred while attempting to get key 'test-key' from store 'test-store': " + + error.getErrorCode(), + error); + } + } + + public static void example_API_Storage_Delete(PreviewStorageClient storageClient) { + final DeleteResponse response = storageClient.delete("test-store", "test-key").join(); + if (response instanceof DeleteResponse.Success) { + System.out.println("Key 'test-key' deleted successfully"); + } else if (response instanceof DeleteResponse.Error error) { + throw new RuntimeException( + "An error occurred while attempting to delete key 'test-key' from store 'test-store': " + + error.getErrorCode(), + error); + } + } + + public static void main(String[] args) { + example_API_Storage_InstantiateClient(); + try (final PreviewStorageClient storageClient = + new PreviewStorageClient( + CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), + StorageConfigurations.Laptop.latest())) { + + example_API_Storage_CreateStore(storageClient); + example_API_Storage_DeleteStore(storageClient); + example_API_Storage_CreateStore(storageClient); + example_API_Storage_ListStores(storageClient); + + example_API_Storage_Put(storageClient); + example_API_Storage_Get(storageClient); + example_API_Storage_Delete(storageClient); + } + } +} diff --git a/examples/token/build.gradle.kts b/examples/token/build.gradle.kts index 9e62f61d..4d7404a5 100644 --- a/examples/token/build.gradle.kts +++ b/examples/token/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("software.momento.java:sdk:1.11.0") + implementation("software.momento.java:sdk:1.14.1") implementation("com.google.guava:guava:31.1-android") diff --git a/examples/topic/build.gradle.kts b/examples/topic/build.gradle.kts index 21706ea1..2cd05c71 100644 --- a/examples/topic/build.gradle.kts +++ b/examples/topic/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("software.momento.java:sdk:1.11.0") + implementation("software.momento.java:sdk:1.14.1") implementation("com.google.guava:guava:31.1-android") From 42799291b7169b3c6bc074483042699cb6fedce7 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 15:48:10 -0700 Subject: [PATCH 02/15] fix: example readme linting and cleanups --- .github/workflows/ci.yml | 9 ++ .github/workflows/on-push-to-main-branch.yml | 9 ++ examples/README.md | 10 -- examples/README.template.md | 14 +++ examples/storage/README.template.md | 55 ++------- examples/storage/build.gradle.kts | 6 + .../momento/client/example/BasicExample.java | 110 ++++++++++++++++++ 7 files changed, 155 insertions(+), 58 deletions(-) delete mode 100644 examples/README.md create mode 100644 examples/README.template.md create mode 100644 examples/storage/src/main/java/momento/client/example/BasicExample.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49f2ad0c..0b0ede22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,15 @@ jobs: sdk_language: Java dev_docs_slug: java + - name: Verify examples README generation + uses: momentohq/standards-and-practices/github-actions/oss-readme-template@gh-actions-v2 + with: + project_status: official + project_stability: beta + project_type: other + template_file: ./examples/README.template.md + output_file: ./examples/README.md + - name: Verify Storage examples README generation uses: momentohq/standards-and-practices/github-actions/oss-readme-template@gh-actions-v2 with: diff --git a/.github/workflows/on-push-to-main-branch.yml b/.github/workflows/on-push-to-main-branch.yml index 78a919db..47980817 100644 --- a/.github/workflows/on-push-to-main-branch.yml +++ b/.github/workflows/on-push-to-main-branch.yml @@ -30,3 +30,12 @@ jobs: project_type: other template_file: ./examples/storage/README.template.md output_file: ./examples/storage/README.md + + - name: Verify examples README generation + uses: momentohq/standards-and-practices/github-actions/generate-and-commit-oss-readme@gh-actions-v2 + with: + project_status: official + project_stability: beta + project_type: other + template_file: ./examples/README.template.md + output_file: ./examples/README.md diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 3e59a09c..00000000 --- a/examples/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Java Client SDK - -## Examples - -All examples are in different subdirectories for different use-cases, and minimizes the dependencies required to run them. - -- Examples to get started with Momento: - - https://github.com/momentohq/client-sdk-java/tree/main/examples/cache -- Examples that uses Momento with one or more AWS integrations, such as AWS Secrets Manager to store your Momento auth token: - - https://github.com/momentohq/client-sdk-java/tree/main/examples/cache-with-aws \ No newline at end of file diff --git a/examples/README.template.md b/examples/README.template.md new file mode 100644 index 00000000..e731f600 --- /dev/null +++ b/examples/README.template.md @@ -0,0 +1,14 @@ +{{ ossHeader }} + +# Momento Java SDK Examples + +## Examples + +All examples are in different subdirectories for different use-cases, and minimizes the dependencies required to run them. + +- Examples to get started with Momento Cache: + - https://github.com/momentohq/client-sdk-java/tree/main/examples/cache +- Examples that uses Momento Cache with one or more AWS integrations, such as AWS Secrets Manager to store your Momento auth token: + - https://github.com/momentohq/client-sdk-java/tree/main/examples/cache-with-aws +- Examples to get started with Momento Storage: + - https://github.com/momentohq/client-sdk-java/tree/main/examples/storage \ No newline at end of file diff --git a/examples/storage/README.template.md b/examples/storage/README.template.md index 6441210e..e782bd01 100644 --- a/examples/storage/README.template.md +++ b/examples/storage/README.template.md @@ -1,6 +1,6 @@ -# Java Client SDK +{{ ossHeader }} -
+# Momento Java SDK - Storage Client Examples ## Running the Examples @@ -10,55 +10,12 @@ [Momento Console](https://console.gomomento.com). ### Basic -```bash -MOMENTO_API_KEY= ./gradlew basic -``` - -Example Code: [BasicExample.java](cache/src/main/java/momento/client/example/BasicExample.java) - - -### List -```bash -MOMENTO_API_KEY= ./gradlew list -``` - -Example Code: [ListExample.java](cache/src/main/java/momento/client/example/ListExample.java) - -### Set -```bash -MOMENTO_API_KEY= ./gradlew set -``` - -Example Code: [SetExample.java](cache/src/main/java/momento/client/example/SetExample.java) - -### Dictionary -```bash -MOMENTO_API_KEY= ./gradlew dictionary -``` - -Example Code: [DictionaryExample.java](cache/src/main/java/momento/client/example/DictionaryExample.java) - -### Sorted Set -```bash -MOMENTO_API_KEY= ./gradlew sortedSet -``` - -Example Code: [SortedSetExample.java](cache/src/main/java/momento/client/example/SortedSetExample.java) -### Batch Util ```bash -MOMENTO_API_KEY= ./gradlew sortedSet -``` - -Example Code: [SortedSetExample.java](cache/src/main/java/momento/client/example/SortedSetExample.java) - - -### With a Backing Database -```bash -MOMENTO_API_KEY= ./gradlew withDatabase +MOMENTO_API_KEY= ./gradlew basic ``` -Example Code: [WithDatabaseExample.java](cache/src/main/java/momento/client/example/advanced/WithDatabaseExample.java) +Example Code: [BasicExample.java](src/main/java/momento/client/example/BasicExample.java) ## Using the Java SDK in your project @@ -70,6 +27,8 @@ Update your Gradle build to include the components ```kotlin dependencies { - implementation("software.momento.java:sdk:0.24.0") + implementation("software.momento.java:sdk:1.x.x") } ``` + +{{ ossFooter }} diff --git a/examples/storage/build.gradle.kts b/examples/storage/build.gradle.kts index 4392fde1..1bfdb3b5 100644 --- a/examples/storage/build.gradle.kts +++ b/examples/storage/build.gradle.kts @@ -40,6 +40,12 @@ tasks.test { useJUnitPlatform() } +task("basic", JavaExec::class) { + description = "Run the basic example" + classpath = sourceSets.main.get().runtimeClasspath + mainClass.set("momento.client.example.BasicExample") +} + task("docExamples", JavaExec::class) { description = "Validate that the API doc examples run" classpath = sourceSets.main.get().runtimeClasspath diff --git a/examples/storage/src/main/java/momento/client/example/BasicExample.java b/examples/storage/src/main/java/momento/client/example/BasicExample.java new file mode 100644 index 00000000..346836eb --- /dev/null +++ b/examples/storage/src/main/java/momento/client/example/BasicExample.java @@ -0,0 +1,110 @@ +package momento.client.example; + +import momento.sdk.PreviewStorageClient; +import momento.sdk.auth.CredentialProvider; +import momento.sdk.config.StorageConfigurations; +import momento.sdk.exceptions.StoreAlreadyExistsException; +import momento.sdk.responses.storage.CreateStoreResponse; +import momento.sdk.responses.storage.GetResponse; +import momento.sdk.responses.storage.ListStoresResponse; +import momento.sdk.responses.storage.StoreInfo; + +import java.nio.charset.StandardCharsets; + +public class BasicExample { + + private static final String API_KEY_ENV_VAR = "MOMENTO_API_KEY"; + + private static final String STORE_NAME = "store"; + private static final String KEY = "key"; + private static final String VALUE = "value"; + + public static void main(String[] args) { + printStartBanner(); + + final CredentialProvider credentialProvider = CredentialProvider.fromEnvVar(API_KEY_ENV_VAR); + + try (final var client = + new PreviewStorageClient(credentialProvider, StorageConfigurations.Laptop.latest())) { + + createStore(client, STORE_NAME); + + listStores(client); + + System.out.printf("Putting key '%s', value '%s'%n", KEY, VALUE); + // store a string value + client.put(STORE_NAME, KEY, VALUE).join(); + + // you can also store values of type byte[], long, or double: + byte[] bytesValue = "value".getBytes(StandardCharsets.UTF_8); + client.put(STORE_NAME, "bytes-key", bytesValue).join(); + client.put(STORE_NAME, "long-key", 42L).join(); + client.put(STORE_NAME, "double-key", 3.14).join(); + + System.out.printf("Getting value for key '%s'%n", KEY); + + final GetResponse getResponse = client.get(STORE_NAME, KEY).join(); + + // simplified style, if you are confident the value exists and is a String: + final String value = getResponse.valueWhenFound().get().getString().get(); + + // pattern-matching style, more suitable for production code: + if (getResponse instanceof GetResponse.Found hit) { + // if you're confident it's a String: + System.out.printf("Found value for key '%s': '%s'%n", KEY, hit.value().getString().get()); + + // you're not sure of the type: + switch(hit.value().getType()) { + case BYTE_ARRAY -> { System.out.println("Got a byte array: " + hit.value().getByteArray().get()); } + case STRING -> { System.out.println("Got a string: " + hit.value().getString().get()); } + case LONG -> { System.out.println("Got a long: " + hit.value().getLong().get()); } + case DOUBLE -> { System.out.println("Got a double: " + hit.value().getDouble().get());} + } + } else if (getResponse instanceof GetResponse.NotFound) { + System.out.println("Found no value for key " + KEY); + } else if (getResponse instanceof GetResponse.Error error) { + System.out.printf( + "Unable to look up value for key '%s' with error %s\n", KEY, error.getErrorCode()); + System.out.println(error.getMessage()); + } + } + printEndBanner(); + } + + private static void createStore(PreviewStorageClient storageClient, String storeName) { + final CreateStoreResponse createResponse = storageClient.createStore(storeName).join(); + if (createResponse instanceof CreateStoreResponse.Error error) { + if (error.getCause() instanceof StoreAlreadyExistsException) { + System.out.println("Store with name '" + storeName + "' already exists."); + } else { + System.out.println("Unable to create store with error " + error.getErrorCode()); + System.out.println(error.getMessage()); + } + } + } + + private static void listStores(PreviewStorageClient storageClient) { + System.out.println("Listing caches:"); + final ListStoresResponse listResponse = storageClient.listStores().join(); + if (listResponse instanceof ListStoresResponse.Success success) { + for (StoreInfo storeInfo : success.getStores()) { + System.out.println(storeInfo.getName()); + } + } else if (listResponse instanceof ListStoresResponse.Error error) { + System.out.println("Unable to list caches with error " + error.getErrorCode()); + System.out.println(error.getMessage()); + } + } + + private static void printStartBanner() { + System.out.println("******************************************************************"); + System.out.println("Basic Example Start"); + System.out.println("******************************************************************"); + } + + private static void printEndBanner() { + System.out.println("******************************************************************"); + System.out.println("Basic Example End"); + System.out.println("******************************************************************"); + } +} From 2db90a214350d815f66842d431c5f83264c9dd62 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 15:51:15 -0700 Subject: [PATCH 03/15] fix: readme linting --- examples/README.template.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/README.template.md b/examples/README.template.md index e731f600..038621d5 100644 --- a/examples/README.template.md +++ b/examples/README.template.md @@ -6,9 +6,8 @@ All examples are in different subdirectories for different use-cases, and minimizes the dependencies required to run them. -- Examples to get started with Momento Cache: - - https://github.com/momentohq/client-sdk-java/tree/main/examples/cache -- Examples that uses Momento Cache with one or more AWS integrations, such as AWS Secrets Manager to store your Momento auth token: - - https://github.com/momentohq/client-sdk-java/tree/main/examples/cache-with-aws -- Examples to get started with Momento Storage: - - https://github.com/momentohq/client-sdk-java/tree/main/examples/storage \ No newline at end of file +- [Examples to get started with Momento Cache](https://github.com/momentohq/client-sdk-java/tree/main/examples/cache) +- [Examples that uses Momento Cache with one or more AWS integrations, such as AWS Secrets Manager to store your Momento auth token](https://github.com/momentohq/client-sdk-java/tree/main/examples/cache-with-aws) +- [Examples to get started with Momento Storage](https://github.com/momentohq/client-sdk-java/tree/main/examples/storage) + +{{ ossFooter }} From 34a8090a455261ce449f055ea366216c0400db0c Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 15:56:13 -0700 Subject: [PATCH 04/15] fix: readme linting --- examples/storage/README.template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/storage/README.template.md b/examples/storage/README.template.md index e782bd01..87db4d9d 100644 --- a/examples/storage/README.template.md +++ b/examples/storage/README.template.md @@ -23,7 +23,7 @@ Example Code: [BasicExample.java](src/main/java/momento/client/example/BasicExam Update your Gradle build to include the components -**build.gradle.kts** +#### build.gradle.kts ```kotlin dependencies { From 41f420e6a6144fff515568fba359c77b43e6a94e Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 15:59:35 -0700 Subject: [PATCH 05/15] fix: examples CI --- .../client/example/doc_examples/DocExamplesJavaAPIs.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java b/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java index 02198804..e200429f 100644 --- a/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java +++ b/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java @@ -6,6 +6,7 @@ import momento.sdk.auth.CredentialProvider; import momento.sdk.config.Configurations; import momento.sdk.exceptions.AlreadyExistsException; +import momento.sdk.exceptions.MomentoErrorCode; import momento.sdk.responses.cache.DeleteResponse; import momento.sdk.responses.cache.GetResponse; import momento.sdk.responses.cache.IncrementResponse; @@ -95,7 +96,7 @@ public static void example_API_CreateCache(CacheClient cacheClient) { if (response instanceof CacheCreateResponse.Success) { System.out.println("Cache 'test-cache' created"); } else if (response instanceof CacheCreateResponse.Error error) { - if (error.getCause() instanceof AlreadyExistsException) { + if (error.getErrorCode() == MomentoErrorCode.ALREADY_EXISTS_ERROR) { System.out.println("Cache 'test-cache' already exists"); } else { throw new RuntimeException( From 748f28450a2ed2994039ff9afba3885966e03340 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:28:09 -0700 Subject: [PATCH 06/15] fix: debugging gradle docs ci tasks --- examples/storage/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/storage/build.gradle.kts b/examples/storage/build.gradle.kts index 1bfdb3b5..72614b95 100644 --- a/examples/storage/build.gradle.kts +++ b/examples/storage/build.gradle.kts @@ -59,8 +59,8 @@ task("docCheatSheet", JavaExec::class) { } task("docsTasks") { - dependsOn("docExamples") dependsOn("docCheatSheet") + dependsOn("docExamples") } task("prepareKotlinBuildScriptModel") {} From db57306c776a0ce9c6ba21cf5ee7f0acd47a1934 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:31:54 -0700 Subject: [PATCH 07/15] fix: debugging gradle docs ci tasks --- momento-sdk/src/test/resources/logback.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/momento-sdk/src/test/resources/logback.xml b/momento-sdk/src/test/resources/logback.xml index 9fa50918..29d89338 100644 --- a/momento-sdk/src/test/resources/logback.xml +++ b/momento-sdk/src/test/resources/logback.xml @@ -11,7 +11,7 @@ - + From a110eea05cefa1a70a1a92f300aff0282397dedc Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:34:39 -0700 Subject: [PATCH 08/15] fix: debugging gradle docs ci tasks --- examples/storage/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/storage/build.gradle.kts b/examples/storage/build.gradle.kts index 72614b95..6374f4bb 100644 --- a/examples/storage/build.gradle.kts +++ b/examples/storage/build.gradle.kts @@ -24,6 +24,9 @@ dependencies { // Logging framework to log and enable logging in the Momento client. implementation("ch.qos.logback:logback-classic:1.4.7") + // Histogram for collecting stats in the load generator + implementation("org.hdrhistogram:HdrHistogram:2.1.12") + // Use JUnit Jupiter for testing. testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") } From bfbcda081b0702ff9752a8347fa5beb75ddc0b46 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:40:27 -0700 Subject: [PATCH 09/15] fix: debugging gradle docs ci tasks --- examples/storage/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/storage/build.gradle.kts b/examples/storage/build.gradle.kts index 6374f4bb..ee5c1635 100644 --- a/examples/storage/build.gradle.kts +++ b/examples/storage/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { // Logging framework to log and enable logging in the Momento client. implementation("ch.qos.logback:logback-classic:1.4.7") + implementation("org.slf4j:slf4j-api:1.7.36") // Histogram for collecting stats in the load generator implementation("org.hdrhistogram:HdrHistogram:2.1.12") From 58e0fa19232e5a161d299c11822955224aca53d1 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:46:10 -0700 Subject: [PATCH 10/15] fix: debugging gradle docs ci tasks --- .../client/example/doc_examples/CheatSheet.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java index 5e6c978d..9e814653 100644 --- a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java +++ b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java @@ -1,11 +1,24 @@ package momento.client.example.doc_examples; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil; import momento.sdk.PreviewStorageClient; import momento.sdk.auth.CredentialProvider; import momento.sdk.config.StorageConfigurations; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; public class CheatSheet { public static void main(String[] args) { + + final Logger logger = LoggerFactory.getLogger(CheatSheet.class); + LoggerContext loggerContext = ((ch.qos.logback.classic.Logger)logger).getLoggerContext(); + URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(loggerContext); + System.out.println(mainURL); + // or even + logger.info("Logback used '{}' as the configuration file.", mainURL); try (final var storageClient = new PreviewStorageClient( CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), From 11db5bd7a1c7e3c1bc0c0bdb7fd4633f947b307f Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:49:19 -0700 Subject: [PATCH 11/15] fix: debugging gradle docs ci tasks --- momento-sdk/src/test/resources/logback.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/momento-sdk/src/test/resources/logback.xml b/momento-sdk/src/test/resources/logback.xml index 29d89338..9fa50918 100644 --- a/momento-sdk/src/test/resources/logback.xml +++ b/momento-sdk/src/test/resources/logback.xml @@ -11,7 +11,7 @@ - + From a37f3d8ca873a0e7c083ad8d4b79587fe11e4208 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:51:00 -0700 Subject: [PATCH 12/15] fix: debugging gradle docs ci tasks --- .gitignore | 1 - .../storage/src/main/resources/logback.xml | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 examples/storage/src/main/resources/logback.xml diff --git a/.gitignore b/.gitignore index e00185e6..db9d3e1f 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,3 @@ examples/lib/.classpath examples/lib/.project examples/lib/bin .vscode/ -*logback.xml diff --git a/examples/storage/src/main/resources/logback.xml b/examples/storage/src/main/resources/logback.xml new file mode 100644 index 00000000..e3d3cbec --- /dev/null +++ b/examples/storage/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + +poo + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n + + + + + + + From d1924cfba0ee5aa8c4292e54d2b41a6396f6bfa7 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:56:03 -0700 Subject: [PATCH 13/15] fix: debugging gradle docs ci tasks --- examples/storage/build.gradle.kts | 6 ------ .../client/example/doc_examples/CheatSheet.java | 13 ------------- examples/storage/src/main/resources/logback.xml | 2 -- 3 files changed, 21 deletions(-) diff --git a/examples/storage/build.gradle.kts b/examples/storage/build.gradle.kts index ee5c1635..04c75e16 100644 --- a/examples/storage/build.gradle.kts +++ b/examples/storage/build.gradle.kts @@ -19,14 +19,8 @@ repositories { dependencies { implementation("software.momento.java:sdk:1.14.1") - implementation("com.google.guava:guava:31.1-android") - // Logging framework to log and enable logging in the Momento client. implementation("ch.qos.logback:logback-classic:1.4.7") - implementation("org.slf4j:slf4j-api:1.7.36") - - // Histogram for collecting stats in the load generator - implementation("org.hdrhistogram:HdrHistogram:2.1.12") // Use JUnit Jupiter for testing. testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") diff --git a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java index 9e814653..5e6c978d 100644 --- a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java +++ b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java @@ -1,24 +1,11 @@ package momento.client.example.doc_examples; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil; import momento.sdk.PreviewStorageClient; import momento.sdk.auth.CredentialProvider; import momento.sdk.config.StorageConfigurations; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.net.URL; public class CheatSheet { public static void main(String[] args) { - - final Logger logger = LoggerFactory.getLogger(CheatSheet.class); - LoggerContext loggerContext = ((ch.qos.logback.classic.Logger)logger).getLoggerContext(); - URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(loggerContext); - System.out.println(mainURL); - // or even - logger.info("Logback used '{}' as the configuration file.", mainURL); try (final var storageClient = new PreviewStorageClient( CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), diff --git a/examples/storage/src/main/resources/logback.xml b/examples/storage/src/main/resources/logback.xml index e3d3cbec..29d89338 100644 --- a/examples/storage/src/main/resources/logback.xml +++ b/examples/storage/src/main/resources/logback.xml @@ -1,8 +1,6 @@ -poo - From d4e773ea77ecadc16cb73b9d01f3436daa0322b2 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 16:56:46 -0700 Subject: [PATCH 14/15] fix: debugging gradle docs ci tasks --- .../momento/client/example/doc_examples/DocExamplesJavaAPIs.java | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java b/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java index e200429f..00e9068d 100644 --- a/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java +++ b/examples/cache/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java @@ -5,7 +5,6 @@ import momento.sdk.CacheClient; import momento.sdk.auth.CredentialProvider; import momento.sdk.config.Configurations; -import momento.sdk.exceptions.AlreadyExistsException; import momento.sdk.exceptions.MomentoErrorCode; import momento.sdk.responses.cache.DeleteResponse; import momento.sdk.responses.cache.GetResponse; From 7b97287c21bf7fee8227389e1e7667f475c07e89 Mon Sep 17 00:00:00 2001 From: Chris Price Date: Wed, 10 Jul 2024 17:00:28 -0700 Subject: [PATCH 15/15] fix: linting --- .../momento/client/example/BasicExample.java | 21 ++++--- .../example/doc_examples/CheatSheet.java | 6 +- .../doc_examples/DocExamplesJavaAPIs.java | 59 ++++++++++--------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/examples/storage/src/main/java/momento/client/example/BasicExample.java b/examples/storage/src/main/java/momento/client/example/BasicExample.java index 346836eb..b62eab18 100644 --- a/examples/storage/src/main/java/momento/client/example/BasicExample.java +++ b/examples/storage/src/main/java/momento/client/example/BasicExample.java @@ -1,5 +1,6 @@ package momento.client.example; +import java.nio.charset.StandardCharsets; import momento.sdk.PreviewStorageClient; import momento.sdk.auth.CredentialProvider; import momento.sdk.config.StorageConfigurations; @@ -9,8 +10,6 @@ import momento.sdk.responses.storage.ListStoresResponse; import momento.sdk.responses.storage.StoreInfo; -import java.nio.charset.StandardCharsets; - public class BasicExample { private static final String API_KEY_ENV_VAR = "MOMENTO_API_KEY"; @@ -54,11 +53,19 @@ public static void main(String[] args) { System.out.printf("Found value for key '%s': '%s'%n", KEY, hit.value().getString().get()); // you're not sure of the type: - switch(hit.value().getType()) { - case BYTE_ARRAY -> { System.out.println("Got a byte array: " + hit.value().getByteArray().get()); } - case STRING -> { System.out.println("Got a string: " + hit.value().getString().get()); } - case LONG -> { System.out.println("Got a long: " + hit.value().getLong().get()); } - case DOUBLE -> { System.out.println("Got a double: " + hit.value().getDouble().get());} + switch (hit.value().getType()) { + case BYTE_ARRAY -> { + System.out.println("Got a byte array: " + hit.value().getByteArray().get()); + } + case STRING -> { + System.out.println("Got a string: " + hit.value().getString().get()); + } + case LONG -> { + System.out.println("Got a long: " + hit.value().getLong().get()); + } + case DOUBLE -> { + System.out.println("Got a double: " + hit.value().getDouble().get()); + } } } else if (getResponse instanceof GetResponse.NotFound) { System.out.println("Found no value for key " + KEY); diff --git a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java index 5e6c978d..20803e66 100644 --- a/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java +++ b/examples/storage/src/main/java/momento/client/example/doc_examples/CheatSheet.java @@ -7,9 +7,9 @@ public class CheatSheet { public static void main(String[] args) { try (final var storageClient = - new PreviewStorageClient( - CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), - StorageConfigurations.Laptop.latest())) { + new PreviewStorageClient( + CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), + StorageConfigurations.Laptop.latest())) { // ... } } diff --git a/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java b/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java index 9497e26a..fdf7c6d2 100644 --- a/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java +++ b/examples/storage/src/main/java/momento/client/example/doc_examples/DocExamplesJavaAPIs.java @@ -8,15 +8,14 @@ import momento.sdk.exceptions.StoreAlreadyExistsException; import momento.sdk.responses.storage.*; - public class DocExamplesJavaAPIs { @SuppressWarnings("EmptyTryBlock") public static void example_API_Storage_InstantiateClient() { try (PreviewStorageClient storageClient = - new PreviewStorageClient( - CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), - StorageConfigurations.Laptop.latest())) { + new PreviewStorageClient( + CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), + StorageConfigurations.Laptop.latest())) { // ... } } @@ -30,9 +29,9 @@ public static void example_API_Storage_CreateStore(PreviewStorageClient storageC System.out.println("Store 'test-store' already exists"); } else { throw new RuntimeException( - "An error occurred while attempting to create store 'test-store': " - + error.getErrorCode(), - error); + "An error occurred while attempting to create store 'test-store': " + + error.getErrorCode(), + error); } } } @@ -43,9 +42,9 @@ public static void example_API_Storage_DeleteStore(PreviewStorageClient storageC System.out.println("Store 'test-store' deleted"); } else if (response instanceof DeleteStoreResponse.Error error) { throw new RuntimeException( - "An error occurred while attempting to delete store 'test-store': " - + error.getErrorCode(), - error); + "An error occurred while attempting to delete store 'test-store': " + + error.getErrorCode(), + error); } } @@ -53,11 +52,11 @@ public static void example_API_Storage_ListStores(PreviewStorageClient storageCl final ListStoresResponse response = storageClient.listStores().join(); if (response instanceof ListStoresResponse.Success success) { final String stores = - success.getStores().stream().map(StoreInfo::getName).collect(Collectors.joining("\n")); + success.getStores().stream().map(StoreInfo::getName).collect(Collectors.joining("\n")); System.out.println("Stores:\n" + stores); } else if (response instanceof ListStoresResponse.Error error) { throw new RuntimeException( - "An error occurred while attempting to list stores: " + error.getErrorCode(), error); + "An error occurred while attempting to list stores: " + error.getErrorCode(), error); } } @@ -68,9 +67,9 @@ public static void example_API_Storage_Put(PreviewStorageClient storageClient) { System.out.println("Key 'test-key' stored successfully"); } else if (response instanceof PutResponse.Error error) { throw new RuntimeException( - "An error occurred while attempting to store key 'test-key' in store 'test-store': " - + error.getErrorCode(), - error); + "An error occurred while attempting to store key 'test-key' in store 'test-store': " + + error.getErrorCode(), + error); } // Momento Storage also supports storing values of type byte[], long, and double: @@ -83,7 +82,8 @@ public static void example_API_Storage_Put(PreviewStorageClient storageClient) { public static void example_API_Storage_Get(PreviewStorageClient storageClient) { final GetResponse response = storageClient.get("test-store", "test-key").join(); - // simplified style to access the value, if you're confident the value exists and you know the type. + // simplified style to access the value, if you're confident the value exists and you know the + // type. // The optionals in this chain will throw exceptions when you call `.get()` if the item did not // exist in the store, or is another type besides a String final String value = response.valueWhenFound().get().getString().get(); @@ -91,11 +91,16 @@ public static void example_API_Storage_Get(PreviewStorageClient storageClient) { // Or, you can use pattern-matching for more production-safe code: if (response instanceof GetResponse.Found found) { // if you know the value is a String: - String stringValue = found.value().getString().orElseThrow(() -> new RuntimeException("Value was not a String!")); + String stringValue = + found + .value() + .getString() + .orElseThrow(() -> new RuntimeException("Value was not a String!")); // if you don't know the type of the value: switch (found.value().getType()) { case STRING -> System.out.println("String value: " + found.value().getString().get()); - case BYTE_ARRAY -> System.out.println("Byte array value: " + found.value().getByteArray().get()); + case BYTE_ARRAY -> System.out.println( + "Byte array value: " + found.value().getByteArray().get()); case LONG -> System.out.println("Long value: " + found.value().getLong().get()); case DOUBLE -> System.out.println("Double value: " + found.value().getDouble().get()); } @@ -103,9 +108,9 @@ public static void example_API_Storage_Get(PreviewStorageClient storageClient) { System.out.println("Key 'test-key' was not found in store 'test-store'"); } else if (response instanceof GetResponse.Error error) { throw new RuntimeException( - "An error occurred while attempting to get key 'test-key' from store 'test-store': " - + error.getErrorCode(), - error); + "An error occurred while attempting to get key 'test-key' from store 'test-store': " + + error.getErrorCode(), + error); } } @@ -115,18 +120,18 @@ public static void example_API_Storage_Delete(PreviewStorageClient storageClient System.out.println("Key 'test-key' deleted successfully"); } else if (response instanceof DeleteResponse.Error error) { throw new RuntimeException( - "An error occurred while attempting to delete key 'test-key' from store 'test-store': " - + error.getErrorCode(), - error); + "An error occurred while attempting to delete key 'test-key' from store 'test-store': " + + error.getErrorCode(), + error); } } public static void main(String[] args) { example_API_Storage_InstantiateClient(); try (final PreviewStorageClient storageClient = - new PreviewStorageClient( - CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), - StorageConfigurations.Laptop.latest())) { + new PreviewStorageClient( + CredentialProvider.fromEnvVar("MOMENTO_API_KEY"), + StorageConfigurations.Laptop.latest())) { example_API_Storage_CreateStore(storageClient); example_API_Storage_DeleteStore(storageClient);