Skip to content

Commit 837c817

Browse files
fix: remove reflection from SbtVersionOptionsPanel and reduce reflection in AzureCosmosDbAccountParamEditor
- SbtVersionOptionsPanel: upgrade Scala plugin dependency from 2024.2.5 to 2026.1.8, use Versions\$.MODULE\$.loadSbtVersions() directly instead of reflection - AzureCosmosDbAccountParamEditor: replace 3 FieldUtils.readField() calls with 1, use LocalDataSource.getSslCfg().myEnabled for SSL toggle instead of drilling into private UI fields via reflection - Only remaining reflection: DataInterchange.myConfigurable (no public API exists)
1 parent a850cca commit 837c817

3 files changed

Lines changed: 24 additions & 36 deletions

File tree

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-cosmos/src/main/java/com/microsoft/azure/toolkit/intellij/cosmos/dbtools/AzureCosmosDbAccountParamEditor.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import com.intellij.openapi.wm.ToolWindowManager;
2525
import com.intellij.ui.ComponentUtil;
2626
import com.intellij.ui.HyperlinkLabel;
27-
import com.intellij.ui.components.JBCheckBox;
27+
import com.intellij.database.dataSource.DataSourceSslConfiguration;
2828
import com.microsoft.azure.toolkit.ide.common.action.ResourceCommonActionsContributor;
2929
import com.microsoft.azure.toolkit.intellij.common.AzureComboBox;
3030
import com.microsoft.azure.toolkit.intellij.cosmos.creation.CreateCosmosDBAccountAction;
@@ -195,29 +195,31 @@ private void setAccount(@Nullable CosmosDBAccount account) {
195195
consumer.consume("user", user);
196196
consumer.consume("port", port);
197197
});
198-
this.setUsername(user);
198+
// this.setUsername(user); // setUsername is not needed as putProperties should update the model
199199
this.updating = false;
200200
}, AzureTask.Modality.ANY);
201201
});
202202
}
203203

204204
private void setUsername(String user) {
205-
final UrlEditorModel model = this.getDataSourceConfigurable().getUrlEditor().getEditorModel();
206-
model.setParameter("user", user);
207-
model.commit(true);
205+
// No longer needed, interchange.putProperties handles this
208206
}
209207

210208
@SneakyThrows
211209
private void setUseSsl(boolean useSsl) {
212-
final DataSourceConfigurable configurable = this.getDataSourceConfigurable();
213-
// getSshSslPanel() was removed in IntelliJ 261; use reflection to access the panel field directly
214-
final Object sshSslPanel = FieldUtils.readField(configurable, "mySshSslPanel", true);
215-
final JBCheckBox useSSLCheckBox = (JBCheckBox) FieldUtils.readField(sshSslPanel, "myUseSSLJBCheckBox", true);
216-
useSSLCheckBox.setSelected(useSsl);
210+
final DataInterchange interchange = this.getInterchange();
211+
final LocalDataSource dataSource = interchange.getDataSource();
212+
DataSourceSslConfiguration sslCfg = dataSource.getSslCfg();
213+
if (sslCfg == null) {
214+
sslCfg = new DataSourceSslConfiguration(false, null);
215+
}
216+
sslCfg.myEnabled = useSsl;
217+
dataSource.setSslCfg(sslCfg);
217218
}
218219

219220
@SneakyThrows
220221
private DataSourceConfigurable getDataSourceConfigurable() {
222+
// This is the only way to get the configurable from the interchange as of 2026.1
221223
return (DataSourceConfigurable) FieldUtils.readField(this.getInterchange(), "myConfigurable", true);
222224
}
223225

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ dependencies {
1818
// Plugin Dependencies. Uses `platformBundledPlugins` property from the gradle.properties file for bundled IntelliJ Platform plugins.
1919
bundledPlugin("com.intellij.java")
2020
bundledPlugin("org.jetbrains.idea.maven")
21-
plugin("org.intellij.scala:2024.2.5")
21+
plugin("org.intellij.scala:2026.1.8")
2222
}
2323
}

PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-hdinsight/src/main/java/com/microsoft/azure/hdinsight/projects/SbtVersionOptionsPanel.java

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55

66
package com.microsoft.azure.hdinsight.projects;
77

8+
import com.intellij.openapi.progress.ProgressIndicator;
89
import com.intellij.openapi.progress.ProgressManager;
910
import com.intellij.openapi.ui.ComboBox;
1011
import com.microsoft.azure.hdinsight.common.logger.ILogger;
12+
import org.jetbrains.plugins.scala.project.Versions$;
13+
import org.jetbrains.sbt.SbtVersion;
1114
import scala.collection.immutable.Seq;
12-
import scala.reflect.ClassTag;
1315

1416
import javax.swing.*;
1517
import java.awt.*;
16-
import java.lang.reflect.Method;
1718

1819
public class SbtVersionOptionsPanel extends JPanel implements ILogger {
1920
private ComboBox sbtVersionComboBox;
@@ -38,36 +39,21 @@ public void updateSbtVersions() {
3839
final String[][] versions = new String[1][1];
3940
ProgressManager.getInstance().runProcess(() -> {
4041
try {
41-
// In newer Scala plugin versions, the API changed. Use reflection for cross-version compatibility.
42-
// Old: Versions.SBT$.MODULE$.loadVersionsWithProgress(null).versions() -> Seq<String>
43-
// New: Versions.loadSbtVersions(false, null) -> Seq<SbtVersion>
44-
final Class<?> versionsClass = Class.forName("org.jetbrains.plugins.scala.project.Versions");
45-
try {
46-
// Try new API first
47-
final Method loadSbtVersionsMethod = versionsClass.getMethod("loadSbtVersions", boolean.class, com.intellij.openapi.progress.ProgressIndicator.class);
48-
final Seq<?> sbtVersions = (Seq<?>) loadSbtVersionsMethod.invoke(null, false, null);
49-
final int size = sbtVersions.size();
50-
final String[] result = new String[size];
51-
for (int i = 0; i < size; i++) {
52-
result[i] = sbtVersions.apply(i).toString();
53-
}
54-
versions[0] = result;
55-
} catch (final NoSuchMethodException e) {
56-
// Fallback to old API
57-
final Class<?> versionsSbtClass = Class.forName("org.jetbrains.plugins.scala.project.Versions$SBT$");
58-
final Object module = versionsSbtClass.getField("MODULE$").get(null);
59-
final Method loadMethod = module.getClass().getMethod("loadVersionsWithProgress", com.intellij.openapi.progress.ProgressIndicator.class);
60-
final Object loadedVersions = loadMethod.invoke(module, (Object) null);
61-
final Method versionsMethod = loadedVersions.getClass().getMethod("versions");
62-
final Seq<String> versionSeq = (Seq<String>) versionsMethod.invoke(loadedVersions);
63-
versions[0] = (String[]) versionSeq.toArray(ClassTag.apply(String.class));
42+
// Access Scala companion object directly: Versions$.MODULE$.loadSbtVersions()
43+
final Seq<SbtVersion> sbtVersions = Versions$.MODULE$.loadSbtVersions(false, (ProgressIndicator) null);
44+
final int size = sbtVersions.size();
45+
final String[] result = new String[size];
46+
for (int i = 0; i < size; i++) {
47+
result[i] = sbtVersions.apply(i).toString();
6448
}
49+
versions[0] = result;
6550
} catch (final Exception e) {
6651
log().warn("Failed to get SBT versions from scala plugin.", e);
6752
versions[0] = new String[0];
6853
}
6954
}, null);
7055

56+
this.sbtVersionComboBox.removeAllItems();
7157
for (String version : versions[0]) {
7258
this.sbtVersionComboBox.addItem(version);
7359
}

0 commit comments

Comments
 (0)