From 70a6828a81dbe9b72700eb80bd7e3030ee1edd26 Mon Sep 17 00:00:00 2001 From: vcolin7 Date: Wed, 15 Jan 2025 13:29:57 -0800 Subject: [PATCH 1/5] Remove deprecated + past EOL AOT GraalVM libraries. --- sdk/aot/azure-aot-graalvm-perf/CHANGELOG.md | 7 - sdk/aot/azure-aot-graalvm-perf/README.md | 53 - sdk/aot/azure-aot-graalvm-perf/pom.xml | 55 - .../reflect-config.json | 8 - .../reflect-config.json | 8 - .../com.azure/azure-core/reflect-config.json | 128 --- .../reflect-config.json | 8 - .../azure-data-tables/reflect-config.json | 38 - .../azure-monitor-query/reflect-config.json | 20 - .../reflect-config.json | 26 - .../reflect-config.json | 44 - .../azure-storage-blob/reflect-config.json | 116 --- .../azure-aot-graalvm-samples/CHANGELOG.md | 7 - sdk/aot/azure-aot-graalvm-samples/README.md | 52 - sdk/aot/azure-aot-graalvm-samples/pom.xml | 215 ---- .../graalvm/samples/AzureGraalVmSamples.java | 43 - .../AppConfigurationSample.java | 50 - .../aot/graalvm/samples/cosmos/Address.java | 67 -- .../aot/graalvm/samples/cosmos/Child.java | 103 -- .../graalvm/samples/cosmos/CosmosSample.java | 279 ----- .../aot/graalvm/samples/cosmos/Families.java | 144 --- .../aot/graalvm/samples/cosmos/Family.java | 137 --- .../aot/graalvm/samples/cosmos/Parent.java | 58 -- .../azure/aot/graalvm/samples/cosmos/Pet.java | 33 - .../samples/eventhubs/EventHubsSample.java | 65 -- .../formrecognizer/FormRecognizerSample.java | 143 --- .../KeyVaultCertificatesSample.java | 138 --- .../keyvault/keys/KeyVaultKeysSample.java | 45 - .../secrets/KeyVaultSecretsSample.java | 87 -- .../storage/blob/StorageBlobSample.java | 64 -- .../textanalytics/TextAnalyticsSample.java | 57 -- .../reflect-config.json | 38 - .../resource-config.json | 10 - .../src/main/resources/contoso-allinone.jpg | Bin 154512 -> 0 bytes .../CHANGELOG.md | 36 - .../azure-aot-graalvm-support-netty/README.md | 90 -- .../azure-aot-graalvm-support-netty/pom.xml | 206 ---- .../features/NettySubstitutions.java | 478 --------- .../implementation/features/package-info.java | 7 - .../src/main/java/module-info.java | 12 - .../azure-core-http-netty/jni-config.json | 968 ------------------ .../native-image.properties | 45 - .../azure-core-http-netty/reflect-config.json | 10 - ...azure-aot-graalvm-support-netty.properties | 2 - .../src/samples/README.md | 28 - .../azure-aot-graalvm-support/CHANGELOG.md | 31 - sdk/aot/azure-aot-graalvm-support/README.md | 139 --- sdk/aot/azure-aot-graalvm-support/pom.xml | 162 --- .../ClassReflectionAttributes.java | 105 -- .../implementation/GraalVMFeature.java | 77 -- .../implementation/GraalVMFeatureUtils.java | 181 ---- .../features/AppConfigFeature.java | 25 - .../features/AzureCoreFeature.java | 27 - .../features/CosmosFeature.java | 16 - .../features/EventHubsFeature.java | 16 - .../features/FormRecognizerFeature.java | 26 - .../features/IdentityFeature.java | 30 - .../features/KeyvaultCertificatesFeature.java | 26 - .../features/KeyvaultKeysFeature.java | 26 - .../features/KeyvaultSecretsFeature.java | 25 - .../features/StorageBlobFeature.java | 30 - .../features/StorageFileShareFeature.java | 28 - .../features/StorageQueueFeature.java | 28 - .../features/TextAnalyticsFeature.java | 26 - .../implementation/features/package-info.java | 7 - .../support/implementation/package-info.java | 7 - .../src/main/java/module-info.java | 7 - .../azure-core-amqp/reflect-config.json | 6 - .../azure-core/native-image.properties | 14 - .../com.azure/azure-core/reflect-config.json | 11 - .../com.azure/azure-core/resource-config.json | 10 - .../azure-cosmos/resource-config.json | 10 - .../reflect-config.json | 70 -- .../resource-config.json | 10 - .../resource-config.json | 10 - .../resource-config.json | 16 - .../resource-config.json | 13 - .../azure-storage-blob/resource-config.json | 10 - .../com.azure/native-image.properties | 4 - .../reflect-config.json | 26 - .../net.java.dev.jna/jna/jni-config.json | 955 ----------------- .../net.java.dev.jna/jna/proxy-config.json | 8 - .../net.java.dev.jna/jna/reflect-config.json | 89 -- .../net.java.dev.jna/jna/resource-config.json | 14 - .../azure-aot-graalvm-support.properties | 2 - .../src/samples/README.md | 28 - sdk/aot/ci.yml | 61 -- sdk/aot/pom.xml | 17 - 88 files changed, 6657 deletions(-) delete mode 100644 sdk/aot/azure-aot-graalvm-perf/CHANGELOG.md delete mode 100644 sdk/aot/azure-aot-graalvm-perf/README.md delete mode 100644 sdk/aot/azure-aot-graalvm-perf/pom.xml delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-formrecognizer/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-textanalytics/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-tables/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-monitor-query/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-search-documents/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-samples/CHANGELOG.md delete mode 100644 sdk/aot/azure-aot-graalvm-samples/README.md delete mode 100644 sdk/aot/azure-aot-graalvm-samples/pom.xml delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/AzureGraalVmSamples.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/appconfiguration/AppConfigurationSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Address.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Child.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/CosmosSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Families.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Family.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Parent.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Pet.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/eventhubs/EventHubsSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/formrecognizer/FormRecognizerSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/certificates/KeyVaultCertificatesSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/keys/KeyVaultKeysSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/secrets/KeyVaultSecretsSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/storage/blob/StorageBlobSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/textanalytics/TextAnalyticsSample.java delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-samples/src/main/resources/contoso-allinone.jpg delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/CHANGELOG.md delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/README.md delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/pom.xml delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/NettySubstitutions.java delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/package-info.java delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/java/module-info.java delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/jni-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/native-image.properties delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/azure-aot-graalvm-support-netty.properties delete mode 100644 sdk/aot/azure-aot-graalvm-support-netty/src/samples/README.md delete mode 100644 sdk/aot/azure-aot-graalvm-support/CHANGELOG.md delete mode 100644 sdk/aot/azure-aot-graalvm-support/README.md delete mode 100644 sdk/aot/azure-aot-graalvm-support/pom.xml delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/ClassReflectionAttributes.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeatureUtils.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AppConfigFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AzureCoreFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/CosmosFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/EventHubsFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/FormRecognizerFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/IdentityFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultCertificatesFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultKeysFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultSecretsFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageBlobFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageFileShareFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageQueueFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/TextAnalyticsFeature.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/package-info.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/package-info.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/java/module-info.java delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core-amqp/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/native-image.properties delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-cosmos/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-messaging-eventhubs/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-certificates/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-keys/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/native-image.properties delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.microsoft.azure/msal4j-persistence-extension/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/jni-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/proxy-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/reflect-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/resource-config.json delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/main/resources/azure-aot-graalvm-support.properties delete mode 100644 sdk/aot/azure-aot-graalvm-support/src/samples/README.md delete mode 100644 sdk/aot/ci.yml delete mode 100644 sdk/aot/pom.xml diff --git a/sdk/aot/azure-aot-graalvm-perf/CHANGELOG.md b/sdk/aot/azure-aot-graalvm-perf/CHANGELOG.md deleted file mode 100644 index 92fbcde772d12..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# Release History - -## 1.0.0-beta.1 (Unreleased) -Version 1.0.0-beta.1 is an early preview release of our performance testing framework related to our efforts in supporting GraalVM in the Azure SDK for Java. - -## Features Added -- Initial release. Please see the README and wiki for information on using the new library. diff --git a/sdk/aot/azure-aot-graalvm-perf/README.md b/sdk/aot/azure-aot-graalvm-perf/README.md deleted file mode 100644 index 1d246214786f6..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Azure GraalVM performance testing configuration client library for Java - -## Getting started - -### Prerequisites -- A [Java Development Kit (JDK)][jdk_link], version 8 or later. -- [Azure Subscription][azure_subscription] -- [GraalVM][graalvm] - -### Include the package - -[//]: # ({x-version-update-start;com.azure:azure-aot-graalvm-perf;current}) -```xml - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - -``` -[//]: # ({x-version-update-end}) - -## Key concepts - -## Examples - -## Troubleshooting - -## Next steps - -## Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License -Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. -For details, visit [https://cla.microsoft.com](https://cla.microsoft.com). - -When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the -PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this -once across all repos using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact -[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - - -[cla]: https://cla.microsoft.com -[coc]: https://opensource.microsoft.com/codeofconduct/ -[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ -[coc_contact]: mailto:opencode@microsoft.com -[jdk_link]: https://learn.microsoft.com/java/azure/jdk/?view=azure-java-stable -[azure_subscription]: https://azure.microsoft.com/free -[graalvm]: https://www.graalvm.org/downloads/ - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Faot%2Fazure-aot-graalvm-perf%2FREADME.png) diff --git a/sdk/aot/azure-aot-graalvm-perf/pom.xml b/sdk/aot/azure-aot-graalvm-perf/pom.xml deleted file mode 100644 index de61eb787592e..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - 4.0.0 - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - - jar - Microsoft Azure SDK for Java GraalVM performance testing framework - This package contains GraalVM configuration for running Azure SDK for Java performance tests. - - com.azure - azure-perf-test-parent - 1.0.0-beta.1 - ../../parents/azure-perf-test-parent - - https://github.com/Azure/azure-sdk-for-java - - - - The MIT License (MIT) - http://opensource.org/licenses/MIT - repo - - - - - - azure-java-build-docs - ${site.url}/site/${project.artifactId} - - - - - scm:git:https://github.com/Azure/azure-sdk-for-java - scm:git:git@github.com:Azure/azure-sdk-for-java.git - HEAD - - - - UTF-8 - - - - - - microsoft - Microsoft - - - diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-formrecognizer/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-formrecognizer/reflect-config.json deleted file mode 100644 index 47b9d8e765dd9..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-formrecognizer/reflect-config.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "name": "com.azure.ai.formrecognizer.perf.DocumentModelAnalysisTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-textanalytics/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-textanalytics/reflect-config.json deleted file mode 100644 index 3c70a10fce742..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-ai-textanalytics/reflect-config.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "name": "com.azure.ai.textanalytics.perf.DetectLanguageTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json deleted file mode 100644 index 0c22bd11bf419..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json +++ /dev/null @@ -1,128 +0,0 @@ -[ - { - "name": "com.azure.perf.test.core.PerfStressOptions", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.MockEventProcessorTest$MockEventProcessorPerfOptions", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.MockBatchReceiverTest$MockReceiverOptions", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.HttpPipelineOptions", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.ExceptionTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.MockBatchReceiverTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.MockEventProcessorTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.NoOpTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.SleepTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.perf.test.core.HttpPipelineTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.beust.jcommander.validators.NoValueValidator", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.beust.jcommander.validators.NoValidator", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.BooleanConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.IntegerConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.StringConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.EnumConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.DoubleConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.FloatConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.LongConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.URIConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name":"com.beust.jcommander.converters.URLConverter", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json deleted file mode 100644 index 66e222bb78f32..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "name": "com.azure.data.appconfiguration.perf.ListConfigurationSettingsTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-tables/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-tables/reflect-config.json deleted file mode 100644 index 545ea73709c49..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-data-tables/reflect-config.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "name": "com.azure.data.tables.perf.CreateEntityWithAllTypes", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.tables.perf.CreateEntityWithAllTypesUsingTransaction", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.tables.perf.CreateEntityWithStringsOnly", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.tables.perf.CreateEntityWithStringsOnlyUsingTransaction", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.tables.perf.ListEntitiesWithStringsOnlyTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.tables.perf.ListEntitiesWithAllTypesTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-monitor-query/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-monitor-query/reflect-config.json deleted file mode 100644 index a5ea62bf281c9..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-monitor-query/reflect-config.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "name": "com.azure.monitor.query.perf.LogsBatchQueryTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.monitor.query.perf.LogsQueryAsModelTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.monitor.query.perf.MetricsQueryTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-search-documents/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-search-documents/reflect-config.json deleted file mode 100644 index 71aa3861dc57d..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-search-documents/reflect-config.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "name": "com.azure.search.perf.AutocompleteTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.search.perf.IndexDocumentsTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.search.perf.SearchDocumentsTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.search.perf.SuggestTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault/reflect-config.json deleted file mode 100644 index 6c0fd2311815d..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault/reflect-config.json +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "name": "com.azure.security.keyvault.certificates.perf.GetCertificateTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.security.keyvault.keys.perf.DecryptTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.security.keyvault.keys.perf.GetKeyTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.security.keyvault.keys.perf.SignTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.security.keyvault.keys.perf.UnwrapTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.security.keyvault.secrets.perf.GetSecretTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.security.keyvault.secrets.perf.ListSecretsTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/reflect-config.json b/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/reflect-config.json deleted file mode 100644 index 1608799d429a2..0000000000000 --- a/sdk/aot/azure-aot-graalvm-perf/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/reflect-config.json +++ /dev/null @@ -1,116 +0,0 @@ -[ - { - "name": "com.azure.storage.blob.perf.DownloadBlobTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.ListBlobsTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.UploadBlobNoLengthTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.UploadBlobTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.UploadBlockBlobTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.UploadFromFileTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.UploadOutputStreamTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.StoragePerfStressOptions", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.share.perf.DownloadFileShareTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.share.perf.DownloadToFileShareTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.share.perf.UploadFileShareTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.share.perf.UploadFromFileShareTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.datalake.perf.AppendFileDatalakeTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.datalake.perf.ReadFileDatalakeTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.datalake.perf.UploadFileDatalakeTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.datalake.perf.UploadFromFileDatalakeTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.file.datalake.perf.UploadFromFileDatalakeTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.DownloadBlobToFileTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.storage.blob.perf.DownloadBlobNonSharedClientTest", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-samples/CHANGELOG.md b/sdk/aot/azure-aot-graalvm-samples/CHANGELOG.md deleted file mode 100644 index 8f79f2cc94481..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# Release History - -## 1.0.0-beta.1 (Unreleased) -Version 1.0.0-beta.1 is a first preview release of sample code that demonstrates many common scenarios, and their ability to be executed as native images using GraalVM native image compilation. - -## Features Added -- Initial release. Please see the README and wiki for information on using the new library. diff --git a/sdk/aot/azure-aot-graalvm-samples/README.md b/sdk/aot/azure-aot-graalvm-samples/README.md deleted file mode 100644 index cf63467605b36..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Azure GraalVM samples client library for Java - -## Getting started - -### Prerequisites -- A [Java Development Kit (JDK)][jdk_link], version 8 or later. -- [Azure Subscription][azure_subscription] -- [GraalVM][graalvm] -### Include the package - -[//]: # ({x-version-update-start;com.azure:azure-aot-graalvm-samples;current}) -```xml - - com.azure - azure-aot-graalvm-samples - 1.0.0-beta.1 - -``` -[//]: # ({x-version-update-end}) - -## Key concepts - -## Examples - -## Troubleshooting - -## Next steps - -## Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License -Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. -For details, visit [https://cla.microsoft.com](https://cla.microsoft.com). - -When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the -PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this -once across all repos using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact -[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - - -[cla]: https://cla.microsoft.com -[coc]: https://opensource.microsoft.com/codeofconduct/ -[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ -[coc_contact]: mailto:opencode@microsoft.com -[jdk_link]: https://learn.microsoft.com/java/azure/jdk/?view=azure-java-stable -[azure_subscription]: https://azure.microsoft.com/free -[graalvm]: https://www.graalvm.org/downloads/ - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Faot%2Fazure-aot-graalvm-samples%2FREADME.png) diff --git a/sdk/aot/azure-aot-graalvm-samples/pom.xml b/sdk/aot/azure-aot-graalvm-samples/pom.xml deleted file mode 100644 index 5e095976c8b6b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/pom.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - 4.0.0 - - com.azure - azure-aot-graalvm-samples - 1.0.0-beta.1 - - jar - Microsoft Azure SDK for Java GraalVM samples - This package contains samples for using Azure SDK for Java with GraalVM. - - com.azure - azure-client-sdk-parent - 1.7.0 - ../../parents/azure-client-sdk-parent - - https://github.com/Azure/azure-sdk-for-java - - - - The MIT License (MIT) - http://opensource.org/licenses/MIT - repo - - - - - - azure-java-build-docs - ${site.url}/site/${project.artifactId} - - - - - scm:git:https://github.com/Azure/azure-sdk-for-java - scm:git:git@github.com:Azure/azure-sdk-for-java.git - HEAD - - - - UTF-8 - - true - - - - - - microsoft - Microsoft - - - - - - - com.azure - azure-data-appconfiguration - 1.7.3 - - - com.azure - azure-identity - 1.15.0 - - - com.azure - azure-security-keyvault-keys - 4.9.1 - - - com.azure - azure-storage-blob - 12.29.0 - - - - com.azure - azure-security-keyvault-secrets - 4.9.1 - - - com.azure - azure-security-keyvault-certificates - 4.7.1 - - - - com.azure - azure-messaging-eventhubs - 5.19.2 - - - com.azure - azure-cosmos - 4.65.0 - - - com.azure - azure-ai-formrecognizer - 4.1.12 - - - com.azure - azure-ai-textanalytics - 5.5.4 - - - - - - org.junit.jupiter - junit-jupiter-api - 5.11.2 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.11.2 - test - - - org.junit.jupiter - junit-jupiter-params - 5.11.2 - test - - - org.graalvm.buildtools - junit-platform-native - 0.9.19 - test - - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.4.1 - - - - java - - - - - com.azure.aot.graalvm.samples.AzureGraalVmSamples - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - jar-with-dependencies - - - - com.azure.aot.graalvm.samples.AzureGraalVmSamples - - - false - - - - make-assembly - package - - single - - - - - - - - - - native - - - - org.graalvm.buildtools - native-maven-plugin - 0.9.19 - - com.azure.aot.graalvm.samples.AzureGraalVmSamples - azure-aot-graalvm-sample - - - - build-native - - build - - package - - - - - - - - - diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/AzureGraalVmSamples.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/AzureGraalVmSamples.java deleted file mode 100644 index f636da8e54723..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/AzureGraalVmSamples.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples; - -import com.azure.aot.graalvm.samples.appconfiguration.AppConfigurationSample; -import com.azure.aot.graalvm.samples.eventhubs.EventHubsSample; -import com.azure.aot.graalvm.samples.formrecognizer.FormRecognizerSample; -import com.azure.aot.graalvm.samples.keyvault.certificates.KeyVaultCertificatesSample; -import com.azure.aot.graalvm.samples.keyvault.keys.KeyVaultKeysSample; -import com.azure.aot.graalvm.samples.keyvault.secrets.KeyVaultSecretsSample; -import com.azure.aot.graalvm.samples.storage.blob.StorageBlobSample; -import com.azure.aot.graalvm.samples.textanalytics.TextAnalyticsSample; -import java.io.IOException; - -/** - * Main class to run Azure client samples using GraalVM. - */ -public final class AzureGraalVmSamples { - /** - * Main method to run the samples. - * @param args args to samples. - */ - public static void main(String[] args) throws IOException { - AppConfigurationSample.runSample(); - EventHubsSample.runSample(); - FormRecognizerSample.runSample(); - KeyVaultCertificatesSample.runSample(); - KeyVaultKeysSample.runSample(); - KeyVaultSecretsSample.runSample(); - StorageBlobSample.runSample(); - TextAnalyticsSample.runSample(); - - // GraalVM does not support AfterBurner and Cosmos explicitly adds AfterBurner - // CosmosSample runs successfully if afterburner registration is removed in Cosmos - // https://github.com/micronaut-projects/micronaut-core/issues/2575 - // https://github.com/awslabs/aws-serverless-java-container/issues/428 - // CosmosSample.runSample(); - } - - private AzureGraalVmSamples() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/appconfiguration/AppConfigurationSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/appconfiguration/AppConfigurationSample.java deleted file mode 100644 index dde0d0fdb71ab..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/appconfiguration/AppConfigurationSample.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.appconfiguration; - -import com.azure.data.appconfiguration.ConfigurationClient; -import com.azure.data.appconfiguration.ConfigurationClientBuilder; -import com.azure.data.appconfiguration.models.ConfigurationSetting; -import com.azure.identity.DefaultAzureCredentialBuilder; - -/** - * A sample to demonstrate setting and getting a config from Azure Application Configuration operations using GraalVM. - */ -public final class AppConfigurationSample { - private static final String AZURE_APP_CONFIGURATION_CONNECTION_STRING - = System.getenv("AZURE_APP_CONFIGURATION_CONNECTION_STRING"); - - /** - * The method to run the app configuration sample. - */ - public static void runSample() { - System.out.println("\n================================================================"); - System.out.println(" Starting App Configuration Sample"); - System.out.println("================================================================"); - - final ConfigurationClientBuilder configurationClientBuilder = new ConfigurationClientBuilder(); - - if (AZURE_APP_CONFIGURATION_CONNECTION_STRING != null && !AZURE_APP_CONFIGURATION_CONNECTION_STRING.isEmpty()) { - configurationClientBuilder.connectionString(AZURE_APP_CONFIGURATION_CONNECTION_STRING); - } else { - configurationClientBuilder.credential(new DefaultAzureCredentialBuilder().build()); - } - - final ConfigurationClient configurationClient = configurationClientBuilder.buildClient(); - - System.out.println("Setting configuration"); - ConfigurationSetting setting = configurationClient.setConfigurationSetting("key", "label", "value"); - System.out.println("Done: " + setting.getLastModified()); - - setting = configurationClient.getConfigurationSetting("key", "label"); - System.out.println("Retrieved setting again, value is " + setting.getValue()); - - System.out.println("\n================================================================"); - System.out.println(" App Configuration Sample Complete"); - System.out.println("================================================================"); - } - - private AppConfigurationSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Address.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Address.java deleted file mode 100644 index 1ea5b1940a03b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Address.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -/** - * The address model. - */ -public class Address { - private String state = ""; - private String county = ""; - private String city = ""; - - /** - * Creates a new instance of {@link Address}. - */ - public Address() { - } - - /** - * Returns the state. - * @return the state. - */ - public String getState() { - return state; - } - - /** - * Sets the state. - * @param state the state. - */ - public void setState(String state) { - this.state = state; - } - - /** - * Returns the county. - * @return the county. - */ - public String getCounty() { - return county; - } - - /** - * Sets the county. - * @param county the county. - */ - public void setCounty(String county) { - this.county = county; - } - - /** - * Returns the city. - * @return the city. - */ - public String getCity() { - return city; - } - - /** - * Sets the city. - * @param city the city. - */ - public void setCity(String city) { - this.city = city; - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Child.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Child.java deleted file mode 100644 index 884da1813e3ca..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Child.java +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -import java.util.Arrays; - -/** - * The child model. - */ -public class Child { - private String familyName; - private String firstName; - private String gender; - private int grade; - private Pet[] pets = { }; - - /** - * Creates a new instance of {@link Child}. - */ - public Child() { - } - - /** - * Returns the family name. - * @return the family name. - */ - public String getFamilyName() { - return familyName; - } - - /** - * Sets the family name. - * @param familyName the family name. - */ - public void setFamilyName(String familyName) { - this.familyName = familyName; - } - - /** - * Returns the first name. - * @return the first name. - */ - public String getFirstName() { - return firstName; - } - - /** - * Sets the first name. - * @param firstName the first name. - */ - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - /** - * Returns the gender. - * @return the gender. - */ - public String getGender() { - return gender; - } - - /** - * Sets the gender. - * @param gender the gender. - */ - public void setGender(String gender) { - this.gender = gender; - } - - /** - * Returns the grade. - * @return the grade. - */ - public int getGrade() { - return grade; - } - - /** - * Sets the grade. - * @param grade the grade. - */ - public void setGrade(int grade) { - this.grade = grade; - } - - /** - * Returns the pets array. - * @return the pets array. - */ - public Pet[] getPets() { - return Arrays.copyOf(pets, pets.length); - } - - /** - * Sets the pets array. - * @param pets the pets array. - */ - public void setPets(Pet[] pets) { - this.pets = Arrays.copyOf(pets, pets.length); - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/CosmosSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/CosmosSample.java deleted file mode 100644 index 11853383c7cb2..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/CosmosSample.java +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -import com.azure.cosmos.ConsistencyLevel; -import com.azure.cosmos.CosmosClient; -import com.azure.cosmos.CosmosClientBuilder; -import com.azure.cosmos.CosmosContainer; -import com.azure.cosmos.CosmosDatabase; -import com.azure.cosmos.CosmosException; -import com.azure.cosmos.models.CosmosContainerProperties; -import com.azure.cosmos.models.CosmosContainerResponse; -import com.azure.cosmos.models.CosmosDatabaseResponse; -import com.azure.cosmos.models.CosmosItemRequestOptions; -import com.azure.cosmos.models.CosmosItemResponse; -import com.azure.cosmos.models.CosmosQueryRequestOptions; -import com.azure.cosmos.models.PartitionKey; -import com.azure.cosmos.models.ThroughputProperties; -import com.azure.cosmos.util.CosmosPagedIterable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * A sample to demonstrate creating containers, databases and items in Cosmos DB using GraalVM. - */ -public final class CosmosSample { - private static final String AZURE_COSMOS_ENDPOINT = System.getenv("AZURE_COSMOS_ENDPOINT"); - private static final String AZURE_COSMOS_KEY = System.getenv("AZURE_COSMOS_KEY"); - - private CosmosClient client; - - private final String databaseName = "AzureSampleFamilyDB"; - private final String containerName = "FamilyContainer"; - - private CosmosDatabase database; - private CosmosContainer container; - - private static final Logger LOGGER = LoggerFactory.getLogger(CosmosSample.class); - - /** - * The method to run the cosmos sample. - */ - public static void runSample() { - System.out.println("\n================================================================"); - System.out.println(" Starting Cosmos Sample"); - System.out.println("================================================================"); - - if (AZURE_COSMOS_ENDPOINT == null || AZURE_COSMOS_ENDPOINT.isEmpty()) { - System.err.println("azure_cosmos_endpoint environment variable is not set - exiting"); - return; - } - - if (AZURE_COSMOS_KEY == null || AZURE_COSMOS_KEY.isEmpty()) { - System.err.println("azure_cosmos_key environment variable is not set - exiting"); - return; - } - - CosmosSample sample = new CosmosSample(); - - try { - sample.startSample(); - System.out.println("Demo complete, please hold while resources are released"); - } catch (Exception e) { - System.out.println("Error running Cosmos sample " + e.getMessage()); - e.printStackTrace(); - } finally { - System.out.println("Closing the client"); - sample.shutdown(); - } - - System.out.println("\n================================================================"); - System.out.println(" Cosmos Sample Complete"); - System.out.println("================================================================"); - } - - private void startSample() throws Exception { - // Create sync client - client = new CosmosClientBuilder().endpoint(AZURE_COSMOS_ENDPOINT) - .key(AZURE_COSMOS_KEY) - .preferredRegions(Arrays.asList("West US")) - .consistencyLevel(ConsistencyLevel.EVENTUAL) - .contentResponseOnWriteEnabled(true) - .buildClient(); - - createDatabaseIfNotExists(); - System.out.println("Creating container"); - createContainerIfNotExists(); - - // Setup family items to create - List familiesToCreate = new ArrayList<>(); - familiesToCreate.add(Families.getAndersenFamilyItem()); - familiesToCreate.add(Families.getWakefieldFamilyItem()); - familiesToCreate.add(Families.getJohnsonFamilyItem()); - familiesToCreate.add(Families.getSmithFamilyItem()); - - // Creates several items in the container - // Also applies an upsert operation to one of the items (create if not present, otherwise replace) - createFamilies(familiesToCreate); - - System.out.println("Reading items."); - readItems(familiesToCreate); - - System.out.println("Replacing items."); - replaceItems(familiesToCreate); - - System.out.println("Querying items."); - queryItems(); - - System.out.println("Delete an item."); - deleteItem(familiesToCreate.get(0)); - } - - private void createDatabaseIfNotExists() throws Exception { - System.out.println("Create database " + databaseName + " if not exists."); - - // Create database if not exists - // - CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists(databaseName); - database = client.getDatabase(databaseResponse.getProperties().getId()); - - // - - System.out.println("Checking database " + database.getId() + " completed!\n"); - } - - private void createContainerIfNotExists() throws Exception { - System.out.println("Create container " + containerName + " if not exists."); - - // Create container if not exists - // - CosmosContainerProperties containerProperties = new CosmosContainerProperties(containerName, "/lastName"); - - // Create container with 400 RU/s - ThroughputProperties throughputProperties = ThroughputProperties.createManualThroughput(400); - CosmosContainerResponse containerResponse - = database.createContainerIfNotExists(containerProperties, throughputProperties); - container = database.getContainer(containerResponse.getProperties().getId()); - // - - System.out.println("Checking container " + container.getId() + " completed!\n"); - } - - private void createFamilies(List families) throws Exception { - double totalRequestCharge = 0; - for (Family family : families) { - - // - // Create item using container that we created using sync client - - // Use lastName as partitionKey for cosmos item - // Using appropriate partition key improves the performance of database operations - CosmosItemRequestOptions cosmosItemRequestOptions = new CosmosItemRequestOptions(); - CosmosItemResponse item - = container.createItem(family, new PartitionKey(family.getLastName()), cosmosItemRequestOptions); - // - - // Get request charge and other properties like latency, and diagnostics strings, etc. - System.out.println(String.format("Created item with request charge of %.2f within duration %s", - item.getRequestCharge(), item.getDuration())); - - totalRequestCharge += item.getRequestCharge(); - } - System.out.println( - String.format("Created %d items with total request charge of %.2f", families.size(), totalRequestCharge)); - - Family familyToUpsert = families.get(0); - System.out.println(String.format("Upserting the item with id %s after modifying the isRegistered field...", - familyToUpsert.getId())); - familyToUpsert.setRegistered(!familyToUpsert.isRegistered()); - - CosmosItemResponse item = container.upsertItem(familyToUpsert); - - // Get upsert request charge and other properties like latency, and diagnostics strings, etc. - System.out.println(String.format("Upserted item with request charge of %.2f within duration %s", - item.getRequestCharge(), item.getDuration())); - } - - private void readItems(List familiesToCreate) { - // Using partition key for point read scenarios. - // This will help fast look up of items because of partition key - familiesToCreate.forEach(family -> { - // - try { - CosmosItemResponse item - = container.readItem(family.getId(), new PartitionKey(family.getLastName()), Family.class); - double requestCharge = item.getRequestCharge(); - Duration requestLatency = item.getDuration(); - System.out.println( - String.format("Item successfully read with id %s with a charge of %.2f and within duration %s", - item.getItem().getId(), requestCharge, requestLatency)); - } catch (CosmosException e) { - e.printStackTrace(); - System.out.println(String.format("Read Item failed with %s", e)); - } - // - }); - } - - private void replaceItems(List familiesToCreate) { - familiesToCreate.forEach(family -> { - // - try { - String district = family.getDistrict(); - family.setDistrict(district + "_newDistrict"); - CosmosItemResponse item = container.replaceItem(family, family.getId(), - new PartitionKey(family.getLastName()), new CosmosItemRequestOptions()); - double requestCharge = item.getRequestCharge(); - Duration requestLatency = item.getDuration(); - System.out.printf("Item successfully replaced with id: %s, district: %s, charge: %s, duration: %s", - item.getItem().getId(), item.getItem().getDistrict(), requestCharge, requestLatency); - } catch (CosmosException e) { - LOGGER.error(String.format("Replace Item failed with %s", e)); - } - // - }); - } - - private void queryItems() { - // - - // Set some common query options - int preferredPageSize = 10; - CosmosQueryRequestOptions queryOptions = new CosmosQueryRequestOptions(); - //queryOptions.setEnableCrossPartitionQuery(true); //No longer necessary in SDK v4 - // Set populate query metrics to get metrics around query executions - queryOptions.setQueryMetricsEnabled(true); - - CosmosPagedIterable familiesPagedIterable - = container.queryItems("SELECT * FROM Family WHERE Family.lastName IN ('Andersen', 'Wakefield', 'Johnson')", - queryOptions, Family.class); - - familiesPagedIterable.iterableByPage(preferredPageSize).forEach(cosmosItemPropertiesFeedResponse -> { - System.out.println("Got a page of query result with " + cosmosItemPropertiesFeedResponse.getResults().size() - + " items(s)" + " and request charge of " + cosmosItemPropertiesFeedResponse.getRequestCharge()); - - System.out.println("Item Ids " + cosmosItemPropertiesFeedResponse.getResults() - .stream() - .map(Family::getId) - .collect(Collectors.toList())); - }); - // - } - - private void deleteItem(Family item) { - container.deleteItem(item.getId(), new PartitionKey(item.getLastName()), new CosmosItemRequestOptions()); - } - - private void shutdown() { - try { - //Clean shutdown - System.out.println("Deleting Cosmos DB resources"); - System.out.println("-Deleting container..."); - if (container != null) { - container.delete(); - } - System.out.println("-Deleting database..."); - if (database != null) { - database.delete(); - } - System.out.println("-Closing the client..."); - } catch (Exception err) { - LOGGER.error( - "Deleting Cosmos DB resources failed, will still attempt to close the client. See stack trace below."); - err.printStackTrace(); - } - client.close(); - System.out.println("Done."); - } - - private CosmosSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Families.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Families.java deleted file mode 100644 index 23fc5bf231787..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Families.java +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -/** - * Helper class to get family details. - */ -public final class Families { - - /** - * Returns the family details of Andersen family. - * @return the family details of Andersen family. - */ - public static Family getAndersenFamilyItem() { - Family andersenFamily = new Family(); - andersenFamily.setId("Andersen-" + System.currentTimeMillis()); - andersenFamily.setLastName("Andersen"); - - Parent parent1 = new Parent(); - parent1.setFirstName("Thomas"); - - Parent parent2 = new Parent(); - parent2.setFirstName("Mary Kay"); - - andersenFamily.setParents(new Parent[] { parent1, parent2 }); - - Child child1 = new Child(); - child1.setFirstName("Henriette Thaulow"); - child1.setGender("female"); - child1.setGrade(5); - - Pet pet1 = new Pet(); - pet1.setGivenName("Fluffy"); - - child1.setPets(new Pet[] { pet1 }); - - andersenFamily.setDistrict("WA5"); - Address address = new Address(); - address.setCity("Seattle"); - address.setCounty("King"); - address.setState("WA"); - - andersenFamily.setAddress(address); - andersenFamily.setRegistered(true); - andersenFamily.setChildren(new Child[] { child1 }); - - return andersenFamily; - } - - /** - * Returns the family details of Wakefield family. - * @return the family details of Wakefield family. - */ - public static Family getWakefieldFamilyItem() { - Family wakefieldFamily = new Family(); - wakefieldFamily.setId("Wakefield-" + System.currentTimeMillis()); - wakefieldFamily.setLastName("Wakefield"); - - Parent parent1 = new Parent(); - parent1.setFamilyName("Wakefield"); - parent1.setFirstName("Robin"); - - Parent parent2 = new Parent(); - parent2.setFamilyName("Miller"); - parent2.setFirstName("Ben"); - - wakefieldFamily.setParents(new Parent[] { parent1, parent2 }); - - Child child1 = new Child(); - child1.setFirstName("Jesse"); - child1.setFamilyName("Merriam"); - child1.setGrade(8); - - Pet pet1 = new Pet(); - pet1.setGivenName("Goofy"); - - Pet pet2 = new Pet(); - pet2.setGivenName("Shadow"); - - child1.setPets(new Pet[] { pet1, pet2 }); - - Child child2 = new Child(); - child2.setFirstName("Lisa"); - child2.setFamilyName("Miller"); - child2.setGrade(1); - child2.setGender("female"); - - wakefieldFamily.setChildren(new Child[] { child1, child2 }); - - Address address = new Address(); - address.setCity("NY"); - address.setCounty("Manhattan"); - address.setState("NY"); - - wakefieldFamily.setAddress(address); - wakefieldFamily.setDistrict("NY23"); - wakefieldFamily.setRegistered(true); - wakefieldFamily.setChildren(new Child[] { child1, child2 }); - return wakefieldFamily; - } - - /** - * Returns the family details of Johnson family. - * @return the family details of Johnson family. - */ - public static Family getJohnsonFamilyItem() { - Family johnsonFamily = new Family(); - johnsonFamily.setId("Johnson-" + System.currentTimeMillis()); - johnsonFamily.setLastName("Johnson"); - - Parent parent1 = new Parent(); - parent1.setFirstName("John"); - - Parent parent2 = new Parent(); - parent2.setFirstName("Lili"); - - johnsonFamily.setParents(new Parent[] { parent1, parent2 }); - - return johnsonFamily; - } - - /** - * Returns the family details of Smith family. - * @return the family details of Smith family. - */ - public static Family getSmithFamilyItem() { - Family smithFamily = new Family(); - smithFamily.setId("Smith-" + System.currentTimeMillis()); - smithFamily.setLastName("Smith"); - - Parent parent1 = new Parent(); - parent1.setFirstName("John"); - - Parent parent2 = new Parent(); - parent2.setFirstName("Cynthia"); - smithFamily.setParents(new Parent[] { parent1, parent2 }); - - return smithFamily; - } - - private Families() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Family.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Family.java deleted file mode 100644 index f7e9f4f2137d0..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Family.java +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -import java.util.Arrays; - -/** - * The family model. - */ -public class Family { - private String id = ""; - private String lastName = ""; - private String district = ""; - private Parent[] parents = { }; - private Child[] children = { }; - private Address address = new Address(); - private boolean isRegistered = false; - - /** - * Creates a new instance of {@link Family}. - */ - public Family() { - } - - /** - * Returns the family id. - * @return the family id. - */ - public String getId() { - return id; - } - - /** - * Sets the family id. - * @param id the family id. - */ - public void setId(String id) { - this.id = id; - } - - /** - * Returns the family last name. - * @return the family last name. - */ - public String getLastName() { - return lastName; - } - - /** - * Sets the family last name. - * @param lastName the family last name. - */ - public void setLastName(String lastName) { - this.lastName = lastName; - } - - /** - * Returns the district. - * @return the district. - */ - public String getDistrict() { - return district; - } - - /** - * Sets the district. - * @param district the district. - */ - public void setDistrict(String district) { - this.district = district; - } - - /** - * Returns the parents array. - * @return the parents array. - */ - public Parent[] getParents() { - return Arrays.copyOf(parents, parents.length); - } - - /** - * Sets the parents array. - * @param parents the parents array. - */ - public void setParents(Parent[] parents) { - this.parents = Arrays.copyOf(parents, parents.length); - } - - /** - * Returns the children array. - * @return the children array. - */ - public Child[] getChildren() { - return Arrays.copyOf(children, children.length); - } - - /** - * Sets the children array. - * @param children the children array. - */ - public void setChildren(Child[] children) { - this.children = Arrays.copyOf(children, children.length); - } - - /** - * Returns the address. - * @return the address. - */ - public Address getAddress() { - return address; - } - - /** - * Sets the address. - * @param address the address. - */ - public void setAddress(Address address) { - this.address = address; - } - - /** - * Returns true if the family is registered. - * @return true if the family is registered. - */ - public boolean isRegistered() { - return isRegistered; - } - - /** - * Sets the registration state of the family. - * @param isRegistered the registration state of the family - */ - public void setRegistered(boolean isRegistered) { - this.isRegistered = isRegistered; - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Parent.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Parent.java deleted file mode 100644 index 1b6a205f9f9a3..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Parent.java +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -/** - * The parent model. - */ -public class Parent { - private String familyName; - private String firstName; - - /** - * The empty constructor to create a parent instance. - */ - public Parent() { - } - - /** - * The constructor to create a parent instance with a first name. - * @param firstName the first name of the parent. - */ - public Parent(String firstName) { - this.firstName = firstName; - } - - /** - * Returns the family name. - * @return the family name. - */ - public String getFamilyName() { - return familyName; - } - - /** - * Sets the family name. - * @param familyName the family name. - */ - public void setFamilyName(String familyName) { - this.familyName = familyName; - } - - /** - * Returns the first name. - * @return the first name. - */ - public String getFirstName() { - return firstName; - } - - /** - * Sets the first name. - * @param firstName the first name. - */ - public void setFirstName(String firstName) { - this.firstName = firstName; - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Pet.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Pet.java deleted file mode 100644 index 274b576f5345b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/cosmos/Pet.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.cosmos; - -/** - * The pet model. - */ -public class Pet { - private String givenName; - - /** - * Creates a new instance of {@link Pet}. - */ - public Pet() { - } - - /** - * Returns the name of the pet. - * @return the name of the pet. - */ - public String getGivenName() { - return givenName; - } - - /** - * Sets the name of the pet. - * @param givenName the name of the pet. - */ - public void setGivenName(String givenName) { - this.givenName = givenName; - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/eventhubs/EventHubsSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/eventhubs/EventHubsSample.java deleted file mode 100644 index a894cb12b0e45..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/eventhubs/EventHubsSample.java +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.eventhubs; - -import com.azure.core.util.Configuration; -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.messaging.eventhubs.EventData; -import com.azure.messaging.eventhubs.EventHubClientBuilder; -import com.azure.messaging.eventhubs.EventHubProducerClient; - -import java.util.Arrays; - -/** - * An Event Hubs sample to demonstrate sending events to Event Hubs using GraalVM. - */ -public final class EventHubsSample { - private static final String AZURE_EVENT_HUBS_CONNECTION_STRING - = Configuration.getGlobalConfiguration().get("AZURE_EVENT_HUBS_CONNECTION_STRING", ""); - private static final String AZURE_EVENT_HUBS_NAMESPACE - = Configuration.getGlobalConfiguration().get("AZURE_EVENT_HUBS_NAMESPACE", ""); - private static final String AZURE_EVENT_HUBS_NAME - = Configuration.getGlobalConfiguration().get("AZURE_EVENT_HUBS_NAME", ""); - - /** - * The method to run Event Hubs sample. - */ - public static void runSample() { - System.out.println("\n================================================================"); - System.out.println(" Starting Event Hubs Sender Sample"); - System.out.println("================================================================"); - - if (AZURE_EVENT_HUBS_CONNECTION_STRING.isEmpty() - || (AZURE_EVENT_HUBS_NAMESPACE.isEmpty() && AZURE_EVENT_HUBS_NAME.isEmpty())) { - System.err.println("AZURE_EVENT_HUBS_CONNECTION_STRING environment variable should be set or " - + "AZURE_EVENT_HUBS_NAMESPACE and AZURE_EVENT_HUBS_NAME environment variables should be set to " - + "run this sample."); - return; - - } - EventHubClientBuilder eventHubClientBuilder = new EventHubClientBuilder(); - - if (AZURE_EVENT_HUBS_CONNECTION_STRING.isEmpty()) { - eventHubClientBuilder.credential(AZURE_EVENT_HUBS_NAMESPACE, AZURE_EVENT_HUBS_NAME, - new DefaultAzureCredentialBuilder().build()); - } else { - eventHubClientBuilder.connectionString(AZURE_EVENT_HUBS_CONNECTION_STRING); - } - - final EventHubProducerClient eventHubProducerClient = eventHubClientBuilder.buildProducerClient(); - - System.out.println("Event Hub producer client created"); - eventHubProducerClient.send(Arrays.asList(new EventData("Test event - graalvm"))); - System.out.println("Sent message to Event Hub"); - - eventHubProducerClient.close(); - - System.out.println("\n================================================================"); - System.out.println(" Event Hubs Sender Sample Complete"); - System.out.println("================================================================"); - } - - private EventHubsSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/formrecognizer/FormRecognizerSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/formrecognizer/FormRecognizerSample.java deleted file mode 100644 index d9cef62410d07..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/formrecognizer/FormRecognizerSample.java +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.formrecognizer; - -import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient; -import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder; -import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult; -import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument; -import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField; -import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType; -import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult; -import com.azure.core.credential.AzureKeyCredential; -import com.azure.core.util.BinaryData; -import com.azure.core.util.polling.SyncPoller; - -import java.io.IOException; -import java.io.InputStream; -import java.time.LocalDate; -import java.util.List; -import java.util.Map; - -/** - * A sample to demonstrate Form Recognizer's functionality to recognize receipts using GraalVM. - */ -public final class FormRecognizerSample { - private static final String AZURE_FORM_RECOGNIZER_ENDPOINT = System.getenv("AZURE_FORM_RECOGNIZER_ENDPOINT"); - private static final String AZURE_FORM_RECOGNIZER_KEY = System.getenv("AZURE_FORM_RECOGNIZER_KEY"); - - /** - * The method to run the formrecognizer sample. - * @throws IOException if the input image cannot be read. - */ - public static void runSample() throws IOException { - System.out.println("\n================================================================"); - System.out.println(" Starting Form Recognizer Sample"); - System.out.println("================================================================"); - - // Instantiate a client that will be used to call the service. - DocumentAnalysisClient client - = new DocumentAnalysisClientBuilder().credential(new AzureKeyCredential(AZURE_FORM_RECOGNIZER_KEY)) - .endpoint(AZURE_FORM_RECOGNIZER_ENDPOINT) - .buildClient(); - - String fileName = "contoso-allinone.jpg"; - InputStream resourceAsStream = FormRecognizerSample.class.getClassLoader().getResourceAsStream(fileName); - BinaryData imageData = BinaryData.fromStream(resourceAsStream); - byte[] bytes = imageData.toBytes(); - BinaryData requestContent = BinaryData.fromBytes(bytes); - SyncPoller analyzeReceiptPoller - = client.beginAnalyzeDocument("prebuilt-receipt", requestContent); - - AnalyzeResult receiptResults = analyzeReceiptPoller.getFinalResult(); - - for (int i = 0; i < receiptResults.getDocuments().size(); i++) { - AnalyzedDocument analyzedReceipt = receiptResults.getDocuments().get(i); - Map receiptFields = analyzedReceipt.getFields(); - System.out.printf("----------- Analyzing receipt info %d -----------%n", i); - DocumentField merchantNameField = receiptFields.get("MerchantName"); - if (merchantNameField != null) { - if (DocumentFieldType.STRING == merchantNameField.getType()) { - String merchantName = merchantNameField.getValueAsString(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName, - merchantNameField.getConfidence()); - } - } - - DocumentField merchantPhoneNumberField = receiptFields.get("MerchantPhoneNumber"); - if (merchantPhoneNumberField != null) { - if (DocumentFieldType.PHONE_NUMBER == merchantPhoneNumberField.getType()) { - String merchantAddress = merchantPhoneNumberField.getValueAsPhoneNumber(); - System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", merchantAddress, - merchantPhoneNumberField.getConfidence()); - } - } - - DocumentField merchantAddressField = receiptFields.get("MerchantAddress"); - if (merchantAddressField != null) { - if (DocumentFieldType.STRING == merchantAddressField.getType()) { - String merchantAddress = merchantAddressField.getValueAsString(); - System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress, - merchantAddressField.getConfidence()); - } - } - - DocumentField transactionDateField = receiptFields.get("TransactionDate"); - if (transactionDateField != null) { - if (DocumentFieldType.DATE == transactionDateField.getType()) { - LocalDate transactionDate = transactionDateField.getValueAsDate(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate, - transactionDateField.getConfidence()); - } - } - - DocumentField receiptItemsField = receiptFields.get("Items"); - if (receiptItemsField != null) { - System.out.printf("Receipt Items: %n"); - if (DocumentFieldType.LIST == receiptItemsField.getType()) { - List receiptItems = receiptItemsField.getValueAsList(); - receiptItems.stream() - .filter(receiptItem -> DocumentFieldType.MAP == receiptItem.getType()) - .map(formField -> formField.getValueAsMap()) - .forEach(formFieldMap -> formFieldMap.forEach((key, formField) -> { - if ("Name".equals(key)) { - if (DocumentFieldType.STRING == formField.getType()) { - String name = formField.getValueAsString(); - System.out.printf("Name: %s, confidence: %.2fs%n", name, formField.getConfidence()); - } - } - if ("Quantity".equals(key)) { - if (DocumentFieldType.DOUBLE == formField.getType()) { - Double quantity = formField.getValueAsDouble(); - System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, - formField.getConfidence()); - } - } - if ("Price".equals(key)) { - if (DocumentFieldType.DOUBLE == formField.getType()) { - Double price = formField.getValueAsDouble(); - System.out.printf("Price: %f, confidence: %.2f%n", price, - formField.getConfidence()); - } - } - if ("TotalPrice".equals(key)) { - if (DocumentFieldType.DOUBLE == formField.getType()) { - Double totalPrice = formField.getValueAsDouble(); - System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, - formField.getConfidence()); - } - } - })); - } - } - } - - System.out.println("\n================================================================"); - System.out.println(" Form Recognizer Sample Complete"); - System.out.println("================================================================"); - } - - private FormRecognizerSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/certificates/KeyVaultCertificatesSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/certificates/KeyVaultCertificatesSample.java deleted file mode 100644 index 180d48edd990e..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/certificates/KeyVaultCertificatesSample.java +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.keyvault.certificates; - -import com.azure.core.util.polling.LongRunningOperationStatus; -import com.azure.core.util.polling.PollResponse; -import com.azure.core.util.polling.SyncPoller; -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.security.keyvault.certificates.CertificateClient; -import com.azure.security.keyvault.certificates.CertificateClientBuilder; -import com.azure.security.keyvault.certificates.models.CertificateIssuer; -import com.azure.security.keyvault.certificates.models.CertificateKeyCurveName; -import com.azure.security.keyvault.certificates.models.CertificateKeyType; -import com.azure.security.keyvault.certificates.models.CertificateOperation; -import com.azure.security.keyvault.certificates.models.CertificatePolicy; -import com.azure.security.keyvault.certificates.models.DeletedCertificate; -import com.azure.security.keyvault.certificates.models.KeyVaultCertificate; -import com.azure.security.keyvault.certificates.models.KeyVaultCertificateWithPolicy; -import com.azure.security.keyvault.certificates.models.SubjectAlternativeNames; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -/** - * A Key Vault Certificate sample to demonstrate CRUD operations using GraalVM. - */ -public final class KeyVaultCertificatesSample { - private static final String AZURE_KEY_VAULT_URL = System.getenv("AZURE_KEY_VAULT_URL"); - - /** - * The method to run Key Vault certificates sample. - */ - public static void runSample() { - System.out.println("================================================================"); - System.out.println(" Starting Key Vault Certificates Sample"); - System.out.println("================================================================"); - - if (AZURE_KEY_VAULT_URL == null || AZURE_KEY_VAULT_URL.isEmpty()) { - System.err.println("azure_key_vault_url environment variable is not set - exiting"); - return; - } - - // Instantiate a certificate client that will be used to call the service. Notice that the client is using default Azure - // credentials. To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', - // 'AZURE_CLIENT_KEY' and 'AZURE_TENANT_ID' are set with the service principal credentials. - CertificateClient certificateClient = new CertificateClientBuilder().vaultUrl(AZURE_KEY_VAULT_URL) - .credential(new DefaultAzureCredentialBuilder().build()) - .buildClient(); - System.out.println("Created Certificate client"); - - // Let's create a self signed certificate valid for 1 year. if the certificate - // already exists in the key vault, then a new version of the certificate is created. - CertificatePolicy policy = new CertificatePolicy("Self", "CN=SelfSignedJavaPkcs12") - .setSubjectAlternativeNames(new SubjectAlternativeNames().setEmails(Arrays.asList("wow@gmail.com"))) - .setKeyReusable(true) - .setKeyType(CertificateKeyType.EC) - .setKeyCurveName(CertificateKeyCurveName.P_256) - .setValidityInMonths(12); - Map tags = new HashMap<>(); - tags.put("foo", "bar"); - - System.out.println("Creating new certificate"); - String certificateName1 = "certificateName2" + UUID.randomUUID(); - SyncPoller certificatePoller - = certificateClient.beginCreateCertificate(certificateName1, policy, true, tags); - certificatePoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); - - // Let's Get the latest version of the certificate from the key vault. - System.out.println("Retrieving the new certificate from the key vault"); - KeyVaultCertificate certificate = certificateClient.getCertificate(certificateName1); - System.out.printf("Certificate is returned with name %s and secret id %s %n", - certificate.getProperties().getName(), certificate.getSecretId()); - - // After some time, we need to disable the certificate temporarily, so we update the enabled status of the certificate. - // The update method can be used to update the enabled status of the certificate. - certificate.getProperties().setEnabled(false); - KeyVaultCertificate updatedCertificate - = certificateClient.updateCertificateProperties(certificate.getProperties()); - System.out.printf("Certificate's updated enabled status is %s %n", - updatedCertificate.getProperties().isEnabled()); - - //Let's create a certificate issuer. - CertificateIssuer issuer = new CertificateIssuer("myIssuer", "Test"); - CertificateIssuer myIssuer = certificateClient.createIssuer(issuer); - System.out.printf("Issuer created with name %s and provider %s", myIssuer.getName(), myIssuer.getProvider()); - - // Let's fetch the issuer we just created from the key vault. - myIssuer = certificateClient.getIssuer("myIssuer"); - System.out.printf("Issuer retrieved with name %s and provider %s", myIssuer.getName(), myIssuer.getProvider()); - - //Let's create a certificate signed by our issuer. - String certificateName2 = "myCertificate" + UUID.randomUUID(); - certificateClient - .beginCreateCertificate(certificateName2, new CertificatePolicy("myIssuer", "CN=SelfSignedJavaPkcs12"), - true, tags) - .waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); - - // Let's Get the latest version of our certificate from the key vault. - KeyVaultCertificate myCert = certificateClient.getCertificate(certificateName2); - System.out.printf("Certificate is returned with name %s and secret id %s %n", myCert.getProperties().getName(), - myCert.getSecretId()); - - // The certificates and issuers are no longer needed, need to delete it from the key vault. - SyncPoller deletedCertificatePoller - = certificateClient.beginDeleteCertificate(certificateName1); - // Deleted Certificate is accessible as soon as polling beings. - PollResponse pollResponse = deletedCertificatePoller.poll(); - System.out.printf("Deleted certificate with name %s and recovery id %s", pollResponse.getValue().getName(), - pollResponse.getValue().getRecoveryId()); - deletedCertificatePoller.waitForCompletion(); - - SyncPoller deletedCertPoller - = certificateClient.beginDeleteCertificate(certificateName2); - // Deleted Certificate is accessible as soon as polling beings. - PollResponse deletePollResponse = deletedCertPoller.poll(); - System.out.printf("Deleted certificate with name %s and recovery id %s", - deletePollResponse.getValue().getName(), deletePollResponse.getValue().getRecoveryId()); - deletedCertPoller.waitForCompletion(); - - CertificateIssuer deleteCertificateIssuer = certificateClient.deleteIssuer("myIssuer"); - System.out.printf("Certificate issuer is permanently deleted with name %s and provider is %s %n", - deleteCertificateIssuer.getName(), deleteCertificateIssuer.getProvider()); - - // If the keyvault is soft-delete enabled, then for permanent deletion deleted certificates need to be purged. - certificateClient.purgeDeletedCertificate(certificateName1); - certificateClient.purgeDeletedCertificate(certificateName2); - - System.out.println("\n================================================================"); - System.out.println(" Key Vault Keys Certificates Complete"); - System.out.println("================================================================"); - } - - private KeyVaultCertificatesSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/keys/KeyVaultKeysSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/keys/KeyVaultKeysSample.java deleted file mode 100644 index 7d5a8024ef81c..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/keys/KeyVaultKeysSample.java +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.keyvault.keys; - -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.security.keyvault.keys.KeyClient; -import com.azure.security.keyvault.keys.KeyClientBuilder; -import com.azure.security.keyvault.keys.models.KeyVaultKey; - -/** - * A sample to demonstrate getting a key from Azure Key Vault using GraalVM. - */ -public final class KeyVaultKeysSample { - - private static final String AZURE_KEY_VAULT_URL = System.getenv("AZURE_KEY_VAULT_URL"); - - /** - * The method to run the Key Vault Keys sample. - */ - public static void runSample() { - System.out.println("\n================================================================"); - System.out.println(" Starting Key Vault Keys Sample"); - System.out.println("================================================================"); - - if (AZURE_KEY_VAULT_URL == null || AZURE_KEY_VAULT_URL.isEmpty()) { - System.err.println("AZURE_KEY_VAULT_URL environment variable is not set - exiting"); - } - - KeyClient keyClient = new KeyClientBuilder().vaultUrl(AZURE_KEY_VAULT_URL) - .credential(new DefaultAzureCredentialBuilder().build()) - .buildClient(); - - System.out.println("Getting key from Key Vault"); - KeyVaultKey key = keyClient.getKey("testkey"); - System.out.println(key.getName() + " " + key.getId()); - - System.out.println("\n================================================================"); - System.out.println(" Key Vault Keys Sample Complete"); - System.out.println("================================================================"); - } - - private KeyVaultKeysSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/secrets/KeyVaultSecretsSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/secrets/KeyVaultSecretsSample.java deleted file mode 100644 index 28b59a9bdb748..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/secrets/KeyVaultSecretsSample.java +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.keyvault.secrets; - -import com.azure.core.util.polling.PollResponse; -import com.azure.core.util.polling.SyncPoller; -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.security.keyvault.secrets.SecretClient; -import com.azure.security.keyvault.secrets.SecretClientBuilder; -import com.azure.security.keyvault.secrets.models.DeletedSecret; -import com.azure.security.keyvault.secrets.models.KeyVaultSecret; -import com.azure.security.keyvault.secrets.models.SecretProperties; - -import java.time.OffsetDateTime; - -/** - * A sample to demonstrate CRUD operations for Azure Key Vault secrets using GraalVM. - */ -public final class KeyVaultSecretsSample { - private static final String AZURE_KEY_VAULT_URL = System.getenv("AZURE_KEY_VAULT_URL"); - - /** - * The method to run the Key Vault secrets sample. - */ - public static void runSample() { - System.out.println("\n================================================================"); - System.out.println(" Starting Key Vault Secrets Sample"); - System.out.println("================================================================"); - - if (AZURE_KEY_VAULT_URL == null || AZURE_KEY_VAULT_URL.isEmpty()) { - System.err.println("azure_key_vault_url environment variable is not set - exiting"); - return; - } - - // Instantiate a secret client that will be used to call the service. Notice that the client is using default Azure - // credentials. To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', - // 'AZURE_CLIENT_KEY' and 'AZURE_TENANT_ID' are set with the service principal credentials. - SecretClient secretClient = new SecretClientBuilder().vaultUrl(AZURE_KEY_VAULT_URL) - .credential(new DefaultAzureCredentialBuilder().build()) - .buildClient(); - - // Let's create a secret holding bank account credentials valid for 1 year. if the secret - // already exists in the key vault, then a new version of the secret is created. - secretClient.setSecret(new KeyVaultSecret("BankAccountPassword", "f4G34fMh8v") - .setProperties(new SecretProperties().setExpiresOn(OffsetDateTime.now().plusYears(1)))); - - // Let's Get the bank secret from the key vault. - KeyVaultSecret bankSecret = secretClient.getSecret("BankAccountPassword"); - System.out.printf("Secret is returned with name %s and value %s %n", bankSecret.getName(), - bankSecret.getValue()); - - // After one year, the bank account is still active, we need to update the expiry time of the secret. - // The update method can be used to update the expiry attribute of the secret. It cannot be used to update - // the value of the secret. - bankSecret.getProperties().setExpiresOn(OffsetDateTime.now().plusYears(1)); - SecretProperties updatedSecret = secretClient.updateSecretProperties(bankSecret.getProperties()); - System.out.printf("Secret's updated expiry time %s %n", updatedSecret.getExpiresOn()); - - // Bank forced a password update for security purposes. Let's change the value of the secret in the key vault. - // To achieve this, we need to create a new version of the secret in the key vault. The update operation cannot - // change the value of the secret. - secretClient.setSecret(new KeyVaultSecret("BankAccountPassword", "bhjd4DDgsa") - .setProperties(new SecretProperties().setExpiresOn(OffsetDateTime.now().plusYears(1)))); - - // The bank account was closed, need to delete its credentials from the key vault. - SyncPoller deletedBankSecretPoller = secretClient.beginDeleteSecret("BankAccountPassword"); - - PollResponse deletedBankSecretPollResponse = deletedBankSecretPoller.poll(); - - System.out.println("Deleted Date %s" + deletedBankSecretPollResponse.getValue().getDeletedOn().toString()); - System.out.printf("Deleted Secret's Recovery Id %s", deletedBankSecretPollResponse.getValue().getRecoveryId()); - - // Key is being deleted on server. - deletedBankSecretPoller.waitForCompletion(); - - // If the key vault is soft-delete enabled, then for permanent deletion deleted secrets need to be purged. - secretClient.purgeDeletedSecret("BankAccountPassword"); - - System.out.println("\n================================================================"); - System.out.println(" Key Vault Keys Secrets Complete"); - System.out.println("================================================================"); - } - - private KeyVaultSecretsSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/storage/blob/StorageBlobSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/storage/blob/StorageBlobSample.java deleted file mode 100644 index 970ff794bfeef..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/storage/blob/StorageBlobSample.java +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.storage.blob; - -import com.azure.core.util.BinaryData; -import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; -import com.azure.storage.blob.BlobServiceClientBuilder; - -import java.util.Random; - -/** - * A sample to demonstrate uploading a blob to Azure Blob Storage using GraalVM. - */ -public final class StorageBlobSample { - private static final String AZURE_STORAGE_CONNECTION_STRING = System.getenv("AZURE_STORAGE_CONNECTION_STRING"); - private static final Random RANDOM = new Random(); - - /** - * The method to run the storage blob sample. - */ - public static void runSample() { - - System.out.println("\n================================================================"); - System.out.println(" Starting Blob Storage Sample"); - System.out.println("================================================================"); - - final BlobServiceClientBuilder blobServiceClientBuilder = new BlobServiceClientBuilder(); - if (AZURE_STORAGE_CONNECTION_STRING != null && !AZURE_STORAGE_CONNECTION_STRING.isEmpty()) { - blobServiceClientBuilder.connectionString(AZURE_STORAGE_CONNECTION_STRING); - } else { - blobServiceClientBuilder.credential(new DefaultAzureCredentialBuilder().build()); - } - - final BlobServiceClient blobServiceClient = blobServiceClientBuilder.buildClient(); - - final String containerName = "graal-uploads-" + RANDOM.nextInt(100); - BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(containerName); - if (!blobContainerClient.exists()) { - blobContainerClient = blobServiceClient.createBlobContainer(containerName); - } - - System.out.println("Beginning upload"); - final BlobClient blobClient = blobContainerClient.getBlobClient("graalvm-test.bin"); - - byte[] bytes = new byte[1024 * 1024]; - RANDOM.nextBytes(bytes); - blobClient.upload(BinaryData.fromBytes(bytes)); - - System.out.println("Upload complete"); - - blobContainerClient.delete(); - - System.out.println("\n================================================================"); - System.out.println(" Blob Storage Sample Complete"); - System.out.println("================================================================"); - } - - private StorageBlobSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/textanalytics/TextAnalyticsSample.java b/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/textanalytics/TextAnalyticsSample.java deleted file mode 100644 index 3d0a95016d2b5..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/textanalytics/TextAnalyticsSample.java +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.samples.textanalytics; - -import com.azure.ai.textanalytics.TextAnalyticsClient; -import com.azure.ai.textanalytics.TextAnalyticsClientBuilder; -import com.azure.ai.textanalytics.models.DocumentSentiment; -import com.azure.ai.textanalytics.models.SentimentConfidenceScores; -import com.azure.core.credential.AzureKeyCredential; - -/** - * A GraalVM sample to demonstrate analyzing sentiment of a sentence using Azure Text Analytics. - */ -public final class TextAnalyticsSample { - private static final String AZURE_TEXT_ANALYTICS_KEY = System.getenv("AZURE_TEXT_ANALYTICS_KEY"); - private static final String AZURE_TEXT_ANALYTICS_ENDPOINT = System.getenv("AZURE_TEXT_ANALYTICS_ENDPOINT"); - - /** - * The method to run the text analytics sample. - */ - public static void runSample() { - System.out.println("\n================================================================"); - System.out.println(" Starting Text Analytics Sample"); - System.out.println("================================================================"); - - // Instantiate a client that will be used to call the service. - TextAnalyticsClient client - = new TextAnalyticsClientBuilder().credential(new AzureKeyCredential(AZURE_TEXT_ANALYTICS_KEY)) - .endpoint(AZURE_TEXT_ANALYTICS_ENDPOINT) - .buildClient(); - - // The text that needs be analyzed. - String document = "The hotel was dark and unclean. I like Microsoft."; - - final DocumentSentiment documentSentiment = client.analyzeSentiment(document); - SentimentConfidenceScores scores = documentSentiment.getConfidenceScores(); - System.out.printf( - "Recognized document sentiment: %s, positive score: %f, neutral score: %f, negative score: %f.%n", - documentSentiment.getSentiment(), scores.getPositive(), scores.getNeutral(), scores.getNegative()); - - documentSentiment.getSentences().forEach(sentenceSentiment -> { - SentimentConfidenceScores sentenceScores = sentenceSentiment.getConfidenceScores(); - System.out.printf( - "Recognized sentence sentiment: %s, positive score: %f, neutral score: %f, negative score: %f.%n", - sentenceSentiment.getSentiment(), sentenceScores.getPositive(), sentenceScores.getNeutral(), - sentenceScores.getNegative()); - }); - - System.out.println("\n================================================================"); - System.out.println(" Text Analytics Sample Complete"); - System.out.println("================================================================"); - } - - private TextAnalyticsSample() { - } -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/reflect-config.json b/sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/reflect-config.json deleted file mode 100644 index 9a0ab2bb25aa6..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/reflect-config.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "name": "com.azure.aot.graalvm.samples.cosmos.Family", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.aot.graalvm.samples.cosmos.Address", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.aot.graalvm.samples.cosmos.Child", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.aot.graalvm.samples.cosmos.Parent", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.aot.graalvm.samples.cosmos.Pet", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.aot.graalvm.samples.cosmos.Families", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/resource-config.json b/sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/resource-config.json deleted file mode 100644 index 5a7d962862f6c..0000000000000 --- a/sdk/aot/azure-aot-graalvm-samples/src/main/resources/META-INF/native-image/com.azure/azure-aot-graalvm-samples/resource-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "contoso-allinone.jpg" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-samples/src/main/resources/contoso-allinone.jpg b/sdk/aot/azure-aot-graalvm-samples/src/main/resources/contoso-allinone.jpg deleted file mode 100644 index 1aaad34387ecdd1bca00d45326fa20c509933408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154512 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

O%focg@6?zzQ-*wLhxrpJw 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 diff --git a/sdk/aot/azure-aot-graalvm-support-netty/CHANGELOG.md b/sdk/aot/azure-aot-graalvm-support-netty/CHANGELOG.md deleted file mode 100644 index 5c86ecb5c8914..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/CHANGELOG.md +++ /dev/null @@ -1,36 +0,0 @@ -# Release History - -## 1.0.0-beta.4 (Unreleased) - -### Features Added - -### Breaking Changes - -### Bugs Fixed - -### Other Changes - -## 1.0.0-beta.3 (2023-04-04) - -### Other Changes -- Marked this library as deprecated. Please refer to the [blog post](https://devblogs.microsoft.com/azure-sdk/announcing-graalvm-support-in-azure-sdk-for-java-and-spring-cloud-azure-libraries/) for more details on GraalVM support in Azure SDK for Java. - -#### Dependency Updates -- Updated `azure-aot-graalvm-support` version to 1.0.0-beta.3 - -## 1.0.0-beta.2 (2022-04-25) - -### Other Changes - -#### Dependency Updates -- Updated `azure-aot-graalvm-support` version to 1.0.0-beta.2 - -## 1.0.0-beta.1 (2022-04-08) - -Version 1.0.0-beta.1 is a preview of our efforts in creating a client library for Azure GraalVM Netty Support that is -developer-friendly, idiomatic to the Java ecosystem, and as consistent across different languages and platforms as -possible. The principles that guide our efforts can be found in the -[Azure SDK Design Guidelines for Java](https://azure.github.io/azure-sdk/java_introduction.html). - -## Features Added -- Initial release. Please see the README and wiki for information on using the new library. diff --git a/sdk/aot/azure-aot-graalvm-support-netty/README.md b/sdk/aot/azure-aot-graalvm-support-netty/README.md deleted file mode 100644 index c417bfbe90adb..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Azure GraalVM Netty Support client library for Java - -> **IMPORTANT** Please note that this package is deprecated and will no longer be updated. The necessary configuration files to support -> native image compilation using GraalVM is now directly available on respective client libraries. It is no longer required -> to add this package as a dependency to build native images with Azure SDK for Java. - Marked this library as deprecated. -> Please refer to the [blog post](https://devblogs.microsoft.com/azure-sdk/announcing-graalvm-support-in-azure-sdk-for-java-and-spring-cloud-azure-libraries/) for more details on GraalVM support in Azure SDK for Java. - -The Azure GraalVM Netty Support client library provides support for applications using -[Azure client libraries](https://azure.github.io/azure-sdk/releases/latest/java.html) that take a dependency on -[azure-core-http-netty](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/core/azure-core-http-netty) to be -built as [GraalVM native images](https://www.graalvm.org/22.0/reference-manual/native-image/). The library contains all the necessary -[configuration files](https://www.graalvm.org/22.0/reference-manual/native-image/BuildConfiguration/) and [GraalVM -features](https://www.graalvm.org/sdk/javadoc/index.html?org/graalvm/nativeimage/hosted/Feature.html) required to build -a native image of an application that uses Azure client libraries. - -**NOTE:**: This library is a preview and is intended to enable applications using Azure client libraries to quickly -build and validate native images. However, this is not a stable, GA version and is not officially supported to use in production -environments. - -## Getting started - -### Prerequisites -- A [Java Development Kit (JDK)][jdk_link], version 8 or later. -- [Azure Subscription][azure_subscription] -- [GraalVM](https://www.graalvm.org/downloads/) version 22 or later. -- [GraalVM Native Image](https://www.graalvm.org/22.0/reference-manual/native-image/) - -### Include the package - -Include both the packages below: - -[//]: # ({x-version-update-start;com.azure:azure-aot-graalvm-support;current}) -```xml - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.3 - -``` -[//]: # ({x-version-update-end}) - -[//]: # ({x-version-update-start;com.azure:azure-aot-graalvm-support-netty;current}) -```xml - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.3 - -``` -[//]: # ({x-version-update-end}) -## Key concepts - -Please refer to the [Key Concepts](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/aot/azure-aot-graalvm-support#key-concepts) section of the azure-aot-graalvm-support library. - -## Examples - -Please refer to the [Examples](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/aot/azure-aot-graalvm-support#examples) section of the -`azure-aot-graalvm-support` library. - -## Troubleshooting -Please refer to the [Troubleshooting](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/aot/azure-aot-graalvm-support#troubleshooting) section of the -`azure-aot-graalvm-support` library. - -## Next steps -Please refer to the [Next Steps](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/aot/azure-aot-graalvm-support#next-steps) section of the -`azure-aot-graalvm-support` library. - -## Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License -Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. -For details, visit [https://cla.microsoft.com](https://cla.microsoft.com). - -When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the -PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this -once across all repos using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact -[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - - -[cla]: https://cla.microsoft.com -[coc]: https://opensource.microsoft.com/codeofconduct/ -[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ -[coc_contact]: mailto:opencode@microsoft.com -[jdk_link]: https://learn.microsoft.com/java/azure/jdk/?view=azure-java-stable -[azure_subscription]: https://azure.microsoft.com/free - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Faot%2Fazure-aot-graalvm-support-netty%2FREADME.png) diff --git a/sdk/aot/azure-aot-graalvm-support-netty/pom.xml b/sdk/aot/azure-aot-graalvm-support-netty/pom.xml deleted file mode 100644 index dda38a3c7ac3b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/pom.xml +++ /dev/null @@ -1,206 +0,0 @@ - - - - 4.0.0 - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.4 - - jar - Microsoft Azure SDK for GraalVM Netty support - - This package is deprecated will have no further updates. Dependency on this library is no longer required to build native images with Azure SDK for Java. - For more details, please refer to https://devblogs.microsoft.com/azure-sdk/announcing-graalvm-support-in-azure-sdk-for-java-and-spring-cloud-azure-libraries - - - com.azure - azure-client-sdk-parent - 1.7.0 - ../../parents/azure-client-sdk-parent - - https://github.com/Azure/azure-sdk-for-java - - - - The MIT License (MIT) - http://opensource.org/licenses/MIT - repo - - - - - - azure-java-build-docs - ${site.url}/site/${project.artifactId} - - - - - scm:git:https://github.com/Azure/azure-sdk-for-java - scm:git:git@github.com:Azure/azure-sdk-for-java.git - HEAD - - - - UTF-8 - - - - - - microsoft - Microsoft - - - - - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.4 - - - io.netty - netty-handler - 4.1.115.Final - - - io.netty - netty-handler-proxy - 4.1.115.Final - - - io.netty - netty-buffer - 4.1.115.Final - - - io.netty - netty-codec-http - 4.1.115.Final - - - - io.netty - netty-codec-http2 - 4.1.115.Final - - - io.netty - netty-transport-native-unix-common - 4.1.115.Final - - - io.netty - netty-transport-native-epoll - 4.1.115.Final - linux-x86_64 - - - io.netty - netty-transport-native-kqueue - 4.1.115.Final - osx-x86_64 - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.5.0 - - - - - io.netty:netty-buffer:[4.1.115.Final] - io.netty:netty-codec-http:[4.1.115.Final] - io.netty:netty-codec-http2:[4.1.115.Final] - io.netty:netty-handler:[4.1.115.Final] - io.netty:netty-handler-proxy:[4.1.115.Final] - io.netty:netty-transport-native-unix-common:[4.1.115.Final] - io.netty:netty-transport-native-epoll:[4.1.115.Final] - io.netty:netty-transport-native-kqueue:[4.1.115.Final] - - - - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.10.1 - - - attach-javadocs - - jar - - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.4.2 - - - empty-javadoc-jar-with-readme - package - - jar - - - javadoc - ${project.basedir}/javadocTemp - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 3.1.0 - - - copy-readme-to-javadocTemp - prepare-package - - - Deleting existing ${project.basedir}/javadocTemp - - - - Copying ${project.basedir}/README.md to - ${project.basedir}/javadocTemp/README.md - - - - - - run - - - - - - - - diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/NettySubstitutions.java b/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/NettySubstitutions.java deleted file mode 100644 index e7f7555cdaa76..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/NettySubstitutions.java +++ /dev/null @@ -1,478 +0,0 @@ -/* - * Copyright (C) 2018 The Quarkus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -/* - * Portions Copyright (c) Microsoft Corporation - */ -package com.azure.aot.graalvm.support.netty.implementation.features; - -import com.oracle.svm.core.annotate.Alias; -import com.oracle.svm.core.annotate.RecomputeFieldValue; -import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind; -import com.oracle.svm.core.annotate.Substitute; -import com.oracle.svm.core.annotate.TargetClass; -import com.oracle.svm.core.jdk.JDK11OrLater; -import com.oracle.svm.core.jdk.JDK8OrEarlier; -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.embedded.EmbeddedChannel; -import io.netty.handler.codec.compression.ZlibCodecFactory; -import io.netty.handler.codec.compression.ZlibWrapper; -import io.netty.handler.ssl.ApplicationProtocolConfig; -import io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior; -import io.netty.handler.ssl.CipherSuiteFilter; -import io.netty.handler.ssl.ClientAuth; -import io.netty.handler.ssl.SslContext; -import io.netty.handler.ssl.SslContextOption; -import io.netty.handler.ssl.SslProvider; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLEngine; -import javax.net.ssl.SSLException; -import javax.net.ssl.TrustManagerFactory; -import java.security.PrivateKey; -import java.security.Provider; -import java.security.cert.X509Certificate; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.BooleanSupplier; - -import static io.netty.handler.codec.http.HttpHeaderValues.DEFLATE; -import static io.netty.handler.codec.http.HttpHeaderValues.GZIP; -import static io.netty.handler.codec.http.HttpHeaderValues.X_DEFLATE; -import static io.netty.handler.codec.http.HttpHeaderValues.X_GZIP; - -@TargetClass( - className = "io.netty.util.internal.logging.InternalLoggerFactory", - onlyWith = TargetIoNettyUtilInternalLoggingInternalLoggerFactory.OnlyIfInClassPath.class) -final class TargetIoNettyUtilInternalLoggingInternalLoggerFactory { - - static class OnlyIfInClassPath implements BooleanSupplier { - @Override - public boolean getAsBoolean() { - try { - Class.forName("io.netty.util.internal.logging.InternalLoggerFactory", false, - Thread.currentThread().getContextClassLoader()); - return true; - } catch (ClassNotFoundException e) { - return false; - } - } - } -} - -//********************************************************* -// Taken from -// https://github.com/quarkusio/quarkus/blob/main/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java -//********************************************************* - -// SSL -// This whole section is mostly about removing static analysis references to openssl/tcnative - -@TargetClass(className = "io.netty.handler.ssl.SslProvider") -final class TargetIoNettyHandlerSslSslProvider { - @Substitute - public static boolean isAlpnSupported(final SslProvider provider) { - switch (provider) { - case JDK: - return TargetIoNettyHandlerSslJdkAlpnApplicationProtocolNegotiator.isAlpnSupported(); - - case OPENSSL: - case OPENSSL_REFCNT: - return false; - - default: - throw new RuntimeException("SslProvider unsupported " + provider); - } - } -} - -@TargetClass( - className = "io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator", - onlyWith = TargetIoNettyHandlerSslJdkAlpnApplicationProtocolNegotiator.OnlyIfInClassPath.class) -final class TargetIoNettyHandlerSslJdkAlpnApplicationProtocolNegotiator { - @Alias - static boolean isAlpnSupported() { - return true; - } - - static class OnlyIfInClassPath implements BooleanSupplier { - @Override - public boolean getAsBoolean() { - try { - Class.forName("io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator", false, - Thread.currentThread().getContextClassLoader()); - return true; - } catch (ClassNotFoundException e) { - return false; - } - } - } -} - -/** - * Hardcode io.netty.handler.ssl.OpenSsl as non-available - */ -@TargetClass(className = "io.netty.handler.ssl.OpenSsl") -final class TargetIoNettyHandlerSslOpenSsl { - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - private static Throwable UNAVAILABILITY_CAUSE = new RuntimeException("OpenSsl unsupported"); - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - static List DEFAULT_CIPHERS = Collections.emptyList(); - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - static Set AVAILABLE_CIPHER_SUITES = Collections.emptySet(); - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - private static Set AVAILABLE_OPENSSL_CIPHER_SUITES = Collections.emptySet(); - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - private static Set AVAILABLE_JAVA_CIPHER_SUITES = Collections.emptySet(); - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - private static boolean SUPPORTS_KEYMANAGER_FACTORY = false; - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - private static boolean SUPPORTS_OCSP = false; - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias) - static Set SUPPORTED_PROTOCOLS_SET = Collections.emptySet(); - - @Substitute - public static boolean isAvailable() { - return false; - } - - @Substitute - public static int version() { - return -1; - } - - @Substitute - public static String versionString() { - return null; - } - - @Substitute - public static boolean isCipherSuiteAvailable(String cipherSuite) { - return false; - } -} - -@TargetClass(className = "io.netty.handler.ssl.JdkSslServerContext") -final class TargetIoNettyHandlerSslJdkSslServerContext { - - @Alias - TargetIoNettyHandlerSslJdkSslServerContext(Provider provider, X509Certificate[] trustCertCollection, - TrustManagerFactory trustManagerFactory, X509Certificate[] keyCertChain, PrivateKey key, String keyPassword, - KeyManagerFactory keyManagerFactory, Iterable ciphers, CipherSuiteFilter cipherFilter, - ApplicationProtocolConfig apn, long sessionCacheSize, long sessionTimeout, ClientAuth clientAuth, - String[] protocols, boolean startTls, String keyStore) throws SSLException { - } -} - -@TargetClass(className = "io.netty.handler.ssl.JdkSslClientContext") -final class TargetIoNettyHandlerSslJdkSslClientContext { - - @Alias - TargetIoNettyHandlerSslJdkSslClientContext(Provider sslContextProvider, X509Certificate[] trustCertCollection, - TrustManagerFactory trustManagerFactory, X509Certificate[] keyCertChain, PrivateKey key, String keyPassword, - KeyManagerFactory keyManagerFactory, Iterable ciphers, CipherSuiteFilter cipherFilter, - ApplicationProtocolConfig apn, String[] protocols, long sessionCacheSize, long sessionTimeout, - String keyStoreType) throws SSLException { - } -} - -@TargetClass(className = "io.netty.handler.ssl.SslHandler$SslEngineType") -final class TargetIoNettyHandlerSslSslHandler$SslEngineType { - - @Alias - public static TargetIoNettyHandlerSslSslHandler$SslEngineType JDK; - - @Substitute - static TargetIoNettyHandlerSslSslHandler$SslEngineType forEngine(SSLEngine engine) { - return JDK; - } -} - -@TargetClass( - className = "io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper", - onlyWith = JDK11OrLater.class) -@SuppressWarnings("deprecation") -final class TargetIoNettyHandlerSslJdkAlpnApplicationProtocolNegotiatorAlpnWrapper { - @Substitute - public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc, - io.netty.handler.ssl.JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) { - return (SSLEngine) (Object) new TargetIoNettyHandlerSslJdkAlpnSslEngine(engine, applicationNegotiator, - isServer); - } - -} - -@TargetClass( - className = "io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator$AlpnWrapper", - onlyWith = JDK8OrEarlier.class) -@SuppressWarnings("deprecation") -final class TargetIoNettyHandlerSslJdkAlpnApplicationProtocolNegotiatorAlpnWrapperJava8 { - @Substitute - public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc, - io.netty.handler.ssl.JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) { - if (TargetIoNettyHandlerSslJettyAlpnSslEngine.isAvailable()) { - return isServer - ? (SSLEngine) (Object) TargetIoNettyHandlerSslJettyAlpnSslEngine.newServerEngine(engine, - applicationNegotiator) - : (SSLEngine) (Object) TargetIoNettyHandlerSslJettyAlpnSslEngine.newClientEngine(engine, - applicationNegotiator); - } - throw new RuntimeException("Unable to wrap SSLEngine of type " + engine.getClass().getName()); - } - -} - -@TargetClass(className = "io.netty.handler.ssl.JettyAlpnSslEngine", onlyWith = JDK8OrEarlier.class) -@SuppressWarnings("deprecation") -final class TargetIoNettyHandlerSslJettyAlpnSslEngine { - @Substitute - static boolean isAvailable() { - return false; - } - - @Substitute - static TargetIoNettyHandlerSslJettyAlpnSslEngine newClientEngine(SSLEngine engine, - io.netty.handler.ssl.JdkApplicationProtocolNegotiator applicationNegotiator) { - return null; - } - - @Substitute - static TargetIoNettyHandlerSslJettyAlpnSslEngine newServerEngine(SSLEngine engine, - io.netty.handler.ssl.JdkApplicationProtocolNegotiator applicationNegotiator) { - return null; - } -} - -@TargetClass(className = "io.netty.handler.ssl.JdkAlpnSslEngine", onlyWith = JDK11OrLater.class) -@SuppressWarnings("deprecation") -final class TargetIoNettyHandlerSslJdkAlpnSslEngine { - @Alias - TargetIoNettyHandlerSslJdkAlpnSslEngine(final SSLEngine engine, - final io.netty.handler.ssl.JdkApplicationProtocolNegotiator applicationNegotiator, final boolean isServer) { - - } -} - -@TargetClass(className = "io.netty.handler.ssl.SslContext") -final class TargetIoNettyHandlerSslSslContext { - - @Substitute - @SafeVarargs - @SuppressWarnings("varargs") - static SslContext newServerContextInternal(SslProvider provider, Provider sslContextProvider, - X509Certificate[] trustCertCollection, TrustManagerFactory trustManagerFactory, X509Certificate[] keyCertChain, - PrivateKey key, String keyPassword, KeyManagerFactory keyManagerFactory, Iterable ciphers, - CipherSuiteFilter cipherFilter, ApplicationProtocolConfig apn, long sessionCacheSize, long sessionTimeout, - ClientAuth clientAuth, String[] protocols, boolean startTls, boolean enableOcsp, String keyStoreType, - Map.Entry, Object>... ctxOptions) throws SSLException { - if (enableOcsp) { - throw new IllegalArgumentException("OCSP is not supported with this SslProvider: " + provider); - } - return (SslContext) (Object) new TargetIoNettyHandlerSslJdkSslServerContext(sslContextProvider, - trustCertCollection, trustManagerFactory, keyCertChain, key, keyPassword, keyManagerFactory, ciphers, - cipherFilter, apn, sessionCacheSize, sessionTimeout, clientAuth, protocols, startTls, keyStoreType); - } - - @Substitute - @SafeVarargs - @SuppressWarnings("varargs") - static SslContext newClientContextInternal(SslProvider provider, Provider sslContextProvider, - X509Certificate[] trustCert, TrustManagerFactory trustManagerFactory, X509Certificate[] keyCertChain, - PrivateKey key, String keyPassword, KeyManagerFactory keyManagerFactory, Iterable ciphers, - CipherSuiteFilter cipherFilter, ApplicationProtocolConfig apn, String[] protocols, long sessionCacheSize, - long sessionTimeout, boolean enableOcsp, String keyStoreType, Map.Entry, Object>... options) - throws SSLException { - if (enableOcsp) { - throw new IllegalArgumentException("OCSP is not supported with this SslProvider: " + provider); - } - return (SslContext) (Object) new TargetIoNettyHandlerSslJdkSslClientContext(sslContextProvider, trustCert, - trustManagerFactory, keyCertChain, key, keyPassword, keyManagerFactory, ciphers, cipherFilter, apn, - protocols, sessionCacheSize, sessionTimeout, keyStoreType); - } - -} - -@TargetClass(className = "io.netty.handler.ssl.JdkDefaultApplicationProtocolNegotiator") -final class TargetIoNettyHandlerSslJdkDefaultApplicationProtocolNegotiator { - - @Alias - public static TargetIoNettyHandlerSslJdkDefaultApplicationProtocolNegotiator INSTANCE; -} - -@TargetClass(className = "io.netty.handler.ssl.JdkSslContext") -@SuppressWarnings("deprecation") -final class TargetIoNettyHandlerSslJdkSslContext { - - @Substitute - static io.netty.handler.ssl.JdkApplicationProtocolNegotiator toNegotiator(ApplicationProtocolConfig config, - boolean isServer) { - if (config == null) { - return (io.netty.handler.ssl.JdkApplicationProtocolNegotiator) (Object) TargetIoNettyHandlerSslJdkDefaultApplicationProtocolNegotiator.INSTANCE; - } - - switch (config.protocol()) { - case NONE: - return (io.netty.handler.ssl.JdkApplicationProtocolNegotiator) (Object) TargetIoNettyHandlerSslJdkDefaultApplicationProtocolNegotiator.INSTANCE; - - case ALPN: - if (isServer) { - SelectorFailureBehavior behavior = config.selectorFailureBehavior(); - if (behavior == SelectorFailureBehavior.FATAL_ALERT) { - return new io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator(true, - config.supportedProtocols()); - } else if (behavior == SelectorFailureBehavior.NO_ADVERTISE) { - return new io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator(false, - config.supportedProtocols()); - } else { - throw new UnsupportedOperationException( - new StringBuilder("JDK provider does not support ").append(config.selectorFailureBehavior()) - .append(" failure behavior") - .toString()); - } - } else { - switch (config.selectedListenerFailureBehavior()) { - case ACCEPT: - return new io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator(false, - config.supportedProtocols()); - - case FATAL_ALERT: - return new io.netty.handler.ssl.JdkAlpnApplicationProtocolNegotiator(true, - config.supportedProtocols()); - - default: - throw new UnsupportedOperationException(new StringBuilder("JDK provider does not support ") - .append(config.selectedListenerFailureBehavior()) - .append(" failure behavior") - .toString()); - } - } - default: - throw new UnsupportedOperationException( - new StringBuilder("JDK provider does not support ").append(config.protocol()) - .append(" protocol") - .toString()); - } - } - -} - -@TargetClass(className = "io.netty.buffer.AbstractReferenceCountedByteBuf") -final class TargetIoNettyBufferAbstractReferenceCountedByteBuf { - - @Alias - @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FieldOffset, name = "refCnt") - private static long REFCNT_FIELD_OFFSET; -} - -@TargetClass(className = "io.netty.util.AbstractReferenceCounted") -final class TargetIoNettyUtilAbstractReferenceCounted { - - @Alias - @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FieldOffset, name = "refCnt") - private static long REFCNT_FIELD_OFFSET; -} - -// This class is runtime-initialized by NettyProcessor -final class HolderIoNettyUtilConcurrentScheduledFutureTask { - static long START_TIME = System.nanoTime(); -} - -@TargetClass(className = "io.netty.util.concurrent.ScheduledFutureTask") -final class TargetIoNettyUtilConcurrentScheduledFutureTask { - - // The START_TIME field is kept but not used. - // All the accesses to it have been replaced with Holder_io_netty_util_concurrent_ScheduledFutureTask - - @Substitute - static long initialNanoTime() { - return HolderIoNettyUtilConcurrentScheduledFutureTask.START_TIME; - } - - @Substitute - static long nanoTime() { - return System.nanoTime() - HolderIoNettyUtilConcurrentScheduledFutureTask.START_TIME; - } - - @Alias - public long deadlineNanos() { - return 0; - } - - @Substitute - public long delayNanos(long currentTimeNanos) { - return Math.max(0, - deadlineNanos() - (currentTimeNanos - HolderIoNettyUtilConcurrentScheduledFutureTask.START_TIME)); - } -} - -@TargetClass(className = "io.netty.util.internal.NativeLibraryLoader") -final class TargetIoNettyUtilInternalNativeLibraryLoader { - - // This method can trick GraalVM into thinking that Classloader#defineClass is getting called - @Substitute - static Class tryToLoadClass(final ClassLoader loader, final Class helper) throws ClassNotFoundException { - return Class.forName(helper.getName(), false, loader); - } - -} - -@TargetClass(className = "io.netty.handler.codec.http.HttpContentDecompressor") -final class TargetIoNettyHandlerCodecHttpHttpContentDecompressor { - - @Alias - private boolean strict; - - @Alias - protected ChannelHandlerContext ctx; - - @Substitute - protected EmbeddedChannel newContentDecoder(String contentEncoding) throws Exception { - if (GZIP.contentEqualsIgnoreCase(contentEncoding) || X_GZIP.contentEqualsIgnoreCase(contentEncoding)) { - return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(), - ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(ZlibWrapper.GZIP)); - } - - if (DEFLATE.contentEqualsIgnoreCase(contentEncoding) || X_DEFLATE.contentEqualsIgnoreCase(contentEncoding)) { - final ZlibWrapper wrapper = strict ? ZlibWrapper.ZLIB : ZlibWrapper.ZLIB_OR_NONE; - // To be strict, 'deflate' means ZLIB, but some servers were not implemented correctly. - return new EmbeddedChannel(ctx.channel().id(), ctx.channel().metadata().hasDisconnect(), - ctx.channel().config(), ZlibCodecFactory.newZlibDecoder(wrapper)); - } - - // 'identity' or unsupported - return null; - } -} - -public class NettySubstitutions { -} diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/package-info.java b/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/package-info.java deleted file mode 100644 index f2ce12d8dcb8b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/com/azure/aot/graalvm/support/netty/implementation/features/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -/** - * GraalVM Netty-specific configuration. - */ -package com.azure.aot.graalvm.support.netty.implementation.features; diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/module-info.java b/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/module-info.java deleted file mode 100644 index fafb28f904c9b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/java/module-info.java +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -module com.azure.aot.graalvm.support.netty { - requires com.azure.aot.graalvm.support; - requires io.netty.buffer; - requires io.netty.codec; - requires io.netty.codec.http; - requires io.netty.common; - requires io.netty.handler; - requires io.netty.transport; -} diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/jni-config.json b/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/jni-config.json deleted file mode 100644 index 115aedaa6ef77..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/jni-config.json +++ /dev/null @@ -1,968 +0,0 @@ -[ - { - "name": "io.netty.channel.ChannelException" - }, - { - "name": "io.netty.channel.unix.Buffer" - }, - { - "name": "io.netty.channel.unix.DatagramSocketAddress", - "methods": [ - { - "name": "", - "parameterTypes": [ - "byte[]", - "int", - "int", - "int", - "io.netty.channel.unix.DatagramSocketAddress" - ] - } - ] - }, - { - "name": "io.netty.channel.unix.ErrorsStaticallyReferencedJniMethods" - }, - { - "name": "io.netty.channel.unix.FileDescriptor" - }, - { - "name": "io.netty.channel.unix.LimitsStaticallyReferencedJniMethods" - }, - { - "name": "io.netty.channel.unix.Socket" - }, - { - "name": "io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback" - }, - { - "name": "io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier", - "methods": [ - { - "name": "verify", - "parameterTypes": [ - "long", - "byte[][]", - "java.lang.String" - ] - } - ] - }, - { - "name": "io.netty.resolver.dns.macos.DnsResolver[]" - }, - { - "name": "io.netty.internal.tcnative.Library" - }, - { - "name": "io.netty.internal.tcnative.Buffer", - "methods": [ - { - "name": "size", - "parameterTypes": [ - "java.nio.ByteBuffer" - ] - } - ] - }, - { - "name": "io.netty.internal.tcnative.NativeStaticallyReferencedJniMethods" - }, - { - "name": "io.netty.internal.tcnative.SSL", - "methods": [ - { - "name": "version", - "parameterTypes": [] - }, - { - "name": "versionString", - "parameterTypes": [] - }, - { - "name": "initialize", - "parameterTypes": [ - "java.lang.String" - ] - }, - { - "name": "getLastError", - "parameterTypes": [] - }, - { - "name": "newSSL", - "parameterTypes": [ - "long", - "boolean" - ] - }, - { - "name": "getError", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "bioSetByteBuffer", - "parameterTypes": [ - "long", - "long", - "int", - "boolean" - ] - }, - { - "name": "bioClearByteBuffer", - "parameterTypes": [ - "long" - ] - }, - { - "name": "bioFlushByteBuffer", - "parameterTypes": [ - "long" - ] - }, - { - "name": "bioLengthByteBuffer", - "parameterTypes": [ - "long" - ] - }, - { - "name": "bioLengthNonApplication", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sslPending", - "parameterTypes": [ - "long" - ] - }, - { - "name": "writeToSSL", - "parameterTypes": [ - "long", - "long", - "int" - ] - }, - { - "name": "readFromSSL", - "parameterTypes": [ - "long", - "long", - "int" - ] - }, - { - "name": "getShutdown", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setShutdown", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "freeSSL", - "parameterTypes": [ - "long" - ] - }, - { - "name": "freeBIO", - "parameterTypes": [ - "long" - ] - }, - { - "name": "shutdownSSL", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getLastErrorNumber", - "parameterTypes": [] - }, - { - "name": "getCipherForSSL", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getVersion", - "parameterTypes": [ - "long" - ] - }, - { - "name": "doHandshake", - "parameterTypes": [ - "long" - ] - }, - { - "name": "isInInit", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getNextProtoNegotiated", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getAlpnSelected", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getPeerCertChain", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getPeerCertificate", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getErrorString", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getTime", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getTimeout", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setTimeout", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "setVerify", - "parameterTypes": [ - "long", - "int", - "int" - ] - }, - { - "name": "setOptions", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "clearOptions", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "getOptions", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setMode", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "getMode", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getMaxWrapOverhead", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getCiphers", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setCipherSuites", - "parameterTypes": [ - "long", - "java.lang.String" - ] - }, - { - "name": "setCipherSuites", - "parameterTypes": [ - "long", - "java.lang.String", - "boolean" - ] - }, - { - "name": "getSessionId", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getHandshakeCount", - "parameterTypes": [ - "long" - ] - }, - { - "name": "clearError", - "parameterTypes": [] - }, - { - "name": "setTlsExtHostName", - "parameterTypes": [ - "long", - "java.lang.String" - ] - }, - { - "name": "setHostNameValidation", - "parameterTypes": [ - "long", - "int", - "java.lang.String" - ] - }, - { - "name": "authenticationMethods", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setCertificateChainBio", - "parameterTypes": [ - "long", - "long", - "boolean" - ] - }, - { - "name": "setCertificateBio", - "parameterTypes": [ - "long", - "long", - "long", - "java.lang.String" - ] - }, - { - "name": "loadPrivateKeyFromEngine", - "parameterTypes": [ - "java.lang.String", - "java.lang.String" - ] - }, - { - "name": "parsePrivateKey", - "parameterTypes": [ - "long", - "java.lang.String" - ] - }, - { - "name": "freePrivateKey", - "parameterTypes": [ - "long" - ] - }, - { - "name": "parseX509Chain", - "parameterTypes": [ - "long" - ] - }, - { - "name": "freeX509Chain", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setKeyMaterialServerSide", - "parameterTypes": [ - "long", - "long", - "long" - ] - }, - { - "name": "setKeyMaterial", - "parameterTypes": [ - "long", - "long", - "long" - ] - }, - { - "name": "setKeyMaterialClientSide", - "parameterTypes": [ - "long", - "long", - "long", - "long", - "long" - ] - }, - { - "name": "setSession", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "setOcspResponse", - "parameterTypes": [ - "long", - "byte[]" - ] - }, - { - "name": "getOcspResponse", - "parameterTypes": [ - "long" - ] - }, - { - "name": "fipsModeSet", - "parameterTypes": [ - "int" - ] - }, - { - "name": "getSniHostname", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getSigAlgs", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getMasterKey", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getServerRandom", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getClientRandom", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getTask", - "parameterTypes": [ - "long" - ] - }, - { - "name": "isSessionReused", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setSession", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "getSession", - "parameterTypes": [ - "long" - ] - } - ] - }, - { - "name": "io.netty.internal.tcnative.SSLContext", - "methods": [ - { - "name": "make", - "parameterTypes": [ - "int", - "int" - ] - }, - { - "name": "free", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setContextId", - "parameterTypes": [ - "long", - "java.lang.String" - ] - }, - { - "name": "setOptions", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "getOptions", - "parameterTypes": [ - "long" - ] - }, - { - "name": "clearOptions", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "setCipherSuite", - "parameterTypes": [ - "long", - "java.lang.String" - ] - }, - { - "name": "setCipherSuite", - "parameterTypes": [ - "long", - "java.lang.String", - "boolean" - ] - }, - { - "name": "setCertificateChainFile", - "parameterTypes": [ - "long", - "java.lang.String", - "boolean" - ] - }, - { - "name": "setCertificateChainBio", - "parameterTypes": [ - "long", - "long", - "boolean" - ] - }, - { - "name": "setCertificate", - "parameterTypes": [ - "long", - "java.lang.String", - "java.lang.String", - "java.lang.String" - ] - }, - { - "name": "setCertificateBio", - "parameterTypes": [ - "long", - "long", - "long", - "java.lang.String" - ] - }, - { - "name": "setSessionCacheSize", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "getSessionCacheSize", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setSessionCacheTimeout", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "getSessionCacheTimeout", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setSessionCacheMode", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "getSessionCacheMode", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionAccept", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionAcceptGood", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionAcceptRenegotiate", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionCacheFull", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionCbHits", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionConnect", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionConnectGood", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionConnectRenegotiate", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionHits", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionMisses", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionNumber", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionTimeouts", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionTicketKeyNew", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionTicketKeyResume", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionTicketKeyRenew", - "parameterTypes": [ - "long" - ] - }, - { - "name": "sessionTicketKeyFail", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setCACertificateBio", - "parameterTypes": [ - "long", - "long" - ] - }, - { - "name": "setVerify", - "parameterTypes": [ - "long", - "int", - "int" - ] - }, - { - "name": "setCertVerifyCallback", - "parameterTypes": [ - "long", - "io.netty.internal.tcnative.CertificateVerifier" - ] - }, - { - "name": "setCertRequestedCallback", - "parameterTypes": [ - "long", - "io.netty.internal.tcnative.CertificateRequestedCallback" - ] - }, - { - "name": "setCertificateCallback", - "parameterTypes": [ - "long", - "io.netty.internal.tcnative.CertificateCallback" - ] - }, - { - "name": "setSniHostnameMatcher", - "parameterTypes": [ - "long", - "io.netty.internal.tcnative.SniHostNameMatcher" - ] - }, - { - "name": "setNpnProtos", - "parameterTypes": [ - "long", - "java.lang.String[]", - "int" - ] - }, - { - "name": "setAlpnProtos", - "parameterTypes": [ - "long", - "java.lang.String[]", - "int" - ] - }, - { - "name": "setTmpDHLength", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "setSessionIdContext", - "parameterTypes": [ - "long", - "byte[]" - ] - }, - { - "name": "setMode", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "getMode", - "parameterTypes": [ - "long" - ] - }, - { - "name": "enableOcsp", - "parameterTypes": [ - "long", - "boolean" - ] - }, - { - "name": "disableOcsp", - "parameterTypes": [ - "long" - ] - }, - { - "name": "getSslCtx", - "parameterTypes": [ - "long" - ] - }, - { - "name": "setUseTasks", - "parameterTypes": [ - "long", - "boolean" - ] - }, - { - "name": "setPrivateKeyMethod", - "parameterTypes": [ - "long", - "io.netty.internal.tcnative.SSLPrivateKeyMethod" - ] - }, - { - "name": "setSSLSessionCache", - "parameterTypes": [ - "long", - "io.netty.internal.tcnative.SSLSessionCache" - ] - }, - { - "name": "setNumTickets", - "parameterTypes": [ - "long", - "int" - ] - }, - { - "name": "setSessionTicketKeys0", - "parameterTypes": [ - "long", - "byte[]" - ] - } - ] - }, - { - "name": "io.netty.channel.kqueue.KQueueStaticallyReferencedJniMethods" - }, - { - "name": "io.netty.channel.kqueue.Native" - }, - { - "name": "io.netty.channel.kqueue.BsdSocket", - "methods": [ - { - "name": "sendFile", - "parameterTypes": [ - "int", - "io.netty.channel.DefaultFileRegion", - "long", - "long", - "long" - ] - }, - { - "name": "getAcceptFilter", - "parameterTypes": [ - "int" - ] - }, - { - "name": "getTcpNoPush", - "parameterTypes": [ - "int" - ] - }, - { - "name": "getSndLowAt", - "parameterTypes": [ - "int" - ] - }, - { - "name": "getPeerCredentials", - "parameterTypes": [ - "int" - ] - }, - { - "name": "setAcceptFilter", - "parameterTypes": [ - "int", - "java.lang.String", - "java.lang.String" - ] - }, - { - "name": "setTcpNoPush", - "parameterTypes": [ - "int", - "int" - ] - }, - { - "name": "setSndLowAt", - "parameterTypes": [ - "int", - "int" - ] - } - ] - } -] diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/native-image.properties b/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/native-image.properties deleted file mode 100644 index a45294b369f3f..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/native-image.properties +++ /dev/null @@ -1,45 +0,0 @@ -Args=\ - --enable-url-protocols=http,https \ - --initialize-at-run-time=io.netty.buffer.AbstractReferenceCountedByteBuf,\ - io.netty.buffer.PooledByteBufAllocator,\ - io.netty.buffer.UnpooledDirectByteBuf,\ - io.netty.buffer.UnpooledHeapByteBuf,\ - io.netty.buffer.UnpooledUnsafeDirectByteBuf,\ - io.netty.channel.epoll.Epoll,\ - io.netty.channel.epoll.EpollEventArray,\ - io.netty.channel.epoll.EpollEventLoop,\ - io.netty.channel.epoll.LinuxSocket,\ - io.netty.channel.epoll.Native,\ - io.netty.channel.kqueue.KQueue,\ - io.netty.channel.kqueue.KQueueEventArray,\ - io.netty.channel.kqueue.KQueueEventLoop,\ - io.netty.channel.kqueue.Native,\ - io.netty.channel.unix.Errors,\ - io.netty.channel.unix.IovArray,\ - io.netty.channel.unix.Limits,\ - io.netty.channel.unix.Socket,\ - io.netty.handler.codec.compression.BrotliDecoder,\ - io.netty.handler.codec.compression.BrotliDecoder$1,\ - io.netty.handler.codec.http.HttpObjectEncoder,\ - io.netty.handler.codec.http.websocketx.WebSocket00FrameEncoder,\ - io.netty.handler.ssl.BouncyCastleAlpnSslUtils,\ - io.netty.handler.ssl.ConscryptAlpnSslEngine,\ - io.netty.handler.ssl.JdkNpnApplicationProtocolNegotiator,\ - io.netty.handler.ssl.JettyAlpnSslEngine$ClientEngine,\ - io.netty.handler.ssl.JettyAlpnSslEngine$ServerEngine,\ - io.netty.handler.ssl.JettyNpnSslEngine,\ - io.netty.handler.ssl.OpenSsl,\ - io.netty.handler.ssl.OpenSslPrivateKeyMethod,\ - io.netty.handler.ssl.ReferenceCountedOpenSslEngine,\ - io.netty.handler.ssl.ReferenceCountedOpenSslServerContext,\ - io.netty.handler.ssl.ReferenceCountedOpenSslClientContext,\ - io.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator,\ - io.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator,\ - io.netty.handler.ssl.util.ThreadLocalInsecureRandom,\ - io.netty.internal.tcnative.AsyncSSLPrivateKeyMethod,\ - io.netty.internal.tcnative.CertificateVerifier,\ - io.netty.internal.tcnative.SSL,\ - io.netty.internal.tcnative.SSLPrivateKeyMethod,\ - io.netty.util.AbstractReferenceCounted,\ - io.netty.util.internal.logging.Log4JLogger - diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/reflect-config.json b/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/reflect-config.json deleted file mode 100644 index 9cfd276e55ce4..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/META-INF/native-image/com.azure/azure-core-http-netty/reflect-config.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "name": "io.netty.channel.socket.nio.NioSocketChannel", - "methods": [ - { - "name": "" - } - ] - } -] diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/azure-aot-graalvm-support-netty.properties b/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/azure-aot-graalvm-support-netty.properties deleted file mode 100644 index ca812989b4f27..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/main/resources/azure-aot-graalvm-support-netty.properties +++ /dev/null @@ -1,2 +0,0 @@ -name=${project.artifactId} -version=${project.version} diff --git a/sdk/aot/azure-aot-graalvm-support-netty/src/samples/README.md b/sdk/aot/azure-aot-graalvm-support-netty/src/samples/README.md deleted file mode 100644 index 898a7879184bd..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support-netty/src/samples/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Azure GraalVM Netty Support client library for Java - -## Getting started -Getting started explained in detail [here][SDK_README_GETTING_STARTED]. - -## Key concepts -Key concepts are explained in detail [here][SDK_README_KEY_CONCEPTS]. - -## Examples -The following sections provide several code snippets covering some of the most common scenarios, including: - -## Troubleshooting -Troubleshooting steps can be found [here][SDK_README_TROUBLESHOOTING]. - -## Next steps -See [Next steps][SDK_README_NEXT_STEPS]. - -## Contributing -This project welcomes contributions and suggestions. Find [more contributing][SDK_README_CONTRIBUTING] details here. - - -[SDK_README_CONTRIBUTING]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support-netty/README.md#contributing -[SDK_README_GETTING_STARTED]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support-netty/README.md#getting-started -[SDK_README_TROUBLESHOOTING]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support-netty/README.md#troubleshooting -[SDK_README_KEY_CONCEPTS]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support-netty/README.md#key-concepts -[SDK_README_NEXT_STEPS]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support-netty/README.md#next-steps - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Faot%2Fazure-aot-graalvm-support-netty%2FREADME.png) diff --git a/sdk/aot/azure-aot-graalvm-support/CHANGELOG.md b/sdk/aot/azure-aot-graalvm-support/CHANGELOG.md deleted file mode 100644 index 5fbcba058d86d..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/CHANGELOG.md +++ /dev/null @@ -1,31 +0,0 @@ -# Release History - -## 1.0.0-beta.4 (Unreleased) - -### Features Added - -### Breaking Changes - -### Bugs Fixed - -### Other Changes - -## 1.0.0-beta.3 (2023-04-04) - -### Other Changes -- Marked this library as deprecated. Please refer to the [blog post](https://devblogs.microsoft.com/azure-sdk/announcing-graalvm-support-in-azure-sdk-for-java-and-spring-cloud-azure-libraries/) for more details on GraalVM support in Azure SDK for Java. -- Changed the proxy interface package names to match the 1.28.0 version of `azure-core` - -## 1.0.0-beta.2 (2022-04-25) - -### Features Added -- Added support for Storage File Share and Storage Queues - -## 1.0.0-beta.1 (2022-04-08) -Version 1.0.0-beta.1 is a preview of our efforts in creating a client library for Azure GraalVM Support that is -developer-friendly, idiomatic to the Java ecosystem, and as consistent across different languages and platforms as -possible. The principles that guide our efforts can be found in the -[Azure SDK Design Guidelines for Java](https://azure.github.io/azure-sdk/java_introduction.html). - -## Features Added -- Initial release. Please see the README and wiki for information on using the new library. diff --git a/sdk/aot/azure-aot-graalvm-support/README.md b/sdk/aot/azure-aot-graalvm-support/README.md deleted file mode 100644 index 91eb314f09e88..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/README.md +++ /dev/null @@ -1,139 +0,0 @@ -# Azure GraalVM Support client library for Java - -> **IMPORTANT** Please note that this package is deprecated and will no longer be updated. The necessary configuration files to support -> native image compilation using GraalVM is now directly available on respective client libraries. It is no longer required -> to add this package as a dependency to build native images with Azure SDK for Java. -> Please refer to the [blog post](https://devblogs.microsoft.com/azure-sdk/announcing-graalvm-support-in-azure-sdk-for-java-and-spring-cloud-azure-libraries/) for more details on GraalVM support in Azure SDK for Java. - -The Azure GraalVM Support client library provides support for applications using [Azure client libraries](https://azure.github.io/azure-sdk/releases/latest/java.html) to be built as [GraalVM native -images](https://www.graalvm.org/22.0/reference-manual/native-image/). The library contains all the necessary -[configuration files](https://www.graalvm.org/22.0/reference-manual/native-image/BuildConfiguration/) and [GraalVM -features](https://www.graalvm.org/sdk/javadoc/index.html?org/graalvm/nativeimage/hosted/Feature.html) required to build -a native image of an application that uses Azure client libraries. - -**NOTE:**: This library is a preview and is intended to enable applications using Azure client libraries to quickly -build and validate native images. However, this is not a stable, GA version and is not officially supported to use in production -environments. - -## Getting started - -### Prerequisites -- A [Java Development Kit (JDK)][jdk_link], version 8 or later. -- [Azure Subscription][azure_subscription] -- [GraalVM](https://www.graalvm.org/downloads/) version 22 or later. -- [GraalVM Native Image](https://www.graalvm.org/22.0/reference-manual/native-image/) - -For more details, please refer to [Getting started with GraalVM](https://www.graalvm.org/22.0/docs/getting-started/) -documentation. - -### Include the package - -[//]: # ({x-version-update-start;com.azure:azure-aot-graalvm-support;current}) -```xml - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.3 - -``` -[//]: # ({x-version-update-end}) - -Also, include the `azure-aot-graalvm-support-netty` package to bring in the configuration files required for Netty HTTP -client. For more details on this library, please refer to [this README](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support-netty/README.md). - -[//]: # ({x-version-update-start;com.azure:azure-aot-graalvm-support-netty;current}) -```xml - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.3 - -``` -[//]: # ({x-version-update-end}) - -## Key concepts - -### Native Image creation - -Native Image is a technology to compile your Java application ahead of time into a native image which can run as a -standalone application. The native image created through this ahead-of-time compilation will include all the -necessary classes from the application, it's dependencies and any other natively linked JDK code. For more details -on creating the native image please refer to [building a native image](https://www.graalvm.org/22.0/reference-manual/native-image/#build-a-native-image) documentation. - -### GraalVM configuration files - -GraalVM is a high-performance runtime that creates native images by compiling the Java code ahead of time. Due to -this ahead-of-time compilation into a native image, the native image creation requires statically analyzing all -classes of the application and their dependencies to determine which classes and methods are reachable during the -application execution. However, there are scenarios where Java allows looking up classes, methods and fields at -runtime through reflection. While GraalVM does a best-effort discovery of all classes ahead of time, it will not be -able to detect all classes that are reflectively accessed. So, developers can provide configuration files that -contain details of all necessary classes that are reflectively accessed. This supplementary information is then used -to create the native image and make these classes available at runtime. - -This library provides all the necessary configuration files for using Azure client libraries. - -## Examples - -#### App Configuration -- [Sample demonstrating the creation and use of App Configuration client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/appconfiguration/AppConfigurationSample.java) - -Please refer to [Application Configuration](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/appconfiguration/azure-data-appconfiguration) client library documentation for more details. - -#### Key Vault -- [Sample demonstrating the creation and use of Key Vault Certificates client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/certificates/KeyVaultCertificatesSample.java) -- [Sample demonstrating the creation and use of Key Vault Keys client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/keys/KeyVaultKeysSample.java) -- [Sample demonstrating the creation and use of Key Vault Secrets client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/keyvault/secrets/KeyVaultSecretsSample.java) - -Please refer to [Key Vault](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/keyvault) client library documentation for more details. - -#### Storage Blob -- [Sample demonstrating the creation and use of Storage Blob client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/storage/blob/StorageBlobSample.java) - -Please refer to [Storage Blob](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/storage/azure-storage-blob) client library documentation for more details. - -#### Event Hubs -- [Sample demonstrating the creation and use of Event Hubs producer client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/eventhubs/EventHubsSample.java) - -Please refer to [Event Hubs](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/eventhubs/azure-messaging-eventhubs) client library documentation for more details. - -#### Form Recognizer -- [Sample demonstrating the creation and use of Form Recognizer client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/formrecognizer/FormRecognizerSample.java) - -Please refer to [Form Recognizer](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/formrecognizer/azure-ai-formrecognizer) client library documentation for more details. - -#### Text Analytics -- [Sample demonstrating the creation and use of Text Analytics client](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-samples/src/main/java/com/azure/aot/graalvm/samples/textanalytics/TextAnalyticsSample.java) - -Please refer to [Text Analytics](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/textanalytics/azure-ai-textanalytics) client library documentation for more details. - -## Troubleshooting - -## Next steps -The [azure-aot-graalvm-samples](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/aot/azure-aot-graalvm-samples) -library consists of all above samples bundled into a single Maven project that can be compiled with `mvn clean -install -Pnative` to build the native image and execute all the samples. - -## Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License -Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. -For details, visit [https://cla.microsoft.com](https://cla.microsoft.com). - -When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the -PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this -once across all repos using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact -[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - - -[cla]: https://cla.microsoft.com -[coc]: https://opensource.microsoft.com/codeofconduct/ -[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ -[coc_contact]: mailto:opencode@microsoft.com -[jdk_link]: https://learn.microsoft.com/java/azure/jdk/?view=azure-java-stable -[azure_subscription]: https://azure.microsoft.com/free - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Faot%2Fazure-aot-graalvm-support%2FREADME.png) diff --git a/sdk/aot/azure-aot-graalvm-support/pom.xml b/sdk/aot/azure-aot-graalvm-support/pom.xml deleted file mode 100644 index 84a238bb80308..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/pom.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - 4.0.0 - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.4 - - jar - Microsoft Azure GraalVM support - - This package is deprecated will have no further updates. Dependency on this library is no longer required to build native images with Azure SDK for Java. - For more details, please refer to https://devblogs.microsoft.com/azure-sdk/announcing-graalvm-support-in-azure-sdk-for-java-and-spring-cloud-azure-libraries - - - com.azure - azure-client-sdk-parent - 1.7.0 - ../../parents/azure-client-sdk-parent - - https://github.com/Azure/azure-sdk-for-java - - - - The MIT License (MIT) - http://opensource.org/licenses/MIT - repo - - - - - - azure-java-build-docs - ${site.url}/site/${project.artifactId} - - - - - scm:git:https://github.com/Azure/azure-sdk-for-java - scm:git:git@github.com:Azure/azure-sdk-for-java.git - HEAD - - - - UTF-8 - - - - - - microsoft - Microsoft - - - - - - org.graalvm.sdk - graal-sdk - 22.0.0.2 - - - org.graalvm.nativeimage - svm - 22.0.0.2 - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.5.0 - - - - - org.graalvm.sdk:graal-sdk:[22.0.0.2] - org.graalvm.nativeimage:svm:[22.0.0.2] - - - - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.10.1 - - - attach-javadocs - - jar - - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.4.2 - - - empty-javadoc-jar-with-readme - package - - jar - - - javadoc - ${project.basedir}/javadocTemp - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 3.1.0 - - - copy-readme-to-javadocTemp - prepare-package - - - Deleting existing ${project.basedir}/javadocTemp - - - - Copying ${project.basedir}/README.md to - ${project.basedir}/javadocTemp/README.md - - - - - - run - - - - - - - - diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/ClassReflectionAttributes.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/ClassReflectionAttributes.java deleted file mode 100644 index 0d65eaf0581e2..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/ClassReflectionAttributes.java +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.support.implementation; - -import java.util.EnumSet; -import java.util.Objects; - -/** - * Represents the attributes of a given class that should be made available reflectively as part of a GraalVM native - * image compilation. - */ -public final class ClassReflectionAttributes { - private final String name; - private final EnumSet set; - - public enum ReflectionAttributes { - DECLARED_FIELDS, - PUBLIC_FIELDS, - DECLARED_CONSTRUCTORS, - PUBLIC_CONSTRUCTORS, - DECLARED_METHODS, - PUBLIC_METHODS, - DECLARED_CLASSES, - PUBLIC_CLASSES - } - - private ClassReflectionAttributes(String name, EnumSet set) { - this.name = Objects.requireNonNull(name); - this.set = set; - } - - public static ClassReflectionAttributes createWithAll(String name) { - return create(name, EnumSet.allOf(ReflectionAttributes.class)); - } - - public static ClassReflectionAttributes create(String name, EnumSet attributes) { - return new ClassReflectionAttributes(name, attributes); - } - - public static ClassReflectionAttributes createWithAllDeclared(String name) { - return new ClassReflectionAttributes(name, - EnumSet.of(ReflectionAttributes.DECLARED_CLASSES, ReflectionAttributes.DECLARED_FIELDS, - ReflectionAttributes.DECLARED_CONSTRUCTORS, ReflectionAttributes.DECLARED_METHODS)); - } - - public static ClassReflectionAttributes createWithAllPublic(String name) { - return new ClassReflectionAttributes(name, - EnumSet.of(ReflectionAttributes.PUBLIC_CLASSES, ReflectionAttributes.PUBLIC_FIELDS, - ReflectionAttributes.PUBLIC_CONSTRUCTORS, ReflectionAttributes.PUBLIC_METHODS)); - } - - public String getName() { - return name; - } - - public boolean includeDeclaredFields() { - return set.contains(ReflectionAttributes.DECLARED_FIELDS); - } - - public boolean includePublicFields() { - return set.contains(ReflectionAttributes.PUBLIC_FIELDS); - } - - public boolean includeDeclaredConstructors() { - return set.contains(ReflectionAttributes.DECLARED_CONSTRUCTORS); - } - - public boolean includePublicConstructors() { - return set.contains(ReflectionAttributes.PUBLIC_CONSTRUCTORS); - } - - public boolean includeDeclaredMethods() { - return set.contains(ReflectionAttributes.DECLARED_METHODS); - } - - public boolean includePublicMethods() { - return set.contains(ReflectionAttributes.PUBLIC_METHODS); - } - - public boolean includeDeclaredClasses() { - return set.contains(ReflectionAttributes.DECLARED_CLASSES); - } - - public boolean includePublicClasses() { - return set.contains(ReflectionAttributes.PUBLIC_CLASSES); - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final ClassReflectionAttributes that = (ClassReflectionAttributes) o; - return name.equals(that.name); - } - - @Override - public int hashCode() { - return Objects.hash(name); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeature.java deleted file mode 100644 index 5829a660af5f9..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeature.java +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.support.implementation; - -import org.graalvm.nativeimage.hosted.Feature; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Set; -import java.util.TreeSet; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.findClass; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.getClassesForPackage; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.registerClass; - -/** - * Implementations of this interface should configure the features specific to the Azure SDK client libraries. - */ -public interface GraalVMFeature extends Feature { - - default Set getDynamicProxies() { - return Collections.emptySet(); - } - - default Set getReflectionClasses() { - return Collections.emptySet(); - } - - /** - * This should the root package of the library - all classes within that package (and all sub-packages, including - * implementation classes) will be made available for reflection. - */ - String getRootPackage(); - - @Override - default void beforeAnalysis(final BeforeAnalysisAccess access) { - Feature.super.beforeAnalysis(access); - - // register the reflection classes and dynamic proxies - final Set reflectionClasses = getReflectionClasses(); - final Set dynamicProxies = getDynamicProxies(); - - // Before we do that, we validate each of the classes specified can be found on the classpath. - // If we can't find **all** of them, we don't proceed and we log an error to the console. - final Set missingClasses = new TreeSet<>(String::compareTo); - reflectionClasses.forEach(cls -> { - if (!findClass(access, cls.getName()).isPresent()) { - missingClasses.add(cls.getName()); - } - }); - - dynamicProxies.forEach(interfaces -> { - Arrays.stream(interfaces).forEach(cls -> { - if (!findClass(access, cls).isPresent()) { - missingClasses.add(cls); - } - }); - }); - - if (!missingClasses.isEmpty()) { - System.out.println("AZURE SDK: Not registering Azure GraalVM support for " + getClass() - + " as not all specified classes were found on classpath. Missing classes are:"); - missingClasses.forEach(cls -> System.out.println(" - " + cls)); - } else { - System.out.println("AZURE SDK: Registering Azure GraalVM support for " + getClass()); - reflectionClasses.forEach(reflectiveClass -> registerClass(access, reflectiveClass)); - dynamicProxies.forEach(interfaces -> GraalVMFeatureUtils.addProxyClass(access, interfaces)); - - // we also register all other classes as discovered in the exported packages set - getClassesForPackage(access, getRootPackage(), true).sorted() - .map(ClassReflectionAttributes::createWithAllDeclared) // create ReflectiveClass instances for all, with full API access enabled - .filter(reflectiveClass -> !reflectionClasses.contains(reflectiveClass)) // don't overwrite custom rules - .forEach(reflectiveClass -> registerClass(access, reflectiveClass)); - } - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeatureUtils.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeatureUtils.java deleted file mode 100644 index 86cb88686f2c6..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/GraalVMFeatureUtils.java +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.support.implementation; - -import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; -import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.hosted.Feature.BeforeAnalysisAccess; -import org.graalvm.nativeimage.hosted.RuntimeReflection; - -import java.io.IOException; -import java.net.JarURLConnection; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.stream.Stream; - -/** - * Utility class to configure GraalVM features. - */ -public final class GraalVMFeatureUtils { - - /** - * Registers the given interfaces for dynamic proxy generation. - * - * @param access The {@link BeforeAnalysisAccess} instance - * @param interfaces the list of interfaces that the generated proxy can implement - */ - public static void addProxyClass(final Feature.FeatureAccess access, final String... interfaces) { - final List> classList = new ArrayList<>(); - for (final String anInterface : interfaces) { - final Class clazz = access.findClassByName(anInterface); - if (clazz != null) { - classList.add(clazz); - } - } - if (classList.size() == interfaces.length) { - ImageSingletons.lookup(DynamicProxyRegistry.class) - .addProxyClass(classList.toArray(new Class[interfaces.length])); - } - } - - @SafeVarargs - @SuppressWarnings("varargs") - public static Set setOf(final T... s) { - final Set set = new LinkedHashSet<>(s.length); - set.addAll(Arrays.asList(s)); - return set; - } - - @SafeVarargs - @SuppressWarnings("varargs") - public static Set setsOf(final T[]... s) { - final Set set = new LinkedHashSet<>(s.length); - Collections.addAll(set, s); - return set; - } - - public static Optional> findClass(final Feature.FeatureAccess access, final String className) { - return Optional.ofNullable(access.findClassByName(className)); - } - - public static String[] interfaces(String... strings) { - return strings; - } - - public static void registerClass(final Feature.FeatureAccess access, - final ClassReflectionAttributes reflectiveClass) { - GraalVMFeatureUtils.findClass(access, reflectiveClass.getName()).ifPresent(cls -> { - RuntimeReflection.register(cls); - - // fields - if (reflectiveClass.includeDeclaredFields()) { - RuntimeReflection.register(cls.getDeclaredFields()); - } - if (reflectiveClass.includePublicFields()) { - RuntimeReflection.register(cls.getFields()); - } - - // constructors - if (reflectiveClass.includeDeclaredConstructors()) { - RuntimeReflection.register(cls.getDeclaredConstructors()); - } - if (reflectiveClass.includePublicConstructors()) { - RuntimeReflection.register(cls.getConstructors()); - } - - // methods - if (reflectiveClass.includeDeclaredMethods()) { - RuntimeReflection.register(cls.getDeclaredMethods()); - } - if (reflectiveClass.includePublicMethods()) { - RuntimeReflection.register(cls.getMethods()); - } - - // classes - if (reflectiveClass.includeDeclaredClasses()) { - RuntimeReflection.register(cls.getDeclaredClasses()); - } - if (reflectiveClass.includePublicClasses()) { - RuntimeReflection.register(cls.getClasses()); - } - }); - } - - public static Stream getClassesForPackage(final Feature.FeatureAccess access, final String packageName, - final boolean recursive) { - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final String packagePath = packageName.replace('.', '/'); - - try { - final Enumeration resources = classLoader.getResources(packagePath); - while (resources.hasMoreElements()) { - final URL url = resources.nextElement(); - final URLConnection connection = url.openConnection(); - if (connection instanceof JarURLConnection) { - return findClassesInJar(access, ((JarURLConnection) connection).getJarFile(), packageName, - recursive); - } - } - } catch (IOException e) { - throw new RuntimeException("Could not enable reflective access to classes from package " + packageName, e); - } - - return Stream.empty(); - } - - private static Stream findClassesInJar(final Feature.FeatureAccess access, final JarFile jarFile, - final String packageName, final boolean recursive) { - final List classNames = new ArrayList<>(); - final Enumeration entries = jarFile.entries(); - - // This enumerates all files in a single jar, so we need to be sure the entry is specifically in the - // specified package, and not a sub-package - final int packageDepth = countInString(packageName, '.'); - while (entries.hasMoreElements()) { - final String entryName = entries.nextElement().getName(); - - // we compare the package depth of the given entry with the package depth of the package we are looking for. - // At this point the entry is using forward slashes for packages, so we adjust accordingly here, and we - // subtract one to account for the slash before the class name - if (!recursive && countInString(entryName, '/') - 1 != packageDepth) { - continue; - } - - if (entryName.endsWith(".class")) { - String fqcn = entryName.replace('/', '.').replace(".class", ""); - - if (fqcn.startsWith(packageName)) { - classNames.add(fqcn); - } - } - } - - return classNames.stream(); - } - - private static int countInString(String haystack, char needle) { - int count = 0; - for (int i = 0; i < haystack.length(); i++) { - if (haystack.charAt(i) == needle) { - count++; - } - } - return count; - } - - private GraalVMFeatureUtils() { - // private ctor - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AppConfigFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AppConfigFeature.java deleted file mode 100644 index 5bd9c3efe909f..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AppConfigFeature.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class AppConfigFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.data.appconfiguration"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.data.appconfiguration.implementation.ConfigurationService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AzureCoreFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AzureCoreFeature.java deleted file mode 100644 index 3deebdc1ab649..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/AzureCoreFeature.java +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.ClassReflectionAttributes; -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.ClassReflectionAttributes.createWithAllDeclared; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setOf; - -@AutomaticFeature -public class AzureCoreFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.core"; - } - - @Override - public Set getReflectionClasses() { - return setOf(createWithAllDeclared("com.azure.core.util.DateTimeRfc1123"), - createWithAllDeclared("com.azure.core.http.rest.StreamResponse")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/CosmosFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/CosmosFeature.java deleted file mode 100644 index ac5b974069548..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/CosmosFeature.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -@AutomaticFeature -public class CosmosFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.cosmos"; - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/EventHubsFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/EventHubsFeature.java deleted file mode 100644 index 9fc0038a3e45c..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/EventHubsFeature.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -@AutomaticFeature -public class EventHubsFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.messaging.eventhubs"; - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/FormRecognizerFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/FormRecognizerFeature.java deleted file mode 100644 index 0641d6efb5797..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/FormRecognizerFeature.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class FormRecognizerFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.ai.formrecognizer"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces( - "com.azure.ai.formrecognizer.documentanalysis.implementation.FormRecognizerClientImpl$FormRecognizerClientService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/IdentityFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/IdentityFeature.java deleted file mode 100644 index d37af4f8d2cf6..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/IdentityFeature.java +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.ClassReflectionAttributes; -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.ClassReflectionAttributes.createWithAllDeclared; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setOf; - -@AutomaticFeature -public class IdentityFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.identity"; - } - - @Override - public Set getReflectionClasses() { - return setOf(createWithAllDeclared("com.microsoft.aad.msal4j.AadInstanceDiscoveryResponse"), - createWithAllDeclared("com.microsoft.aad.msal4j.InstanceDiscoveryMetadataEntry"), - - // this is due to Msal4j library dependency - createWithAllDeclared("java.util.HashSet")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultCertificatesFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultCertificatesFeature.java deleted file mode 100644 index 3031994f2294b..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultCertificatesFeature.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class KeyvaultCertificatesFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.security.keyvault.certificates"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.security.keyvault.certificates.implementation.CertificateService"), - interfaces("com.microsoft.aad.msal4jextensions.persistence.mac.ISecurityLibrary")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultKeysFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultKeysFeature.java deleted file mode 100644 index 2310a6c0b99d8..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultKeysFeature.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class KeyvaultKeysFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.security.keyvault.keys"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.security.keyvault.keys.implementation.KeyService"), - interfaces("com.azure.security.keyvault.keys.cryptography.implementation.CryptographyService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultSecretsFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultSecretsFeature.java deleted file mode 100644 index 7f5494a3dc662..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/KeyvaultSecretsFeature.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class KeyvaultSecretsFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.security.keyvault.secrets"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.security.keyvault.secrets.implementation.SecretService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageBlobFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageBlobFeature.java deleted file mode 100644 index 6923923c1e73a..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageBlobFeature.java +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class StorageBlobFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.storage.blob"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.storage.blob.implementation.AppendBlobsImpl$AppendBlobsService"), - interfaces("com.azure.storage.blob.implementation.BlobsImpl$BlobsService"), - interfaces("com.azure.storage.blob.implementation.BlockBlobsImpl$BlockBlobsService"), - interfaces("com.azure.storage.blob.implementation.ContainersImpl$ContainersService"), - interfaces("com.azure.storage.blob.implementation.PageBlobsImpl$PageBlobsService"), - interfaces("com.azure.storage.blob.implementation.ServicesImpl$ServicesService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageFileShareFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageFileShareFeature.java deleted file mode 100644 index 6468ce213c7e8..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageFileShareFeature.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class StorageFileShareFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.storage.file.share"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.storage.file.share.implementation.DirectoriesImpl$DirectoriesService"), - interfaces("com.azure.storage.file.share.implementation.FilesImpl$FilesService"), - interfaces("com.azure.storage.file.share.implementation.ServicesImpl$ServicesService"), - interfaces("com.azure.storage.file.share.implementation.SharesImpl$SharesService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageQueueFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageQueueFeature.java deleted file mode 100644 index b048934b4e471..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/StorageQueueFeature.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class StorageQueueFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.storage.queue"; - } - - @Override - public Set getDynamicProxies() { - return setsOf(interfaces("com.azure.storage.queue.implementation.MessageIdsImpl$MessageIdsService"), - interfaces("com.azure.storage.queue.implementation.MessagesImpl$MessagesService"), - interfaces("com.azure.storage.queue.implementation.QueuesImpl$QueuesService"), - interfaces("com.azure.storage.queue.implementation.ServicesImpl$ServicesService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/TextAnalyticsFeature.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/TextAnalyticsFeature.java deleted file mode 100644 index f15d95f296dda..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/TextAnalyticsFeature.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -package com.azure.aot.graalvm.support.implementation.features; - -import com.azure.aot.graalvm.support.implementation.GraalVMFeature; -import com.oracle.svm.core.annotate.AutomaticFeature; - -import java.util.Set; - -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.interfaces; -import static com.azure.aot.graalvm.support.implementation.GraalVMFeatureUtils.setsOf; - -@AutomaticFeature -public class TextAnalyticsFeature implements GraalVMFeature { - - @Override - public String getRootPackage() { - return "com.azure.ai.textanalytics"; - } - - @Override - public Set getDynamicProxies() { - return setsOf( - interfaces("com.azure.ai.textanalytics.implementation.TextAnalyticsClientImpl$TextAnalyticsClientService")); - } -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/package-info.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/package-info.java deleted file mode 100644 index f60df0af0a64e..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/features/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -/** - * GraalVM features for client libraries. - */ -package com.azure.aot.graalvm.support.implementation.features; diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/package-info.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/package-info.java deleted file mode 100644 index dcae84695e860..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/com/azure/aot/graalvm/support/implementation/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -/** - * GraalVM configuration classes. - */ -package com.azure.aot.graalvm.support.implementation; diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/java/module-info.java b/sdk/aot/azure-aot-graalvm-support/src/main/java/module-info.java deleted file mode 100644 index dcbb865e5eb31..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/java/module-info.java +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -module com.azure.aot.graalvm.support { - requires transitive org.graalvm.sdk; - requires transitive svm; -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core-amqp/reflect-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core-amqp/reflect-config.json deleted file mode 100644 index ac7e4afa14f70..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core-amqp/reflect-config.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "name":"com.azure.core.amqp.models.CbsAuthorizationType", - "methods":[{"name":"","parameterTypes":[] }] - } -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/native-image.properties b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/native-image.properties deleted file mode 100644 index db4ec164a145a..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/native-image.properties +++ /dev/null @@ -1,14 +0,0 @@ -Args=\ - --initialize-at-build-time=org.apache.log4j.Logger,\ - org.slf4j.LoggerFactory,\ - org.slf4j.impl.StaticLoggerBinder,\ - com.azure.core.implementation.logging.DefaultLogger,\ - com.azure.core.test.TestBase,\ - com.azure.core.util.Configuration,\ - com.azure.core.implementation.util.EnvironmentConfiguration,\ - com.azure.core.implementation.util.EnvironmentConfiguration$EnvironmentVariablesConfigurationSource,\ - com.azure.core.util.CoreUtils,\ - com.azure.core.util.NoopConfiguration,\ - com.azure.core.util.logging.LoggingEventBuilder,\ - com.fasterxml.jackson.core.io.JsonStringEncoder,\ - com.fasterxml.jackson.core.io.CharTypes diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json deleted file mode 100644 index ee26e4e8541b9..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/reflect-config.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "name":"com.azure.core.util.logging.ClientLogger", - "allDeclaredFields":true, - "queryAllDeclaredMethods":true, - "queryAllDeclaredConstructors":true - }, - { - "name":"com.azure.core.util.CoreUtils" - } -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/resource-config.json deleted file mode 100644 index a131ef5695124..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-core/resource-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "META-INF/services/com.azure.core.http.HttpClientProvider" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-cosmos/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-cosmos/resource-config.json deleted file mode 100644 index 6011c1d557ffe..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-cosmos/resource-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "\\Qazure-cosmos.properties\\E" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json deleted file mode 100644 index eaa0f86d3bd37..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/reflect-config.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "name": "com.azure.data.appconfiguration.models.SettingFields", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.models.ConfigurationSetting", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.implementation.ConfigurationSettingPage", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.models.FeatureFlagConfigurationSetting", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.models.SecretReferenceConfigurationSetting", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.models.SettingFields", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.azure.data.appconfiguration.ConfigurationClientBuilderTest", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.azure.data.appconfiguration.models.ConfigurationSetting", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.implementation.ConfigurationSettingPage", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.models.FeatureFlagConfigurationSetting", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.azure.data.appconfiguration.models.SecretReferenceConfigurationSetting", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/resource-config.json deleted file mode 100644 index 991a61e736888..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-data-appconfiguration/resource-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "azure-data-appconfiguration.properties" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-messaging-eventhubs/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-messaging-eventhubs/resource-config.json deleted file mode 100644 index cf430e9e8f896..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-messaging-eventhubs/resource-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "\\Qazure-messaging-eventhubs.properties\\E" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-certificates/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-certificates/resource-config.json deleted file mode 100644 index 007b03e7bfc54..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-certificates/resource-config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "\\Qazure-key-vault-certificates.properties\\E" - }, - { - "pattern": "\\Qcom/sun/jna/darwin/libjnidispatch.jnilib\\E" - }, - { - "pattern": "\\QkvErrorStrings.properties\\E" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-keys/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-keys/resource-config.json deleted file mode 100644 index 0e369c7032955..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-security-keyvault-keys/resource-config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "azure-key-vault-keys.properties" - }, - { - "pattern": "kvErrorStrings.properties" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/resource-config.json deleted file mode 100644 index 8a791a164f4aa..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/azure-storage-blob/resource-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "resources": { - "includes": [ - { - "pattern": "\\Qazure-storage-blob.properties\\E" - } - ] - }, - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/native-image.properties b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/native-image.properties deleted file mode 100644 index a86e89f337521..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.azure/native-image.properties +++ /dev/null @@ -1,4 +0,0 @@ -Args=\ - --allow-incomplete-classpath \ - --report-unsupported-elements-at-runtime \ - -H:+AddAllCharsets diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.microsoft.azure/msal4j-persistence-extension/reflect-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.microsoft.azure/msal4j-persistence-extension/reflect-config.json deleted file mode 100644 index 8641f3429e057..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/com.microsoft.azure/msal4j-persistence-extension/reflect-config.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "name": "com.microsoft.aad.msal4j.IdToken", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.microsoft.aad.msal4j.ClientInfo", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.microsoft.aad.msal4j.DeviceCode", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - }, - { - "name": "com.microsoft.aad.msal4j.ErrorResponse", - "allDeclaredConstructors": true, - "allDeclaredMethods": true, - "allDeclaredFields": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/jni-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/jni-config.json deleted file mode 100644 index a1dc6d0867407..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/jni-config.json +++ /dev/null @@ -1,955 +0,0 @@ -[ - { - "name": "com.sun.jna.Callback" - }, - { - "name": "com.sun.jna.CallbackReference", - "methods": [ - { - "name": "getCallback", - "parameterTypes": [ - "java.lang.Class", - "com.sun.jna.Pointer", - "boolean" - ] - }, - { - "name": "getFunctionPointer", - "parameterTypes": [ - "com.sun.jna.Callback", - "boolean" - ] - }, - { - "name": "getNativeString", - "parameterTypes": [ - "java.lang.Object", - "boolean" - ] - }, - { - "name": "initializeThread", - "parameterTypes": [ - "com.sun.jna.Callback", - "com.sun.jna.CallbackReference$AttachOptions" - ] - } - ] - }, - { - "name": "com.sun.jna.CallbackReference$AttachOptions" - }, - { - "name": "com.sun.jna.FromNativeConverter", - "methods": [ - { - "name": "nativeType", - "parameterTypes": [] - } - ] - }, - { - "name": "com.sun.jna.IntegerType", - "fields": [ - { - "name": "value" - } - ] - }, - { - "name": "com.sun.jna.JNIEnv" - }, - { - "name": "com.sun.jna.Library" - }, - { - "name": "com.sun.jna.Native", - "methods": [ - { - "name": "dispose", - "parameterTypes": [] - }, - { - "name": "fromNative", - "parameterTypes": [ - "com.sun.jna.FromNativeConverter", - "java.lang.Object", - "java.lang.reflect.Method" - ] - }, - { - "name": "fromNative", - "parameterTypes": [ - "java.lang.Class", - "java.lang.Object" - ] - }, - { - "name": "fromNative", - "parameterTypes": [ - "java.lang.reflect.Method", - "java.lang.Object" - ] - }, - { - "name": "nativeType", - "parameterTypes": [ - "java.lang.Class" - ] - }, - { - "name": "toNative", - "parameterTypes": [ - "com.sun.jna.ToNativeConverter", - "java.lang.Object" - ] - } - ] - }, - { - "name": "com.sun.jna.Native$ffi_callback", - "methods": [ - { - "name": "invoke", - "parameterTypes": [ - "long", - "long", - "long" - ] - } - ] - }, - { - "name": "com.sun.jna.NativeMapped", - "methods": [ - { - "name": "toNative", - "parameterTypes": [] - } - ] - }, - { - "name": "com.sun.jna.Pointer", - "fields": [ - { - "name": "peer" - } - ], - "methods": [ - { - "name": "", - "parameterTypes": [ - "long" - ] - } - ] - }, - { - "name": "com.sun.jna.PointerType", - "fields": [ - { - "name": "pointer" - } - ] - }, - { - "name": "com.sun.jna.Structure", - "fields": [ - { - "name": "memory" - }, - { - "name": "typeInfo" - } - ], - "methods": [ - { - "name": "autoRead", - "parameterTypes": [] - }, - { - "name": "autoWrite", - "parameterTypes": [] - }, - { - "name": "getTypeInfo", - "parameterTypes": [] - }, - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class", - "long" - ] - } - ] - }, - { - "name": "com.sun.jna.Structure$ByValue" - }, - { - "name": "com.sun.jna.Structure$FFIType$FFITypes", - "fields": [ - { - "name": "ffi_type_double" - }, - { - "name": "ffi_type_float" - }, - { - "name": "ffi_type_longdouble" - }, - { - "name": "ffi_type_pointer" - }, - { - "name": "ffi_type_sint16" - }, - { - "name": "ffi_type_sint32" - }, - { - "name": "ffi_type_sint64" - }, - { - "name": "ffi_type_sint8" - }, - { - "name": "ffi_type_uint16" - }, - { - "name": "ffi_type_uint32" - }, - { - "name": "ffi_type_uint64" - }, - { - "name": "ffi_type_uint8" - }, - { - "name": "ffi_type_void" - } - ] - }, - { - "name": "com.sun.jna.WString", - "methods": [ - { - "name": "", - "parameterTypes": [ - "java.lang.String" - ] - } - ] - }, - { - "name": "com.sun.jna.Native", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.lang.Class", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.lang.reflect.Method", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.lang.String", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.Buffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.ByteBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.CharBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.ShortBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.IntBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.LongBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.FloatBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.nio.DoubleBuffer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.lang.Void", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Boolean", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Byte", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Character", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Short", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Integer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Long", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Float", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "java.lang.Double", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - }, - { - "name": "TYPE" - } - ] - }, - { - "name": "com.sun.jna.Pointer", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "peer", - "allowWrite": true - } - ] - }, - { - "name": "com.sun.jna.Structure$ByValue", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.WString", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.NativeMapped", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.IntegerType", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.PointerType", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.JNIEnv", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.Native$ffi_callback", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.FromNativeConverter", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.Structure", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "memory", - "allowWrite": true - }, - { - "name": "typeInfo", - "allowWrite": true - } - ], - "methods": [ - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class", - "com.sun.jna.Pointer" - ] - }, - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class", - "long" - ] - }, - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class" - ] - }, - { - "name": "getTypeInfo", - "parameterTypes": [ - "java.lang.Object" - ] - } - ] - }, - { - "name": "com.sun.jna.Callback", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.CallbackReference$AttachOptions", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.CallbackReference", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.IntegerType", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "value", - "allowWrite": true - } - ] - }, - { - "name": "com.sun.jna.PointerType", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "pointer", - "allowWrite": true - } - ] - }, - { - "name": "com.sun.jna.Structure$FFIType", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.Structure$FFIType$FFITypes", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "ffi_type_void", - "allowWrite": true - }, - { - "name": "ffi_type_float", - "allowWrite": true - }, - { - "name": "ffi_type_double", - "allowWrite": true - }, - { - "name": "ffi_type_longdouble", - "allowWrite": true - }, - { - "name": "ffi_type_uint8", - "allowWrite": true - }, - { - "name": "ffi_type_sint8", - "allowWrite": true - }, - { - "name": "ffi_type_uint16", - "allowWrite": true - }, - { - "name": "ffi_type_sint16", - "allowWrite": true - }, - { - "name": "ffi_type_uint32", - "allowWrite": true - }, - { - "name": "ffi_type_sint32", - "allowWrite": true - }, - { - "name": "ffi_type_uint64", - "allowWrite": true - }, - { - "name": "ffi_type_sint64", - "allowWrite": true - }, - { - "name": "ffi_type_pointer", - "allowWrite": true - } - ] - }, - { - "name": "com.sun.jna.NativeLong", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.ptr.PointerByReference", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "byte[][]" - }, - { - "name": "com.sun.jna.Callback" - }, - { - "name": "com.sun.jna.CallbackReference", - "methods": [ - { - "name": "getCallback", - "parameterTypes": [ - "java.lang.Class", - "com.sun.jna.Pointer", - "boolean" - ] - }, - { - "name": "getFunctionPointer", - "parameterTypes": [ - "com.sun.jna.Callback", - "boolean" - ] - }, - { - "name": "getNativeString", - "parameterTypes": [ - "java.lang.Object", - "boolean" - ] - }, - { - "name": "initializeThread", - "parameterTypes": [ - "com.sun.jna.Callback", - "com.sun.jna.CallbackReference$AttachOptions" - ] - } - ] - }, - { - "name": "com.sun.jna.CallbackReference$AttachOptions" - }, - { - "name": "com.sun.jna.FromNativeConverter", - "methods": [ - { - "name": "nativeType", - "parameterTypes": [] - } - ] - }, - { - "name": "com.sun.jna.IntegerType", - "fields": [ - { - "name": "value" - } - ] - }, - { - "name": "com.sun.jna.JNIEnv" - }, - { - "name": "com.sun.jna.Native", - "methods": [ - { - "name": "dispose", - "parameterTypes": [] - }, - { - "name": "fromNative", - "parameterTypes": [ - "com.sun.jna.FromNativeConverter", - "java.lang.Object", - "java.lang.reflect.Method" - ] - }, - { - "name": "fromNative", - "parameterTypes": [ - "java.lang.Class", - "java.lang.Object" - ] - }, - { - "name": "fromNative", - "parameterTypes": [ - "java.lang.reflect.Method", - "java.lang.Object" - ] - }, - { - "name": "nativeType", - "parameterTypes": [ - "java.lang.Class" - ] - }, - { - "name": "toNative", - "parameterTypes": [ - "com.sun.jna.ToNativeConverter", - "java.lang.Object" - ] - } - ] - }, - { - "name": "com.sun.jna.Native$ffi_callback", - "methods": [ - { - "name": "invoke", - "parameterTypes": [ - "long", - "long", - "long" - ] - } - ] - }, - { - "name": "com.sun.jna.NativeMapped", - "methods": [ - { - "name": "toNative", - "parameterTypes": [] - } - ] - }, - { - "name": "com.sun.jna.Pointer", - "fields": [ - { - "name": "peer" - } - ], - "methods": [ - { - "name": "", - "parameterTypes": [ - "long" - ] - } - ] - }, - { - "name": "com.sun.jna.PointerType", - "fields": [ - { - "name": "pointer" - } - ] - }, - { - "name": "com.sun.jna.Structure", - "fields": [ - { - "name": "memory" - }, - { - "name": "typeInfo" - } - ], - "methods": [ - { - "name": "autoRead", - "parameterTypes": [] - }, - { - "name": "autoWrite", - "parameterTypes": [] - }, - { - "name": "getTypeInfo", - "parameterTypes": [] - }, - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class", - "long" - ] - } - ] - }, - { - "name": "com.sun.jna.Structure$ByValue" - }, - { - "name": "com.sun.jna.Structure$FFIType$FFITypes", - "fields": [ - { - "name": "ffi_type_double" - }, - { - "name": "ffi_type_float" - }, - { - "name": "ffi_type_longdouble" - }, - { - "name": "ffi_type_pointer" - }, - { - "name": "ffi_type_sint16" - }, - { - "name": "ffi_type_sint32" - }, - { - "name": "ffi_type_sint64" - }, - { - "name": "ffi_type_sint8" - }, - { - "name": "ffi_type_uint16" - }, - { - "name": "ffi_type_uint32" - }, - { - "name": "ffi_type_uint64" - }, - { - "name": "ffi_type_uint8" - }, - { - "name": "ffi_type_void" - } - ] - }, - { - "name": "com.sun.jna.WString", - "methods": [ - { - "name": "", - "parameterTypes": [ - "java.lang.String" - ] - } - ] - } -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/proxy-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/proxy-config.json deleted file mode 100644 index 169c0d33834e6..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/proxy-config.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - [ - "com.sun.jna.Library" - ], - [ - "com.sun.jna.Callback" - ] -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/reflect-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/reflect-config.json deleted file mode 100644 index c5abef19aaa01..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/reflect-config.json +++ /dev/null @@ -1,89 +0,0 @@ -[ - { - "name": "com.sun.jna.CallbackReference", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.Klass", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.Native", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.Structure", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true, - "fields": [ - { - "name": "memory", - "allowWrite": true - }, - { - "name": "typeInfo" - } - ], - "methods": [ - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class", - "com.sun.jna.Pointer" - ] - }, - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class", - "long" - ] - }, - { - "name": "newInstance", - "parameterTypes": [ - "java.lang.Class" - ] - } - ] - }, - { - "name": "com.sun.jna.NativeLong", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.ptr.PointerByReference", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.jna.ptr.IntByReference", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "java.util.Base64$Decoder", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - } -] diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/resource-config.json b/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/resource-config.json deleted file mode 100644 index 7b8f03c5fcff9..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/META-INF/native-image/net.java.dev.jna/jna/resource-config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "resources": [ - { - "pattern": "\\QMETA-INF/services/jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory\\E" - }, - { - "pattern": "\\QMETA-INF/services/jdk.vm.ci.services.JVMCIServiceLocator\\E" - }, - { - "pattern": "\\Qcom/sun/jna/linux-x86-64/libjnidispatch.so\\E" - } - ], - "bundles": [] -} diff --git a/sdk/aot/azure-aot-graalvm-support/src/main/resources/azure-aot-graalvm-support.properties b/sdk/aot/azure-aot-graalvm-support/src/main/resources/azure-aot-graalvm-support.properties deleted file mode 100644 index ca812989b4f27..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/main/resources/azure-aot-graalvm-support.properties +++ /dev/null @@ -1,2 +0,0 @@ -name=${project.artifactId} -version=${project.version} diff --git a/sdk/aot/azure-aot-graalvm-support/src/samples/README.md b/sdk/aot/azure-aot-graalvm-support/src/samples/README.md deleted file mode 100644 index e0351d2174c1f..0000000000000 --- a/sdk/aot/azure-aot-graalvm-support/src/samples/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Azure GraalVM Support client library for Java - -## Getting started -Getting started explained in detail [here][SDK_README_GETTING_STARTED]. - -## Key concepts -Key concepts are explained in detail [here][SDK_README_KEY_CONCEPTS]. - -## Examples -The following sections provide several code snippets covering some of the most common scenarios, including: - -## Troubleshooting -Troubleshooting steps can be found [here][SDK_README_TROUBLESHOOTING]. - -## Next steps -See [Next steps][SDK_README_NEXT_STEPS]. - -## Contributing -This project welcomes contributions and suggestions. Find [more contributing][SDK_README_CONTRIBUTING] details here. - - -[SDK_README_CONTRIBUTING]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support/README.md#contributing -[SDK_README_GETTING_STARTED]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support/README.md#getting-started -[SDK_README_TROUBLESHOOTING]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support/README.md#troubleshooting -[SDK_README_KEY_CONCEPTS]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support/README.md#key-concepts -[SDK_README_NEXT_STEPS]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/aot/azure-aot-graalvm-support/README.md#next-steps - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Faot%2Fazure-aot-graalvm-support%2FREADME.png) diff --git a/sdk/aot/ci.yml b/sdk/aot/ci.yml deleted file mode 100644 index 727a0bbf5fec7..0000000000000 --- a/sdk/aot/ci.yml +++ /dev/null @@ -1,61 +0,0 @@ -# NOTE: Please refer to https://aka.ms/azsdk/engsys/ci-yaml before editing this file. - -trigger: - branches: - include: - - main - - hotfix/* - - release/* - paths: - include: - - sdk/aot/ - exclude: - - sdk/aot/pom.xml - - sdk/aot/azure-aot-graalvm-support/pom.xml - - sdk/aot/azure-aot-graalvm-support-netty/pom.xml - -pr: - branches: - include: - - main - - feature/* - - hotfix/* - - release/* - paths: - include: - - sdk/aot/ - exclude: - - sdk/aot/pom.xml - - sdk/aot/azure-aot-graalvm-support/pom.xml - - sdk/aot/azure-aot-graalvm-support-netty/pom.xml - -parameters: -- name: release_azureaotgraalvmsupport - displayName: 'azure-aot-graalvm-support' - type: boolean - default: true -- name: release_azureaotgraalvmsupportnetty - displayName: 'azure-aot-graalvm-support-netty' - type: boolean - default: true - -extends: - template: ../../eng/pipelines/templates/stages/archetype-sdk-client.yml - parameters: - ServiceDirectory: aot - Artifacts: - - name: azure-aot-graalvm-support - groupId: com.azure - safeName: azureaotgraalvmsupport - releaseInBatch: ${{ parameters.release_azureaotgraalvmsupport }} - skipPublishDocMs: true - - name: azure-aot-graalvm-support-netty - groupId: com.azure - safeName: azureaotgraalvmsupportnetty - releaseInBatch: ${{ parameters.release_azureaotgraalvmsupportnetty }} - skipPublishDocMs: true - AdditionalModules: - - name: azure-aot-graalvm-perf - groupId: com.azure - - name: azure-aot-graalvm-samples - groupId: com.azure diff --git a/sdk/aot/pom.xml b/sdk/aot/pom.xml deleted file mode 100644 index 0d7a4830691cb..0000000000000 --- a/sdk/aot/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.0.0 - com.azure - azure-aot-service - pom - 1.0.0 - - azure-aot-graalvm-support - azure-aot-graalvm-support-netty - azure-aot-graalvm-samples - azure-aot-graalvm-perf - - From e83191ec5df35b1d7acc35f5a583cfdc9fec8f63 Mon Sep 17 00:00:00 2001 From: vcolin7 Date: Wed, 15 Jan 2025 17:01:02 -0800 Subject: [PATCH 2/5] Removed mentions of the AOT GraalVM libraries in central files. --- .vscode/cspell.json | 2 -- eng/versioning/version_client.txt | 2 -- 2 files changed, 4 deletions(-) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index a047849643896..a5d99bb9c2726 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -68,9 +68,7 @@ "**/src/**/resources/**", "sdk/aot/azure-aot-graalvm-samples/**", "sdk/agrifood/azure-verticals-agrifood-farming/**", - "sdk/aot/azure-aot-graalvm-support-netty/**", "sdk/anomalydetector/azure-ai-anomalydetector/**", - "sdk/aot/azure-aot-graalvm-support/**", "sdk/appconfiguration/azure-spring-cloud-test-appconfiguration-config/**", "sdk/appconfiguration/azure-spring-cloud-starter-appconfiguration-config/**", "sdk/appconfiguration/azure-spring-cloud-feature-management-web/**", diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index c1184dbef8b25..a0686a90b9a6c 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -63,8 +63,6 @@ com.azure:azure-analytics-synapse-artifacts;1.0.0-beta.15;1.0.0-beta.16 com.azure:azure-analytics-synapse-spark;1.0.0-beta.5;1.0.0-beta.6 com.azure:azure-analytics-synapse-managedprivateendpoints;1.0.0-beta.5;1.0.0-beta.6 com.azure:azure-analytics-synapse-monitoring;1.0.0-beta.4;1.0.0-beta.5 -com.azure:azure-aot-graalvm-support;1.0.0-beta.3;1.0.0-beta.4 -com.azure:azure-aot-graalvm-support-netty;1.0.0-beta.3;1.0.0-beta.4 com.azure:azure-aot-graalvm-samples;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-aot-graalvm-perf;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-code-customization-parent;1.0.0-beta.1;1.0.0-beta.1 From 5a396398c462439c4a44b06ac35c10107c56e39a Mon Sep 17 00:00:00 2001 From: vcolin7 Date: Thu, 16 Jan 2025 15:17:59 -0800 Subject: [PATCH 3/5] Removed GraalVM build profiles. --- .vscode/cspell.json | 1 - eng/versioning/version_client.txt | 2 - .../azure-data-appconfiguration-perf/pom.xml | 56 ---------------- sdk/appconfiguration/ci.yml | 2 - .../azure-ai-formrecognizer-perf/pom.xml | 66 ------------------- sdk/formrecognizer/ci.yml | 2 - .../azure-security-keyvault-perf/pom.xml | 66 ------------------- sdk/keyvault/ci.yml | 2 - sdk/storage/azure-storage-perf/pom.xml | 66 ------------------- sdk/storage/ci.yml | 2 - .../azure-ai-textanalytics-perf/pom.xml | 66 ------------------- sdk/textanalytics/ci.yml | 2 - 12 files changed, 333 deletions(-) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index a5d99bb9c2726..1141fc83e4a26 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -66,7 +66,6 @@ "**/src/**/samples/**/*.ipynb", "**/sdk/**/swagger/**", "**/src/**/resources/**", - "sdk/aot/azure-aot-graalvm-samples/**", "sdk/agrifood/azure-verticals-agrifood-farming/**", "sdk/anomalydetector/azure-ai-anomalydetector/**", "sdk/appconfiguration/azure-spring-cloud-test-appconfiguration-config/**", diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index a0686a90b9a6c..ca5d6049402af 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -63,8 +63,6 @@ com.azure:azure-analytics-synapse-artifacts;1.0.0-beta.15;1.0.0-beta.16 com.azure:azure-analytics-synapse-spark;1.0.0-beta.5;1.0.0-beta.6 com.azure:azure-analytics-synapse-managedprivateendpoints;1.0.0-beta.5;1.0.0-beta.6 com.azure:azure-analytics-synapse-monitoring;1.0.0-beta.4;1.0.0-beta.5 -com.azure:azure-aot-graalvm-samples;1.0.0-beta.1;1.0.0-beta.1 -com.azure:azure-aot-graalvm-perf;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-code-customization-parent;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-communication-callautomation;1.3.1;1.4.0-beta.2 com.azure:azure-communication-callingserver;1.0.0-beta.4;1.0.0-beta.5 diff --git a/sdk/appconfiguration/azure-data-appconfiguration-perf/pom.xml b/sdk/appconfiguration/azure-data-appconfiguration-perf/pom.xml index 8e077404ba966..b112bd4551614 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration-perf/pom.xml +++ b/sdk/appconfiguration/azure-data-appconfiguration-perf/pom.xml @@ -46,60 +46,4 @@ 1.15.7 - - - - native - - - - org.graalvm.buildtools - native-maven-plugin - 0.9.19 - - ${perf.test.mainClass} - ${perf.test.imageName} - - - - build-native - - build - - package - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.4.1 - - - - java - - - - - ${perf.test.mainClass} - - - - - - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - - - com.azure - azure-identity - 1.15.0 - - - - diff --git a/sdk/appconfiguration/ci.yml b/sdk/appconfiguration/ci.yml index 2c9ef2968060a..2b21dac401030 100644 --- a/sdk/appconfiguration/ci.yml +++ b/sdk/appconfiguration/ci.yml @@ -63,5 +63,3 @@ extends: AdditionalModules: - name: perf-test-core groupId: com.azure - - name: azure-aot-graalvm-perf - groupId: com.azure diff --git a/sdk/formrecognizer/azure-ai-formrecognizer-perf/pom.xml b/sdk/formrecognizer/azure-ai-formrecognizer-perf/pom.xml index 8165b21b81445..23ac4ecbd1712 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer-perf/pom.xml +++ b/sdk/formrecognizer/azure-ai-formrecognizer-perf/pom.xml @@ -44,70 +44,4 @@ 1.15.7 - - - - native - - - - org.graalvm.buildtools - native-maven-plugin - 0.9.19 - - ${perf.test.mainClass} - ${perf.test.imageName} - - - - build-native - - build - - package - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.4.1 - - - - java - - - - - ${perf.test.mainClass} - - - - - - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - - - com.azure - azure-identity - 1.15.0 - - - - diff --git a/sdk/formrecognizer/ci.yml b/sdk/formrecognizer/ci.yml index bd13b4ae62387..18325733508de 100644 --- a/sdk/formrecognizer/ci.yml +++ b/sdk/formrecognizer/ci.yml @@ -49,5 +49,3 @@ extends: # both of these are required by the above perf library - name: perf-test-core groupId: com.azure - - name: azure-aot-graalvm-perf - groupId: com.azure diff --git a/sdk/keyvault/azure-security-keyvault-perf/pom.xml b/sdk/keyvault/azure-security-keyvault-perf/pom.xml index 312c757b2af6e..3ec8a8dab14ed 100644 --- a/sdk/keyvault/azure-security-keyvault-perf/pom.xml +++ b/sdk/keyvault/azure-security-keyvault-perf/pom.xml @@ -65,70 +65,4 @@ 1.15.7 - - - - native - - - - org.graalvm.buildtools - native-maven-plugin - 0.9.19 - - ${perf.test.mainClass} - ${perf.test.imageName} - - - - build-native - - build - - package - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.4.1 - - - - java - - - - - ${perf.test.mainClass} - - - - - - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - - - com.azure - azure-identity - 1.15.0 - - - - diff --git a/sdk/keyvault/ci.yml b/sdk/keyvault/ci.yml index 152f021d5d78e..18b2ee5f83663 100644 --- a/sdk/keyvault/ci.yml +++ b/sdk/keyvault/ci.yml @@ -109,5 +109,3 @@ extends: # required by the above perf library - name: perf-test-core groupId: com.azure - - name: azure-aot-graalvm-perf - groupId: com.azure diff --git a/sdk/storage/azure-storage-perf/pom.xml b/sdk/storage/azure-storage-perf/pom.xml index 294155b317337..aa9c0bd60e002 100644 --- a/sdk/storage/azure-storage-perf/pom.xml +++ b/sdk/storage/azure-storage-perf/pom.xml @@ -79,70 +79,4 @@ 4.9.1 - - - - native - - - - org.graalvm.buildtools - native-maven-plugin - 0.9.19 - - com.azure.storage.App - azure-storage-blob-perf - - - - build-native - - build - - package - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.4.1 - - - - java - - - - - com.azure.storage.App - - - - - - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - - - com.azure - azure-identity - 1.15.0 - - - - diff --git a/sdk/storage/ci.yml b/sdk/storage/ci.yml index 59885d09159c7..c786407844638 100644 --- a/sdk/storage/ci.yml +++ b/sdk/storage/ci.yml @@ -164,8 +164,6 @@ extends: # required by the above perf library - name: perf-test-core groupId: com.azure - - name: azure-aot-graalvm-perf - groupId: com.azure MatrixConfigs: - Name: Storage_ci Path: sdk/storage/platform-matrix-ci.json diff --git a/sdk/textanalytics/azure-ai-textanalytics-perf/pom.xml b/sdk/textanalytics/azure-ai-textanalytics-perf/pom.xml index ca10c3952b423..17f78e0631657 100644 --- a/sdk/textanalytics/azure-ai-textanalytics-perf/pom.xml +++ b/sdk/textanalytics/azure-ai-textanalytics-perf/pom.xml @@ -46,70 +46,4 @@ 1.15.7 - - - - native - - - - org.graalvm.buildtools - native-maven-plugin - 0.9.19 - - ${perf.test.mainClass} - ${perf.test.imageName} - - - - build-native - - build - - package - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.4.1 - - - - java - - - - - ${perf.test.mainClass} - - - - - - - com.azure - azure-aot-graalvm-support - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-support-netty - 1.0.0-beta.3 - - - com.azure - azure-aot-graalvm-perf - 1.0.0-beta.1 - - - com.azure - azure-identity - 1.15.0 - - - - diff --git a/sdk/textanalytics/ci.yml b/sdk/textanalytics/ci.yml index 2e5d399256b5b..8bf6d3ed65851 100644 --- a/sdk/textanalytics/ci.yml +++ b/sdk/textanalytics/ci.yml @@ -48,5 +48,3 @@ extends: # required by the above perf library - name: perf-test-core groupId: com.azure - - name: azure-aot-graalvm-perf - groupId: com.azure From 8d7a649f47a4464ffe5242e1f1395efa99db7e79 Mon Sep 17 00:00:00 2001 From: vcolin7 Date: Thu, 16 Jan 2025 15:40:04 -0800 Subject: [PATCH 4/5] Fixed pipeline issues. --- .github/CODEOWNERS | 3 --- .../checkstyle/checkstyle-suppressions.xml | 15 +-------------- .../resources/spotbugs/spotbugs-exclude.xml | 18 ------------------ .../aggregate_javadoc_configuration.txt | 1 - pom.xml | 1 - .../azure-data-appconfiguration/pom.xml | 1 - .../azure-ai-formrecognizer/pom.xml | 1 - sdk/storage/azure-storage-blob/pom.xml | 1 - .../azure-ai-textanalytics/pom.xml | 1 - 9 files changed, 1 insertion(+), 41 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 34d31698767e7..2faf09c40d5c7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -116,9 +116,6 @@ # ServiceLabel: %ARO # ServiceOwners: @mjudeikis @jim-minter @julienstroheker @amanohar -# PRLabel: %graalvm -/sdk/aot/ @srnagar @jonathangiles - # ServiceLabel: %graalvm # AzureSdkOwners: @srnagar diff --git a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml index ebf634c2a2415..019165e9fbd01 100644 --- a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml +++ b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml @@ -40,19 +40,6 @@ - - - - - - - - - @@ -161,7 +148,7 @@ - + diff --git a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml index ea96e0bc08385..cfce3feec6627 100644 --- a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml +++ b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml @@ -1714,24 +1714,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/eng/scripts/aggregate_javadoc_configuration.txt b/eng/scripts/aggregate_javadoc_configuration.txt index fb0f3e793226f..50144e1906d86 100644 --- a/eng/scripts/aggregate_javadoc_configuration.txt +++ b/eng/scripts/aggregate_javadoc_configuration.txt @@ -20,7 +20,6 @@ Group;Azure Core - Test;com.azure.core.test* Group;Azure Core - Tracing - OpenTelemetry;com.azure.core.tracing.opentelemetry* Group;Azure Agrifood;com.azure.verticals.agrifood.farming* Group;Azure Anomaly Detector;com.azure.ai.anomalydetector* -Group;Azure AOT - GraalVM;com.azure.aot.graalvm* Group;Azure App Configuration;com.azure.data.appconfiguration* Group;Azure Communication;com.azure.communication* Group;Azure Confidential Ledger;com.azure.security.confidentialledger* diff --git a/pom.xml b/pom.xml index 6d0fed5556e45..77207810316cc 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,6 @@ sdk/ai sdk/alertsmanagement sdk/anomalydetector - sdk/aot sdk/apicenter sdk/apimanagement sdk/appcomplianceautomation diff --git a/sdk/appconfiguration/azure-data-appconfiguration/pom.xml b/sdk/appconfiguration/azure-data-appconfiguration/pom.xml index e0652ac7f3f70..795a8f8bd12d2 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/pom.xml +++ b/sdk/appconfiguration/azure-data-appconfiguration/pom.xml @@ -43,7 +43,6 @@ --add-exports com.azure.core/com.azure.core.implementation.http=ALL-UNNAMED --add-opens com.azure.data.appconfiguration/com.azure.data.appconfiguration=ALL-UNNAMED - false --initialize-at-build-time=com.azure.data.appconfiguration.TestHelper checkstyle-suppressions.xml diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/pom.xml b/sdk/formrecognizer/azure-ai-formrecognizer/pom.xml index da8b71f4b11eb..a13a66a1bbc2c 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/pom.xml +++ b/sdk/formrecognizer/azure-ai-formrecognizer/pom.xml @@ -40,7 +40,6 @@ --add-opens com.azure.ai.formrecognizer/com.azure.ai.formrecognizer.documentanalysis=ALL-UNNAMED --add-opens com.azure.ai.formrecognizer/com.azure.ai.formrecognizer.documentanalysis.administration=ALL-UNNAMED - false checkstyle-suppressions.xml false diff --git a/sdk/storage/azure-storage-blob/pom.xml b/sdk/storage/azure-storage-blob/pom.xml index d6207e092e7ca..b3b59fcea40b6 100644 --- a/sdk/storage/azure-storage-blob/pom.xml +++ b/sdk/storage/azure-storage-blob/pom.xml @@ -57,7 +57,6 @@ --add-reads com.azure.storage.blob=com.azure.core.http.jdk.httpclient --add-reads com.azure.storage.blob=com.azure.core.http.vertx - false concurrent checkstyle-suppressions.xml diff --git a/sdk/textanalytics/azure-ai-textanalytics/pom.xml b/sdk/textanalytics/azure-ai-textanalytics/pom.xml index 4ed2fddb37051..03734b3e39234 100644 --- a/sdk/textanalytics/azure-ai-textanalytics/pom.xml +++ b/sdk/textanalytics/azure-ai-textanalytics/pom.xml @@ -39,7 +39,6 @@ --add-opens com.azure.core/com.azure.core.implementation.util=ALL-UNNAMED --add-opens com.azure.ai.textanalytics/com.azure.ai.textanalytics=ALL-UNNAMED - false checkstyle-suppressions.xml false From 9f2f8c994d1869e774929654ced81bae535afd32 Mon Sep 17 00:00:00 2001 From: vcolin7 Date: Thu, 16 Jan 2025 16:04:07 -0800 Subject: [PATCH 5/5] Removed more unused dependencies from external_dependencies.txt --- eng/versioning/external_dependencies.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/eng/versioning/external_dependencies.txt b/eng/versioning/external_dependencies.txt index a8fe028ca1af7..ef81e4752a922 100644 --- a/eng/versioning/external_dependencies.txt +++ b/eng/versioning/external_dependencies.txt @@ -87,8 +87,6 @@ org.glassfish.tyrus:tyrus-client;1.16 org.openjfx:javafx-graphics;17.0.6 org.graalvm.buildtools:junit-platform-native;0.9.19 org.graalvm.buildtools:native-maven-plugin;0.9.19 -org.graalvm.sdk:graal-sdk;22.0.0.2 -org.graalvm.nativeimage:svm;22.0.0.2 org.postgresql:postgresql;42.3.9 org.slf4j:slf4j-api;1.7.36 org.slf4j:slf4j-nop;1.7.36