diff --git a/.azure-pipelines/build_and_sign.yml b/.azure-pipelines/build_and_sign.yml new file mode 100644 index 00000000000..dcd24963caf --- /dev/null +++ b/.azure-pipelines/build_and_sign.yml @@ -0,0 +1,212 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true + - name: IsStableBuild + value: ${{ or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release-')) }} + - name: IsNightlyBuild + value: ${{ and(eq(variables['Build.Reason'], 'Schedule'), eq(variables['Build.SourceBranch'], 'refs/heads/develop')) }} + - name: DoRealSign + value: ${{ or(eq(parameters.ForceRealSign, true), eq(variables['IsStableBuild'], true), eq(variables['IsNightlyBuild'], true)) }} + - name: DoProceedToRelease + value: ${{ or(eq(variables['DoRealSign'], true), eq(parameters.ForceTestSignRelease, true)) }} + - name: RELEASE_CHANNEL + ${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release-')) }}: + value: stable + ${{ else }}: + value: nightly + - name: SIGNTYPE + ${{ if eq(variables['DoRealSign'], true) }}: + value: real + ${{ else }}: + value: test + +parameters: + - name: ForceRealSign + displayName: "Force usage of real sign (PME PoP needed)" + type: boolean + default: false + - name: ForceTestSignRelease + displayName: "Force release on test sign (for test ONLY)" + type: boolean + default: false + +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release + +trigger: + branches: + include: + - main + - develop + - release-* + +pr: + - main + - develop + - release-* + +schedules: + - cron: "0 22 * * 0-4" # 6:00 Mon-Fri UTC+8 + displayName: "Nightly build" + branches: + include: + - develop + always: true + +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + featureFlags: + disableNetworkIsolation: true + pool: + name: VSEngSS-MicroBuild2022-1ES + stages: + - stage: Build_Plugin + displayName: "Build Plugin" + jobs: + - job: Build_and_Sign + displayName: Build and Sign Plugin + timeoutInMinutes: 360 + templateContext: + outputs: + - output: pipelineArtifact + artifactName: plugin + targetPath: $(build.artifactstagingdirectory)/plugin + displayName: "Publish Artifact: plugin" + steps: + - checkout: self + clean: true + fetchTags: false + - task: PowerShell@2 + displayName: Install JDK 21 + inputs: + targetType: inline + script: | + # Download Adoptium/Temurin JDK 21.0.8 + Write-Host "Downloading Java 21.0.8..." + $source = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.8%2B9/OpenJDK21U-jdk_x64_windows_hotspot_21.0.8_9.zip" + $destination = "$(build.sourcesdirectory)\jdk21_x64_windows.zip" + Invoke-WebRequest -Uri $source -OutFile $destination + - task: JavaToolInstaller@0 + displayName: "Use Java 21" + inputs: + versionSpec: 21 + jdkArchitectureOption: x64 + jdkSourceOption: LocalDirectory + jdkFile: '$(build.sourcesdirectory)\jdk21_x64_windows.zip' + jdkDestinationDirectory: "$(agent.toolsDirectory)/jdk21" + - task: UseNode@1 + inputs: + version: "22.x" + - task: NuGetAuthenticate@1 + displayName: "🔩 NuGet Authenticate" + - task: MicroBuildSigningPlugin@4 + displayName: "Add MicroBuild Signing Plugin" + inputs: + ${{if eq(variables.DoRealSign, true) }}: + signType: "real" + ConnectedPMEServiceName: "40012d40-9ded-4f75-8476-d60758200346" + ${{ else }}: + signType: "test" + feedSource: "https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json" + env: + MicroBuildOutputFolderOverride: "$(Agent.TempDirectory)" + - task: PowerShell@2 + displayName: Build Plugin + inputs: + targetType: inline + script: | + mvn -v + # ./gradlew buildUtils || exit -1 + mvn clean install -f ./Utils/pom.xml -T 1C "-Dcheckstyle.skip=true" "-Dmaven.test.skip=true" "-Dmaven.javadoc.skip=true" + mvn clean -f ./Utils/pom.xml + cd PluginsAndFeatures/azure-toolkit-for-intellij + ./gradlew clean buildPlugin -s "-Papplicationinsights.key=$(INTELLIJ_KEY)" "-PneedPatchVersion=false" "-Psources=false" "-Porg.gradle.configureondemand=false" "-Porg.gradle.daemon=false" "-Porg.gradle.unsafe.configuration-cache=false" "-Porg.gradle.caching=false" + env: + USE_STABLE_VERSION: $(IsStableBuild) + - task: PowerShell@2 + displayName: Unpackage + inputs: + targetType: inline + script: | + Write-Host "Creating artifacts directory..." + New-Item -ItemType Directory -Path ".\artifacts\intellij\" -Force + Write-Host "Finding plugin zip file..." + $zipFile = Get-ChildItem ".\PluginsAndFeatures\azure-toolkit-for-intellij\build\distributions\*.zip" | Select-Object -First 1 + Write-Host "Found: $($zipFile.FullName)" + Write-Host "Copying to artifacts..." + Copy-Item $zipFile.FullName ".\artifacts\intellij\azure-intellij.zip" + Write-Host "Extracting archive..." + Expand-Archive -Path ".\artifacts\intellij\azure-intellij.zip" -DestinationPath ".\artifacts\intellij\folder" -Force + Write-Host "Cleaning up temporary zip file..." + Remove-Item ".\artifacts\intellij\azure-intellij.zip" + Write-Host "Unpackaging completed successfully" + - task: PowerShell@2 + displayName: Sign jars + timeoutInMinutes: 240 + inputs: + targetType: inline + script: | + Write-Host "Searching for JAR files to sign..." + $files = Get-ChildItem -Path . -Include "azure-intellij-*.jar", "azure-toolkit-for-intellij*.jar", "azure-toolkit-ide-*.jar", "azuretools-core.jar", "azure-explorer-common.jar", "hdinsight-node-common.jar" -Recurse -File + Write-Host "Found $($files.Count) JAR file(s) to sign" + $counter = 0 + foreach ($file in $files) { + $counter++ + Write-Host "[$counter/$($files.Count)] Signing: $($file.Name) with sign type: $(SIGNTYPE)" + dotnet "$env:MBSIGN_APPFOLDER/DDSignFiles.dll" -- /file:"$($file.FullName)" /certs:100010171 /signType:$(SIGNTYPE) + Write-Host " ✓ Signed successfully" + } + Write-Host "All JAR files signed successfully" + workingDirectory: 'artifacts/intellij/folder/azure-intellij/lib' + - task: CmdLine@2 + displayName: Repackage + inputs: + script: | + echo Starting repackaging... + cd artifacts\intellij\folder + echo Creating final zip archive: azure-intellij-$(Build.BuildNumber).zip + tar -a -c -f ..\..\azure-intellij-$(Build.BuildNumber).zip * + echo Repackaging completed successfully + - task: CopyFiles@2 + displayName: "Copy Files to: $(build.artifactstagingdirectory)" + inputs: + SourceFolder: $(system.defaultworkingdirectory)/artifacts + Contents: "*.zip" + TargetFolder: $(build.artifactstagingdirectory)/plugin + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: "Manifest Generator " + inputs: + BuildDropPath: $(build.artifactstagingdirectory)/plugin + - stage: Release_Plugin + condition: ${{ variables.DoProceedToRelease }} + displayName: Release Plugin to Marketplace + dependsOn: Build_Plugin + jobs: + - deployment: releasePlugin + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + artifactName: "plugin" + targetPath: "$(Pipeline.Workspace)/plugin" + environment: azure-intellij-plugin-release + strategy: + runOnce: + deploy: + steps: + - task: PowerShell@2 + displayName: Release + inputs: + targetType: inline + script: | + curl.exe -i --header "Authorization: Bearer ${env:RELEASE_TOKEN}" -F pluginId=28791 -F "file=@$(Pipeline.Workspace)/plugin/azure-intellij-$(Build.BuildNumber).zip" -F channel=$(RELEASE_CHANNEL) https://plugins.jetbrains.com/plugin/uploadPlugin diff --git a/.azure-pipelines/sign-for-stable-release.yml b/.azure-pipelines/sign-for-stable-release.yml index 59b23a54b46..8f4eee6c0ea 100644 --- a/.azure-pipelines/sign-for-stable-release.yml +++ b/.azure-pipelines/sign-for-stable-release.yml @@ -87,23 +87,23 @@ extends: clean: true fetchTags: false - task: PowerShell@2 - displayName: Install JDK 17 + displayName: Install JDK 21 inputs: targetType: inline script: | - # Download Adoptium/Temurin JDK 17.0.12 - Write-Host "Downloading Java 17.0.12..." - $source = "https://download.oracle.com/java/17/archive/jdk-17.0.12_windows-x64_bin.zip" - $destination = "$(build.sourcesdirectory)\jdk17_x64_windows.zip" + # Download Adoptium/Temurin JDK 21.0.8 + Write-Host "Downloading Java 21.0.8..." + $source = "https://download.oracle.com/java/21/archive/jdk-21.0.2_windows-x64_bin.zip" + $destination = "$(build.sourcesdirectory)\jdk21_x64_windows.zip" Invoke-WebRequest -Uri $source -OutFile $destination - task: JavaToolInstaller@0 - displayName: 'Use Java 17' + displayName: 'Use Java 21' inputs: - versionSpec: 17 + versionSpec: 21 jdkArchitectureOption: x64 jdkSourceOption: LocalDirectory - jdkFile: '$(build.sourcesdirectory)\jdk17_x64_windows.zip' - jdkDestinationDirectory: '$(agent.toolsDirectory)/jdk17' + jdkFile: '$(build.sourcesdirectory)\jdk21_x64_windows.zip' + jdkDestinationDirectory: '$(agent.toolsDirectory)/jdk21' - task: UseNode@1 inputs: version: "22.x" diff --git a/.gitignore b/.gitignore index f2db4d08b45..fa05dc8a554 100644 --- a/.gitignore +++ b/.gitignore @@ -111,3 +111,5 @@ pom.xml.versionsBackup # Bicep Language Server **/bicep-langserver/** **/azure-intellij-plugin-bicep/downloaded.zip +*.log +deps.txt diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000000..56304c79d04 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,125 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Azure Toolkits for Java — IDE plugins for IntelliJ IDEA and Eclipse that help Java developers create, develop, configure, test, and deploy applications to Azure. The primary focus of active development is the IntelliJ plugin. + +## Build Commands + +### Prerequisites +- Java 17 (required for IntelliJ plugin; set `JAVA_HOME` accordingly) +- The shared toolkit libraries from [azure-maven-plugins](https://github.com/microsoft/azure-maven-plugins) must be installed to local Maven repo first + +### Build shared toolkit libs (one-time or when libs change) +```bash +# Clone and build azure-toolkit-libs into local Maven repo +git clone https://github.com/microsoft/azure-maven-plugins.git +cd azure-maven-plugins/azure-toolkit-libs +mvn clean install -B -T 4 -Dmaven.test.skip=true +``` + +### Build Utils (Maven modules in Utils/) +```bash +# From repo root — builds the IDE-specific wrapper libraries +mvn clean install -f Utils/pom.xml +# Or via the root Gradle task: +./gradlew buildUtils -x buildToolkitsLib +``` + +### Build IntelliJ plugin +```bash +cd PluginsAndFeatures/azure-toolkit-for-intellij +./gradlew clean buildPlugin -s +``` +Output ZIP: `PluginsAndFeatures/azure-toolkit-for-intellij/build/distributions/` + +### Build Eclipse plugin +```bash +mvn clean install -f Utils/pom.xml +mvn clean install -f PluginsAndFeatures/AddLibrary/AzureLibraries/pom.xml +mvn clean install -f PluginsAndFeatures/azure-toolkit-for-eclipse/pom.xml +``` + +### Build everything (from repo root) +```bash +./gradlew buildAll +``` + +### Run/Debug IntelliJ plugin locally +Open `PluginsAndFeatures/azure-toolkit-for-intellij` in IntelliJ and use the Gradle `runIde` task. Remote debug port: 5005. + +### Tests +```bash +# IntelliJ plugin tests (run from the IntelliJ plugin dir) +cd PluginsAndFeatures/azure-toolkit-for-intellij +./gradlew test + +# Utils tests (Maven) +mvn test -f Utils/pom.xml + +# Skip tests during build +./gradlew buildAll -PskipTest=true +# Or for Maven modules: +mvn install -f Utils/pom.xml -Dmaven.test.skip=true +``` + +### Checkstyle +Checkstyle runs by default on Maven builds. Skip with: +```bash +mvn install -f Utils/pom.xml -Dcheckstyle.skip=true +``` +IntelliJ plugin checkstyle config: `PluginsAndFeatures/azure-toolkit-for-intellij/config/checkstyle/checkstyle.xml` + +## Architecture + +### Three-Layer Dependency Stack + +1. **azure-toolkit-libs** (external repo: `azure-maven-plugins`) — Core SDK wrappers for Azure services. IDE-agnostic. Must be `mvn install`ed to local repo before building this project. + +2. **Utils/** (this repo, Maven) — IDE-specific wrapper libraries (`azure-toolkit-ide-libs` and `azure-toolkit-ide-hdinsight-libs`). Each Azure service has a corresponding `azure-toolkit-ide-*-lib` module (e.g., `azure-toolkit-ide-appservice-lib`, `azure-toolkit-ide-cosmos-lib`). Built with Maven and published to local repo for the Gradle IntelliJ build to consume. + +3. **PluginsAndFeatures/** (this repo) — IDE plugin implementations: + - `azure-toolkit-for-intellij/` — IntelliJ plugin (Gradle + Kotlin DSL, ~40 submodules) + - `azure-toolkit-for-eclipse/` — Eclipse plugin (Maven/Tycho) + +### IntelliJ Plugin Module Structure + +The IntelliJ plugin is a single composite plugin built from ~40 Gradle submodules, each declared in `settings.gradle.kts`. Key module categories: + +- **`azure-intellij-plugin-lib`** — Core IntelliJ integration: UI components (AzureComboBox, AzureDialog, Tree), action framework, auth, messager, task manager, telemetry. This is the foundation module. +- **`azure-intellij-plugin-lib-java`** — Java-specific IntelliJ utilities (run configs, artifact handling). +- **`azure-intellij-plugin-base`** — Plugin entry point (`AzurePlugin` as `StartupActivity`), lifecycle management. +- **`azure-intellij-plugin-service-explorer`** — Azure Explorer tool window. +- **`azure-intellij-resource-connector-lib`** — Resource connection framework (connecting Azure resources to project modules). +- **Service modules** — One per Azure service (e.g., `azure-intellij-plugin-appservice`, `azure-intellij-plugin-cosmos`, `azure-intellij-plugin-database`, `azure-intellij-plugin-storage`, etc.) +- **`-java` suffix modules** — Java-language-specific features for that service (e.g., `azure-intellij-plugin-appservice-java`, `azure-intellij-plugin-database-java`). + +### Extension Point Pattern + +The plugin uses an IntelliJ extension point `com.microsoft.tooling.msservices.intellij.azure.actions` with the `IActionsContributor` interface. Each service module registers its own `ActionsContributor` implementation via its `META-INF/*.xml` descriptor. These are composed into the main `plugin.xml` using `xi:include`. + +To add a new service module: +1. Create the module directory under `PluginsAndFeatures/azure-toolkit-for-intellij/` +2. Add it to `settings.gradle.kts` +3. Add an `implementation(project(":module-name"))` dependency in the root `build.gradle.kts` +4. Create a `META-INF/.xml` descriptor +5. Include it in `src/main/resources/META-INF/plugin.xml` via `xi:include` + +### Build System Details + +- **Root Gradle** (`build.gradle` at repo root) — Orchestrates cross-project builds. Uses Groovy DSL with Gradle 8.8. +- **IntelliJ Gradle** (`PluginsAndFeatures/azure-toolkit-for-intellij/build.gradle.kts`) — Uses Kotlin DSL with IntelliJ Platform Gradle Plugin 2.3.0. Targets IntelliJ IDEA Ultimate for compilation. Version catalog at `gradle/libs.versions.toml`. +- **Maven** (`Utils/pom.xml`) — Builds the IDE wrapper libraries. Uses AspectJ for cross-cutting concerns (via `azure-toolkit-common-lib`). +- AspectJ weaving is used at both Maven (aspectj-maven-plugin) and Gradle (io.freefair.aspectj.post-compile-weaving) levels. + +### Key Conventions + +- Java 17 source/target for all modules. +- Lombok is used project-wide (`@Data`, `@Builder`, etc.). +- All Java source files require the MIT license header (enforced by checkstyle). +- LF line endings required (no CRLF). +- No tabs — spaces only. +- TODOs must be named: `TODO (name): description`. +- Base package: `com.microsoft.azure.toolkit.intellij` for IntelliJ modules, `com.microsoft.azure.toolkit.lib` for library modules. diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appmod/src/main/java/com/microsoft/azure/toolkit/intellij/appmod/javaupgrade/action/CveFixDependencyInProblemsViewAction.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appmod/src/main/java/com/microsoft/azure/toolkit/intellij/appmod/javaupgrade/action/CveFixDependencyInProblemsViewAction.java index f7b1adf1919..ca1fc05af1c 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appmod/src/main/java/com/microsoft/azure/toolkit/intellij/appmod/javaupgrade/action/CveFixDependencyInProblemsViewAction.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appmod/src/main/java/com/microsoft/azure/toolkit/intellij/appmod/javaupgrade/action/CveFixDependencyInProblemsViewAction.java @@ -33,7 +33,6 @@ public class CveFixDependencyInProblemsViewAction extends AnAction implements Du private static final String CVE_MARKER = "CVE-"; private VulnerabilityInfo vulnerabilityInfo; - public CveFixDependencyInProblemsViewAction() { super(); } diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.form b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.form index a0b98ee74c2..b13aea0c833 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.form +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.form @@ -3,7 +3,7 @@ - + @@ -27,13 +27,11 @@ - + - - - + @@ -43,10 +41,11 @@ - + + diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.java index 0eb3318a794..48c26570d4b 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice-java/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/AppServiceInfoBasicPanel.java @@ -135,6 +135,9 @@ public RuntimeComboBox getSelectorRuntime() { private void createUIComponents() { // TODO: place custom component creation code here this.selectorApplication = new AzureArtifactComboBox(project, true); + this.selectorRuntime = new RuntimeComboBox(); + this.textName = new AppNameInput(); + this.textName.setRequired(true); } public void setDeploymentVisible(boolean visible) { diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/build.gradle.kts index 651a0c7b441..f15865b9924 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/build.gradle.kts @@ -21,3 +21,9 @@ dependencies { bundledPlugin("org.jetbrains.plugins.terminal") } } + +tasks { + instrumentCode { + instrumentationLogs = true + } +} \ No newline at end of file diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.form b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.form index 3a772c8ab76..4c2b43aca35 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.form +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.form @@ -27,18 +27,16 @@ - + - - - - + + diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.java index 97a8dd0e955..2261fd9d027 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-appservice/src/main/java/com/microsoft/azure/toolkit/intellij/legacy/appservice/serviceplan/ServicePlanCreationDialog.java @@ -104,4 +104,10 @@ public List> getInputs() { return Collections.singletonList(this.textName); } + private void createUIComponents() { + // TODO: place custom component creation code here + this.textName = new AzureTextInput(); + this.textName.setRequired(true); + this.comboBoxPricingTier = new PricingTierComboBox(); + } } diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-bicep/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-bicep/build.gradle.kts index 6309b2736b6..a8ef64b4d8d 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-bicep/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-bicep/build.gradle.kts @@ -8,6 +8,8 @@ dependencies { implementation("com.vladsch.flexmark:flexmark:0.64.0") implementation("com.vladsch.flexmark:flexmark-util:0.64.0") implementation("org.apache.commons:commons-lang3:3.12.0") + // ComparableVersion is no longer on the platform classpath in 261 + implementation("org.apache.maven:maven-artifact:3.9.11") testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:3.9.0") testImplementation("org.powermock:powermock-api-mockito2:2.0.9") diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cloud-shell/src/main/kotlin/com/microsoft/azure/toolkit/intellij/cloudshell/terminal/AzureCloudTerminalRunner.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cloud-shell/src/main/kotlin/com/microsoft/azure/toolkit/intellij/cloudshell/terminal/AzureCloudTerminalRunner.kt index c64919d3290..9234e4820c9 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cloud-shell/src/main/kotlin/com/microsoft/azure/toolkit/intellij/cloudshell/terminal/AzureCloudTerminalRunner.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cloud-shell/src/main/kotlin/com/microsoft/azure/toolkit/intellij/cloudshell/terminal/AzureCloudTerminalRunner.kt @@ -9,7 +9,7 @@ package com.microsoft.azure.toolkit.intellij.cloudshell.terminal import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer -import com.intellij.platform.util.coroutines.namedChildScope +import com.intellij.platform.util.coroutines.childScope import com.jediterm.terminal.TtyConnector import com.microsoft.azure.toolkit.intellij.cloudshell.CloudShellService import com.microsoft.azure.toolkit.intellij.cloudshell.controlchannel.CloudConsoleControlChannelClient @@ -56,7 +56,7 @@ class AzureCloudTerminalRunner( cloudConsoleBaseUrl, project ) - controlClient.connect(scope.namedChildScope("CloudConsoleControlChannelClient")) + controlClient.connect(scope.childScope("CloudConsoleControlChannelClient")) val connector = createConnector(process) Disposer.register(connector, controlClient) @@ -70,7 +70,7 @@ class AzureCloudTerminalRunner( private fun createConnector(process: CloudTerminalProcess) = AzureCloudProcessTtyConnector( process, project, - scope.namedChildScope("AzureCloudProcessTtyConnector"), + scope.childScope("AzureCloudProcessTtyConnector"), uploadFileToTerminalUrl, previewPortBaseUrl, resizeTerminalUrl diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/build.gradle.kts index 4019ae664bb..a0f9b36c393 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation("com.microsoft.azure:azure-toolkit-identity-lib") intellijPlatform { - intellijIdeaUltimate(properties("platformVersion").get()) + // intellijIdeaUltimate(properties("platformVersion").get()) // Plugin Dependencies. Uses `platformBundledPlugins` property from the gradle.properties file for bundled IntelliJ Platform plugins. bundledPlugin("com.intellij.java") bundledPlugin("com.intellij.database") diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/src/main/java/com/microsoft/azure/toolkit/intellij/cosmos/dbtools/AzureCosmosDbAccountParamEditor.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/src/main/java/com/microsoft/azure/toolkit/intellij/cosmos/dbtools/AzureCosmosDbAccountParamEditor.java index 22947591ec6..86f17c4aeb7 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/src/main/java/com/microsoft/azure/toolkit/intellij/cosmos/dbtools/AzureCosmosDbAccountParamEditor.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/src/main/java/com/microsoft/azure/toolkit/intellij/cosmos/dbtools/AzureCosmosDbAccountParamEditor.java @@ -209,7 +209,9 @@ private void setUsername(String user) { @SneakyThrows private void setUseSsl(boolean useSsl) { final DataSourceConfigurable configurable = this.getDataSourceConfigurable(); - final JBCheckBox useSSLCheckBox = (JBCheckBox) FieldUtils.readField(configurable.getSshSslPanel(), "myUseSSLJBCheckBox", true); + // getSshSslPanel() was removed in IntelliJ 261; use reflection to access the panel field directly + final Object sshSslPanel = FieldUtils.readField(configurable, "mySshSslPanel", true); + final JBCheckBox useSSLCheckBox = (JBCheckBox) FieldUtils.readField(sshSslPanel, "myUseSSLJBCheckBox", true); useSSLCheckBox.setSelected(useSsl); } diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-guidance/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-guidance/build.gradle.kts index caeba7b18f2..98f30de8426 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-guidance/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-guidance/build.gradle.kts @@ -5,4 +5,7 @@ dependencies { // runtimeOnly project(path: ":azure-intellij-resource-connector-lib", configuration: "instrumentedJar") implementation("com.microsoft.azure:azure-toolkit-ide-common-lib") implementation("org.yaml:snakeyaml:2.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2") { + exclude(group = "com.fasterxml.jackson", module = "jackson-bom") + } } \ No newline at end of file diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/build.gradle.kts index 7360e3414d9..edd3bcda579 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/build.gradle.kts @@ -9,7 +9,7 @@ dependencies { implementation("com.microsoft.hdinsight:azure-toolkit-ide-hdinsight-spark-lib") intellijPlatform { - intellijIdeaUltimate(properties("platformVersion").get()) + // intellijIdeaUltimate(properties("platformVersion").get()) // Plugin Dependencies. Uses `platformBundledPlugins` property from the gradle.properties file for bundled IntelliJ Platform plugins. bundledPlugin("com.intellij.java") plugin("org.intellij.scala:2024.2.5") diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/console/SparkLivySessionProcess.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/console/SparkLivySessionProcess.kt index 6b044cfaf6d..4686d18afaa 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/console/SparkLivySessionProcess.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/console/SparkLivySessionProcess.kt @@ -63,10 +63,6 @@ class SparkLivySessionProcess( return 0 } - override fun setWindowSize(columns: Int, rows: Int) { - - } - override fun getInputStream(): InputStream = stdOutStream fun start(): Observable = session.deploy() diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/run/SparkBatchJobProcessAdapter.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/run/SparkBatchJobProcessAdapter.kt index 358d35295d0..2f557f079a4 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/run/SparkBatchJobProcessAdapter.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight-lib/src/main/kotlin/com/microsoft/azure/hdinsight/spark/run/SparkBatchJobProcessAdapter.kt @@ -64,8 +64,4 @@ class SparkBatchJobProcessAdapter(val sparkJobProcess: SparkBatchJobRemoteProces override fun killProcessTree(): Boolean { return sparkJobProcess.killProcessTree() } - - override fun setWindowSize(columns: Int, rows: Int) { - - } } \ No newline at end of file diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight/src/main/java/com/microsoft/azure/hdinsight/projects/SbtVersionOptionsPanel.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight/src/main/java/com/microsoft/azure/hdinsight/projects/SbtVersionOptionsPanel.java index 7ff14936b86..d186a228cea 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight/src/main/java/com/microsoft/azure/hdinsight/projects/SbtVersionOptionsPanel.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight/src/main/java/com/microsoft/azure/hdinsight/projects/SbtVersionOptionsPanel.java @@ -8,11 +8,12 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.ui.ComboBox; import com.microsoft.azure.hdinsight.common.logger.ILogger; -import org.jetbrains.plugins.scala.project.Versions; +import scala.collection.immutable.Seq; import scala.reflect.ClassTag; import javax.swing.*; import java.awt.*; +import java.lang.reflect.Method; public class SbtVersionOptionsPanel extends JPanel implements ILogger { private ComboBox sbtVersionComboBox; @@ -36,7 +37,35 @@ public SbtVersionOptionsPanel() { public void updateSbtVersions() { final String[][] versions = new String[1][1]; ProgressManager.getInstance().runProcess(() -> { - versions[0] = (String[]) Versions.SBT$.MODULE$.loadVersionsWithProgress(null).versions().toArray(ClassTag.apply(String.class)); + try { + // In newer Scala plugin versions, the API changed. Use reflection for cross-version compatibility. + // Old: Versions.SBT$.MODULE$.loadVersionsWithProgress(null).versions() -> Seq + // New: Versions.loadSbtVersions(false, null) -> Seq + final Class versionsClass = Class.forName("org.jetbrains.plugins.scala.project.Versions"); + try { + // Try new API first + final Method loadSbtVersionsMethod = versionsClass.getMethod("loadSbtVersions", boolean.class, com.intellij.openapi.progress.ProgressIndicator.class); + final Seq sbtVersions = (Seq) loadSbtVersionsMethod.invoke(null, false, null); + final int size = sbtVersions.size(); + final String[] result = new String[size]; + for (int i = 0; i < size; i++) { + result[i] = sbtVersions.apply(i).toString(); + } + versions[0] = result; + } catch (final NoSuchMethodException e) { + // Fallback to old API + final Class versionsSbtClass = Class.forName("org.jetbrains.plugins.scala.project.Versions$SBT$"); + final Object module = versionsSbtClass.getField("MODULE$").get(null); + final Method loadMethod = module.getClass().getMethod("loadVersionsWithProgress", com.intellij.openapi.progress.ProgressIndicator.class); + final Object loadedVersions = loadMethod.invoke(module, (Object) null); + final Method versionsMethod = loadedVersions.getClass().getMethod("versions"); + final Seq versionSeq = (Seq) versionsMethod.invoke(loadedVersions); + versions[0] = (String[]) versionSeq.toArray(ClassTag.apply(String.class)); + } + } catch (final Exception e) { + log().warn("Failed to get SBT versions from scala plugin.", e); + versions[0] = new String[0]; + } }, null); for (String version : versions[0]) { diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/build.gradle.kts index fd4354002c6..8229d1b47d3 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/build.gradle.kts @@ -20,8 +20,12 @@ dependencies { exclude(group="pull-parser", module="pull-parser") exclude(group="net.java.dev.msv", module="xsdlib") } + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2") { + exclude(group = "com.fasterxml.jackson", module = "jackson-bom") + } intellijPlatform { // Plugin Dependencies. Uses `platformBundledPlugins` property from the gradle.properties file for bundled IntelliJ Platform plugins. bundledPlugin("org.jetbrains.plugins.terminal") } } + diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.form b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.form index 0ce735be729..cf40a38a6ee 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.form +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.form @@ -19,13 +19,10 @@ - + - - - diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.java index 02ae158c5a1..f001d7eb2c3 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/resourcegroup/ResourceGroupCreationDialog.java @@ -69,4 +69,10 @@ public void setValue(final ResourceGroupDraft data) { public List> getInputs() { return Collections.singletonList(this.textName); } + + private void createUIComponents() { + // TODO: place custom component creation code here + this.textName = new ResourceGroupNameTextField(); + this.textName.setRequired(true); + } } diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/streaminglog/StreamingLogsConsoleView.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/streaminglog/StreamingLogsConsoleView.java index 0596ea516af..673f62e0b65 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/streaminglog/StreamingLogsConsoleView.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/streaminglog/StreamingLogsConsoleView.java @@ -43,6 +43,11 @@ public boolean isActive() { return subscription != null && !subscription.isDisposed(); } + /** + * Returns whether this console view has been disposed. + * Note: In IntelliJ 261+, ConsoleViewImpl.isDisposed() is private final, + * so this is NOT an override but a new public method for callers. + */ public boolean isDisposed() { return this.isDisposed; } diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.form b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.form index 5b51800330e..ca18966ace6 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.form +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.form @@ -94,21 +94,17 @@ - + - - - + - + - - - + @@ -122,6 +118,7 @@ + diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.java b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.java index 73dbbae1be6..8bef9ff4d6f 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.java +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-resource-connector-aad/src/main/java/com/microsoft/azure/toolkit/intellij/connector/aad/RegisterAzureApplicationForm.java @@ -119,6 +119,11 @@ private void createUIComponents() { clientIdInput = new AzureClientIdInput(); advancedSettingsSeparator = new AzureHideableTitledSeparator(); + + displayNameInput = new AzureTextInput(); + displayNameInput.setRequired(true); + domainInput = new AzureTextInput(); + domainInput.setRequired(true); } private void updateRegistrationModel(@Nonnull Project project, @Nonnull Subscription subscription) { diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/build.gradle.kts b/PluginsAndFeatures/azure-toolkit-for-intellij/build.gradle.kts index 64d13fd4d11..0f1c245f8f1 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/build.gradle.kts +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/build.gradle.kts @@ -1,12 +1,12 @@ import io.freefair.gradle.plugins.aspectj.AjcAction import org.apache.tools.ant.filters.ReplaceTokens import org.jetbrains.intellij.platform.gradle.IntelliJPlatformType -import org.jetbrains.intellij.platform.gradle.tasks.VerifyPluginTask +import java.net.URI import java.time.LocalDateTime import java.time.format.DateTimeFormatter -import java.net.URL fun properties(key: String) = providers.gradleProperty(key) + fun environment(key: String) = providers.environmentVariable(key) plugins { @@ -33,12 +33,12 @@ allprojects { java { toolchain { - languageVersion = JavaLanguageVersion.of(17) + languageVersion = JavaLanguageVersion.of(21) } } kotlin { - jvmToolchain(17) + jvmToolchain(21) } repositories { @@ -55,28 +55,34 @@ allprojects { intellijPlatform { buildSearchableOptions = false - instrumentCode = true + // instrumentCode = true } dependencies { intellijPlatform { - intellijIdeaUltimate(properties("platformVersion").get()) - // run from a local idea installation - // local(File("C:\\Program Files\\JetBrains\\IntelliJ IDEA 242.16677.21")); - instrumentationTools() - // https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-jetbrains-runtime.html#declared-explicitly - // jetbrainsRuntime() + intellijIdeaUltimate(properties("platformVersion").get()) { + useInstaller = false + } + // JBR 25 required to run IntelliJ 2026.1 (PathClassLoader is JBR-only) + jetbrainsRuntimeLocal("C:/Users/wangmi/.jdks/jbr-25/jbr_jcef-25.0.2-windows-x64-b329.72") + // MavenId/MavenCoordinate classes moved from maven plugin to repository-search plugin in 261 + bundledPlugin("org.jetbrains.idea.reposearch") + // Test framework classes moved to separate modules in 261 + testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Platform) + testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Plugin.Java) } implementation(platform("com.microsoft.azure:azure-toolkit-libs:0.52.2")) implementation(platform("com.microsoft.azure:azure-toolkit-ide-libs:0.52.2")) implementation(platform("com.microsoft.hdinsight:azure-toolkit-ide-hdinsight-libs:0.1.1")) - compileOnly("org.projectlombok:lombok:1.18.24") + compileOnly("org.projectlombok:lombok:1.18.32") compileOnly("org.jetbrains:annotations:24.0.0") - annotationProcessor("org.projectlombok:lombok:1.18.24") + annotationProcessor("org.projectlombok:lombok:1.18.32") implementation("com.microsoft.azure:azure-toolkit-common-lib:0.52.2") aspect("com.microsoft.azure:azure-toolkit-common-lib:0.52.2") + // junit was removed from IntelliJ platform bundled libs in 261 + testImplementation("junit:junit:4.13.2") } configurations { @@ -91,21 +97,25 @@ allprojects { implementation { exclude(module = "xsdlib") } } + tasks.configureEach { + if (name == "instrumentCode") { + enabled = file("src/main/java").exists() + } + } tasks { + compileJava { - sourceCompatibility = "17" - targetCompatibility = "17" + sourceCompatibility = "21" + targetCompatibility = "21" } compileKotlin { - kotlinOptions.jvmTarget = "17" configure { enabled = false } } compileTestKotlin { - kotlinOptions.jvmTarget = "17" configure { enabled = false } @@ -115,6 +125,17 @@ allprojects { duplicatesStrategy = DuplicatesStrategy.WARN } + // Gradle 9 requires explicit dependency declaration for shared sandbox outputs + withType { + dependsOn(rootProject.tasks.named("prepareTestSandbox")) + // Each subproject's test sandbox may be produced by other subproject tasks + rootProject.subprojects.forEach { sub -> + sub.tasks.matching { it.name == "prepareTestSandbox" }.configureEach { + this@withType.dependsOn(this) + } + } + } + sourceSets { main { java.srcDirs("src/main/java") @@ -126,6 +147,10 @@ allprojects { java.srcDir("src/test/java") kotlin.srcDirs("src/test/kotlin") resources.srcDir("src/test/resources") + // Exclude legacy duplicate hdinsight test files from root module; + // they are properly maintained in azure-intellij-plugin-hdinsight-base + java.exclude("com/microsoft/azure/hdinsight/**") + kotlin.exclude("com/microsoft/azure/hdinsight/**") } } } @@ -134,7 +159,6 @@ allprojects { intellijPlatform { projectName = "azure-toolkit-for-intellij" buildSearchableOptions = false - instrumentCode = true pluginConfiguration { id = properties("pluginId").get() @@ -148,8 +172,14 @@ intellijPlatform { pluginVerification { ides { - ide(IntelliJPlatformType.IntellijIdeaCommunity, properties("platformVersion").get()) + // IC (Community) no longer published since 253; use IU (Ultimate) for verification + create(IntelliJPlatformType.IntellijIdeaUltimate, properties("platformVersion").get()) } + // Suppress known structural warnings — plugin ID/name historically contain "intellij" + freeArgs = listOf( + "-mute", "TemplateWordInPluginId", + "-mute", "TemplateWordInPluginName" + ) } } @@ -216,6 +246,11 @@ dependencies { implementation("com.microsoft.azure:azure-toolkit-auth-lib") implementation("com.microsoft.azure:azure-toolkit-ide-common-lib") implementation("com.microsoft.azure:azure-toolkit-ide-appservice-lib") + + // Test dependencies for root module tests (cucumber, assertj) + testImplementation("io.cucumber:cucumber-java:7.0.0") + testImplementation("io.cucumber:cucumber-junit:7.0.0") + testImplementation("org.assertj:assertj-core:3.19.0") } tasks { @@ -258,7 +293,7 @@ tasks { if (!langServerDir.exists()) { logger.info("Downloading bicep language server ...") val zipFile = file("azure-intellij-plugin-bicep/downloaded.zip") - URL("https://aka.ms/java-toolkit-bicep-ls").openStream().use { input -> + URI("https://aka.ms/java-toolkit-bicep-ls").toURL().openStream().use { input -> zipFile.outputStream().use { it.write(input.readBytes()) } } logger.info("Unzipping bicep language server ...") @@ -303,4 +338,4 @@ tasks { // publishPlugin { // dependsOn(patchChangelog) // } -} \ No newline at end of file +} diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/gradle.properties b/PluginsAndFeatures/azure-toolkit-for-intellij/gradle.properties index 45e8d528417..a24154a4ff0 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/gradle.properties +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/gradle.properties @@ -1,16 +1,16 @@ pluginVersion=3.97.2 -intellijDisplayVersion=2025.2 -intellij_version=IU-2025.2 -platformVersion=2025.2 +intellijDisplayVersion=2026.1 +intellij_version=261-EAP-SNAPSHOT +platformVersion=261-EAP-SNAPSHOT # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html -pluginSinceBuild=252 -pluginUntilBuild=252.* +pluginSinceBuild=261 +pluginUntilBuild=261.* # Example: platformPlugins = com.jetbrains.php:203.4449.22, org.intellij.scala:2023.3.27@EAP -platformPlugins=org.intellij.scala:2025.2.9 +platformPlugins=org.intellij.scala:2026.1.8 # IntelliJ Platform Properties -> https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#configuration-intellij-extension platformType=IU needPatchVersion=true -javaVersion=17 +javaVersion=21 applicationinsights.key=57cc111a-36a8-44b3-b044-25d293b8b77c # IntelliJ Platform Artifacts Repositories -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html pluginGroup=com.microsoft.azuretools @@ -22,7 +22,7 @@ platformDownloadSources=true # Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib kotlin.stdlib.default.dependency=false # Gradle Releases -> https://github.com/gradle/gradle/releases -gradleVersion=8.8 +gradleVersion=9.0 # Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html org.gradle.configuration-cache=true org.gradle.configuration-cache.problems=warn diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/libs.versions.toml b/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/libs.versions.toml index a411c10e5a8..6527cbeaabe 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/libs.versions.toml +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/libs.versions.toml @@ -2,15 +2,16 @@ # libraries # plugins -kotlin = "2.1.0" -changelog = "2.2.0" -intellijPlatform = "2.3.0" +kotlin = "2.2.20" +changelog = "2.4.0" +#intellijPlatform = "2.10.1" +intellijPlatform = "2.12.0" detekt = "1.23.6" ktlint = "12.1.1" #gradleIntelliJPlugin = "1.17.3" #qodana = "2024.1.5" -aspectj = "8.6" -springDependencyManagement = "1.0.11.RELEASE" +aspectj = "9.2.0" +springDependencyManagement = "1.1.6" serialization = "1.9.24" [plugins] diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/wrapper/gradle-wrapper.properties b/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/wrapper/gradle-wrapper.properties index a4413138c96..2dcec856bd0 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/wrapper/gradle-wrapper.properties +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkSubmitModelScenario.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkSubmitModelScenario.kt index 4a3bc9661fb..6d3630dcf48 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkSubmitModelScenario.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkSubmitModelScenario.kt @@ -40,15 +40,17 @@ class SparkSubmitModelScenario { @Given("^set SparkSubmitModel properties as following$") fun initSparkSubmitModel(properties: Map) { - properties.forEach { key, value -> when (key) { - "cluster_name" -> submitModel.clusterName = value - "is_local_artifact" -> submitModel.isLocalArtifact = value.toBoolean() - "local_artifact_path" -> submitModel.localArtifactPath = value - "classname" -> submitModel.mainClassName = value - "cmd_line_args" -> submitModel.commandLineArgs = value.split(" ") - "ref_jars" -> submitModel.referenceJars = value.split(";") - "ref_files" -> submitModel.referenceFiles = value.split(";") - } } + properties.forEach { key, value -> + when (key) { + "cluster_name" -> submitModel.clusterName = value + "is_local_artifact" -> submitModel.isLocalArtifact = value.toBoolean() + "local_artifact_path" -> submitModel.localArtifactPath = value + "classname" -> submitModel.mainClassName = value + "cmd_line_args" -> submitModel.commandLineArgs = value.split(" ") + "ref_jars" -> submitModel.referenceJars = value.split(";") + "ref_files" -> submitModel.referenceFiles = value.split(";") + } + } } @Then("^checking XML serialized should to be '(.*)'$") @@ -57,7 +59,6 @@ class SparkSubmitModelScenario { val actual = XMLOutputter().outputString(element) assertEquals(expect, actual) - } @Given("^the SparkSubmitModel XML input '(.*)' to deserialize$") @@ -69,14 +70,16 @@ class SparkSubmitModelScenario { @Then("^check SparkSubmitModel properties as following$") fun checkSparkSubmitMode(expect: Map) { - expect.forEach { key, value -> when (key) { - "cluster_name" -> assertEquals(value, submitModel.clusterName) - "is_local_artifact" -> assertEquals(value.toBoolean(), submitModel.isLocalArtifact) - "local_artifact_path" -> assertEquals(value, submitModel.localArtifactPath) - "classname" -> assertEquals(value, submitModel.mainClassName) - "cmd_line_args" -> assertEquals(value, submitModel.commandLineArgs.joinToString(" ")) - "ref_jars" -> assertEquals(value, submitModel.referenceJars.joinToString(";")) - "ref_files" -> assertEquals(value, submitModel.referenceFiles.joinToString(";")) - } } + expect.forEach { key, value -> + when (key) { + "cluster_name" -> assertEquals(value, submitModel.clusterName) + "is_local_artifact" -> assertEquals(value.toBoolean(), submitModel.isLocalArtifact) + "local_artifact_path" -> assertEquals(value, submitModel.localArtifactPath) + "classname" -> assertEquals(value, submitModel.mainClassName) + "cmd_line_args" -> assertEquals(value, submitModel.commandLineArgs.joinToString(" ")) + "ref_jars" -> assertEquals(value, submitModel.referenceJars.joinToString(";")) + "ref_files" -> assertEquals(value, submitModel.referenceFiles.joinToString(";")) + } + } } -} \ No newline at end of file +} diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkUITest.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkUITest.kt index 8b5c5d9745e..0187aa13f06 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkUITest.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/common/SparkUITest.kt @@ -51,4 +51,4 @@ open class SparkUITest : LightJavaCodeInsightFixtureTestCase() { isVisible = true } } -} \ No newline at end of file +} diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/ImmutableComboBoxModelTest.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/ImmutableComboBoxModelTest.kt index 8e1d8bf2c57..7d6f792109d 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/ImmutableComboBoxModelTest.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/ImmutableComboBoxModelTest.kt @@ -25,10 +25,10 @@ package com.microsoft.azure.hdinsight.spark.ui import com.microsoft.intellij.ui.util.findFirst import com.microsoft.intellij.ui.util.iterator import junit.framework.TestCase -import org.assertj.core.api.Assertions.* +import org.assertj.core.api.Assertions.assertThat import org.junit.Test -class ImmutableComboBoxModelTest: TestCase() { +class ImmutableComboBoxModelTest : TestCase() { @Test fun testIterator() { val data = listOf(3, 5, 4, 2) @@ -51,4 +51,4 @@ class ImmutableComboBoxModelTest: TestCase() { val emptyModel: ImmutableComboBoxModel? = null assertNull(emptyModel.findFirst { true }) } -} \ No newline at end of file +} diff --git a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/SparkJobTableTest.kt b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/SparkJobTableTest.kt index b482f9cd4cf..f294523a2ae 100644 --- a/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/SparkJobTableTest.kt +++ b/PluginsAndFeatures/azure-toolkit-for-intellij/src/test/java/com/microsoft/azure/hdinsight/spark/ui/SparkJobTableTest.kt @@ -42,40 +42,48 @@ import java.awt.event.WindowEvent import java.util.concurrent.TimeUnit class KillLivyJobAction : AzureAnAction(AllIcons.Actions.Cancel) { - override fun onActionPerformed(anActionEvent: AnActionEvent, operation: Operation?): Boolean { + override fun onActionPerformed( + anActionEvent: AnActionEvent, + operation: Operation?, + ): Boolean { System.out.println("Clicked ${anActionEvent.place} kill job button") return true } } class RestartLivyJobAction : AzureAnAction(AllIcons.Actions.Restart) { - override fun onActionPerformed(anActionEvent: AnActionEvent, operation: Operation?): Boolean { + override fun onActionPerformed( + anActionEvent: AnActionEvent, + operation: Operation?, + ): Boolean { System.out.println("Clicked ${anActionEvent.place} restart job button") return true } } -const val killActionColName = "KillAction" -const val restartActionColName = "RestartAction" -const val idColName = "ID" -const val appIdColName = "AppID" -const val stateColName = "State" - -class MockSparkLivyJobsTableSchema - : UniqueColumnNameTableSchema(arrayOf( - ActionColumnInfo(killActionColName), - ActionColumnInfo(restartActionColName), - PlainColumnInfo(idColName), - PlainColumnInfo(appIdColName), - PlainColumnInfo(stateColName))) { +const val KILL_ACTION_COL_NAME = "KillAction" +const val RESTART_ACTION_COL_NAME = "RestartAction" +const val ID_COL_NAME = "ID" +const val APP_ID_COL_NAME = "AppID" +const val STATE_COL_NAME = "State" +class MockSparkLivyJobsTableSchema : + UniqueColumnNameTableSchema( + arrayOf( + ActionColumnInfo(KILL_ACTION_COL_NAME), + ActionColumnInfo(RESTART_ACTION_COL_NAME), + PlainColumnInfo(ID_COL_NAME), + PlainColumnInfo(APP_ID_COL_NAME), + PlainColumnInfo(STATE_COL_NAME), + ), + ) { inner class MockSparkJobDescriptor(val jobStatus: SparkSubmitResponse) : RowDescriptor( - killActionColName to KillLivyJobAction(), - restartActionColName to RestartLivyJobAction(), - idColName to jobStatus.id, - appIdColName to jobStatus.appId, - stateColName to jobStatus.state) - + KILL_ACTION_COL_NAME to KillLivyJobAction(), + RESTART_ACTION_COL_NAME to RestartLivyJobAction(), + ID_COL_NAME to jobStatus.id, + APP_ID_COL_NAME to jobStatus.appId, + STATE_COL_NAME to jobStatus.state, + ) } class MockSparkBatchJobViewerControl(private val view: MockSparkBatchJobViewer) : LivyBatchJobViewer.Control { @@ -84,26 +92,28 @@ class MockSparkBatchJobViewerControl(private val view: MockSparkBatchJobViewer) } override fun onJobSelected(jobSelected: UniqueColumnNameTableSchema.RowDescriptor?) { - val sparkJobDesc = (jobSelected as? MockSparkLivyJobsTableSchema.MockSparkJobDescriptor)?.let { arrayOf(it)} - ?: emptyArray() + val sparkJobDesc = + (jobSelected as? MockSparkLivyJobsTableSchema.MockSparkJobDescriptor)?.let { arrayOf(it) } + ?: emptyArray() Observable.from(sparkJobDesc) - .delay(500, TimeUnit.MILLISECONDS) - .subscribe { view.getModel(LivyBatchJobViewer.Model::class.java).apply { - jobDetail = if (it.jobStatus.id == 1) { - // Unclosed JSON string - """{"message":"A broken response for ${it.jobStatus.appId}!","error no": 0, "id": ${it.jobStatus.id}""" - - } else { - """{"message":"hello ${it.jobStatus.appId}!","error no": 0, "id": ${it.jobStatus.id}}""" - } + .delay(500, TimeUnit.MILLISECONDS) + .subscribe { + view.getModel(LivyBatchJobViewer.Model::class.java).apply { + jobDetail = + if (it.jobStatus.id == 1) { + // Unclosed JSON string + """{"message":"A broken response for ${it.jobStatus.appId}!","error no": 0, "id": ${it.jobStatus.id}""" + } else { + """{"message":"hello ${it.jobStatus.appId}!","error no": 0, "id": ${it.jobStatus.id}}""" + } view.setData(this) - }} + } + } } } - class MockSparkBatchJobViewer : LivyBatchJobViewer() { override val jobViewerControl: Control by lazy { MockSparkBatchJobViewerControl(this@MockSparkBatchJobViewer) } } @@ -119,100 +129,180 @@ fun getJobListPage(pageLink: String?): JobPage? { println("Get job list from $pageLink") return when (pageLink) { - "http://page1" -> object : JobPage { - override fun nextPageLink(): String? { - return "http://page2" - } + "http://page1" -> + object : JobPage { + override fun nextPageLink(): String? { + return "http://page2" + } - override fun items(): List? { - return listOf( - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 1, - "appId": "application-134124194-1", - "state": "running" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 2, - "appId": null, - "state": "dead" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 3, - "state": "success" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 4, - "appId": "application-134124194-4" - }""".trimIndent())) - ) - } - } - "http://page2" -> object : JobPage { - override fun nextPageLink(): String? { - return "http://page3" + override fun items(): List? { + return listOf( + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 1, + "appId": "application-134124194-1", + "state": "running" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 2, + "appId": null, + "state": "dead" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 3, + "state": "success" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 4, + "appId": "application-134124194-4" + } + """.trimIndent(), + ), + ), + ) + } } + "http://page2" -> + object : JobPage { + override fun nextPageLink(): String? { + return "http://page3" + } - override fun items(): List? { - return listOf( - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 5, - "appId": "application-134124194-5", - "state": "running" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 6, - "appId": null, - "state": "dead" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 7, - "state": "success" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 8, - "appId": "application-134124194-8" - }""".trimIndent())) - ) - } - } - "http://page3" -> object : JobPage { - override fun nextPageLink(): String? { - return null + override fun items(): List? { + return listOf( + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 5, + "appId": "application-134124194-5", + "state": "running" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 6, + "appId": null, + "state": "dead" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 7, + "state": "success" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 8, + "appId": "application-134124194-8" + } + """.trimIndent(), + ), + ), + ) + } } + "http://page3" -> + object : JobPage { + override fun nextPageLink(): String? { + return null + } - override fun items(): List? { - return listOf( - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 9, - "appId": "application-134124194-9", - "state": "running" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 10, - "appId": null, - "state": "dead" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 11, - "state": "success" - }""".trimIndent())), - tableSchema.MockSparkJobDescriptor(parseJSON("""{ - "id": 12, - "appId": "application-134124194-12" - }""".trimIndent())) - ) + override fun items(): List? { + return listOf( + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 9, + "appId": "application-134124194-9", + "state": "running" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 10, + "appId": null, + "state": "dead" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 11, + "state": "success" + } + """.trimIndent(), + ), + ), + tableSchema.MockSparkJobDescriptor( + parseJSON( + """ + { + "id": 12, + "appId": "application-134124194-12" + } + """.trimIndent(), + ), + ), + ) + } } - } else -> null } } + @Ignore class SparkJobTableTest : SparkUITest() { - @Test fun testLivyTable() { - val model = LivyBatchJobViewer.Model(LivyBatchJobTableViewport.Model( - LivyBatchJobTableModel(tableSchema), getJobListPage("http://page1"))) + val model = + LivyBatchJobViewer.Model( + LivyBatchJobTableViewport.Model( + LivyBatchJobTableModel(tableSchema), + getJobListPage("http://page1"), + ), + ) jobView.setData(model) @@ -220,11 +310,13 @@ class SparkJobTableTest : SparkUITest() { contentPane.add(jobView.component) pack() - addWindowListener(object: WindowAdapter() { - override fun windowClosing(e: WindowEvent?) { - jobView.dispose() - } - }) + addWindowListener( + object : WindowAdapter() { + override fun windowClosing(e: WindowEvent?) { + jobView.dispose() + } + }, + ) isVisible = true } } diff --git a/Utils/azure-toolkit-ide-hdinsight-libs/hdinsight-node-common/pom.xml b/Utils/azure-toolkit-ide-hdinsight-libs/hdinsight-node-common/pom.xml index a27bd07df74..03d1091a1f6 100644 --- a/Utils/azure-toolkit-ide-hdinsight-libs/hdinsight-node-common/pom.xml +++ b/Utils/azure-toolkit-ide-hdinsight-libs/hdinsight-node-common/pom.xml @@ -10,7 +10,7 @@ ${project.artifactId}-${project.version}.jar true UTF-8 - 2.12.10 + 2.12.18 3.4.0 true @@ -108,7 +108,7 @@ net.alchim31.maven scala-maven-plugin - 4.8.0 + 4.8.1 @@ -147,7 +147,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 + 3.13.0 diff --git a/Utils/azure-toolkit-ide-hdinsight-libs/pom.xml b/Utils/azure-toolkit-ide-hdinsight-libs/pom.xml index 2c2f7c20ac7..f1b821e2f53 100644 --- a/Utils/azure-toolkit-ide-hdinsight-libs/pom.xml +++ b/Utils/azure-toolkit-ide-hdinsight-libs/pom.xml @@ -24,6 +24,7 @@ 6.4.0 3.4.0 1.1.10.4 + 1.18.36 3.6.0 @@ -78,6 +79,11 @@ pom import + + org.projectlombok + lombok + ${lombok.version} + io.netty netty-handler diff --git a/Utils/azure-toolkit-ide-hdinsight-libs/spark-localrun-mock/pom.xml b/Utils/azure-toolkit-ide-hdinsight-libs/spark-localrun-mock/pom.xml index 970393983ba..553df33fdef 100644 --- a/Utils/azure-toolkit-ide-hdinsight-libs/spark-localrun-mock/pom.xml +++ b/Utils/azure-toolkit-ide-hdinsight-libs/spark-localrun-mock/pom.xml @@ -12,7 +12,7 @@ ${project.artifactId}-${project.version}.jar false UTF-8 - 2.12.10 + 2.12.18 3.4.0 true diff --git a/Utils/azure-toolkit-ide-libs/azure-toolkit-ide-common-lib/src/main/resources/bundles/com/microsoft/azure/toolkit/operation.properties b/Utils/azure-toolkit-ide-libs/azure-toolkit-ide-common-lib/src/main/resources/bundles/com/microsoft/azure/toolkit/operation.properties index b32b9bd5f4a..1ddda68a956 100644 --- a/Utils/azure-toolkit-ide-libs/azure-toolkit-ide-common-lib/src/main/resources/bundles/com/microsoft/azure/toolkit/operation.properties +++ b/Utils/azure-toolkit-ide-libs/azure-toolkit-ide-common-lib/src/main/resources/bundles/com/microsoft/azure/toolkit/operation.properties @@ -1012,4 +1012,5 @@ internal/guidance.create_resource_group=create Resource Group internal/guidance.open_container_app_in_browser=open Container App in browser user/guidance.open_container_app_log_streaming=open Container App log streaming -actions.common.deploy_to_azure=deploy to Azure \ No newline at end of file +actions.common.deploy_to_azure=deploy to Azure +user/appmod.refresh_migrate_node=Refresh Migrate to Azure Node diff --git a/Utils/azure-toolkit-ide-libs/pom.xml b/Utils/azure-toolkit-ide-libs/pom.xml index 3b5ec3442e6..76949ce97c2 100644 --- a/Utils/azure-toolkit-ide-libs/pom.xml +++ b/Utils/azure-toolkit-ide-libs/pom.xml @@ -57,6 +57,7 @@ 17 17 + 1.18.36 0.52.2 @@ -104,6 +105,11 @@ netty-codec-http2 4.1.124.Final + + org.projectlombok + lombok + ${lombok.version} + com.microsoft.azure azure-toolkit-ide-common-lib diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd491770..e6441136f3d 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradlew b/gradlew index 1aa94a42690..b740cf13397 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f135..25da30dbdee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail