Skip to content

Commit e65a986

Browse files
authored
Merge pull request #5048 from microsoft/app/combobox
Update AppServiceComboBox to adapt AzureComboBox refresh strategy
2 parents 25e4d38 + 355153e commit e65a986

File tree

5 files changed

+31
-61
lines changed

5 files changed

+31
-61
lines changed

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/appservice/AppServiceComboBox.java

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,72 +12,46 @@
1212
import com.microsoft.azure.toolkit.intellij.common.AzureComboBox;
1313
import com.microsoft.azuretools.azurecommons.helpers.NotNull;
1414
import com.microsoft.azuretools.azurecommons.helpers.Nullable;
15-
import com.microsoft.tooling.msservices.components.DefaultLoader;
1615
import org.apache.commons.lang3.StringUtils;
17-
import org.apache.commons.lang3.exception.ExceptionUtils;
1816
import rx.Subscription;
1917

2018
import javax.swing.*;
21-
import java.io.InterruptedIOException;
19+
import java.util.List;
2220
import java.util.Objects;
2321

24-
import static com.microsoft.intellij.util.RxJavaUtils.unsubscribeSubscription;
25-
2622
public abstract class AppServiceComboBox<T extends AppServiceComboBoxModel> extends AzureComboBox<T> {
2723

2824
protected Project project;
2925
protected Subscription subscription;
3026

27+
private T configModel;
28+
3129
public AppServiceComboBox(final Project project) {
3230
super(false);
3331
this.project = project;
3432
this.setRenderer(new AppCombineBoxRender(this));
3533
}
3634

37-
// todo: optimize refreshing logic
38-
public synchronized void refreshItemsWithDefaultValue(@NotNull T defaultValue) {
39-
unsubscribeSubscription(subscription);
40-
this.setLoading(true);
41-
this.removeAllItems();
42-
this.addItem(defaultValue);
43-
subscription = this.loadItemsAsync()
44-
.subscribe(items -> DefaultLoader.getIdeHelper().invokeLater(() -> {
45-
synchronized (AppServiceComboBox.this) {
46-
AppServiceComboBox.this.removeAllItems();
47-
items.forEach(this::addItem);
48-
this.resetDefaultValue(defaultValue);
49-
this.setLoading(false);
50-
}
51-
}), this::handleLoadingError);
52-
}
53-
54-
private void resetDefaultValue(@NotNull T defaultValue) {
55-
final AppServiceComboBoxModel model = getItems()
56-
.stream()
57-
.filter(item -> AppServiceComboBoxModel.isSameApp(defaultValue, item) && item != defaultValue)
58-
.findFirst().orElse(null);
59-
if (model != null) {
60-
this.setSelectedItem(model);
61-
this.removeItem(defaultValue);
62-
} else if (defaultValue.isNewCreateResource()) {
63-
return;
64-
} else {
65-
this.setSelectedItem(null);
66-
this.removeItem(defaultValue);
67-
}
35+
public void setConfigModel(T configModel) {
36+
this.configModel = configModel;
37+
setValue(new ItemReference<>(item -> AppServiceComboBoxModel.isSameApp(item, configModel)));
6838
}
6939

40+
@NotNull
7041
@Override
71-
protected void handleLoadingError(final Throwable e) {
72-
final Throwable rootCause = ExceptionUtils.getRootCause(e);
73-
if (rootCause instanceof InterruptedIOException || rootCause instanceof InterruptedException) {
74-
// Swallow interrupted exception caused by unsubscribe
75-
return;
42+
protected List<? extends T> loadItems() throws Exception {
43+
final List<T> items = loadAppServiceModels();
44+
if (configModel != null && configModel.isNewCreateResource()) {
45+
final boolean exist = items.stream().anyMatch(item -> AppServiceComboBoxModel.isSameApp(item, configModel));
46+
if (!exist) {
47+
items.add(configModel);
48+
}
7649
}
77-
this.setLoading(false);
78-
super.handleLoadingError(e);
50+
return items;
7951
}
8052

53+
protected abstract List<T> loadAppServiceModels() throws Exception;
54+
8155
@Nullable
8256
@Override
8357
protected ExtendableTextComponent.Extension getExtension() {

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/FunctionAppComboBox.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protected void createResource() {
4646
name = "function.list.detail|subscription|selected",
4747
type = AzureOperation.Type.SERVICE
4848
)
49-
protected List<? extends FunctionAppComboBoxModel> loadItems() throws Exception {
49+
protected List<FunctionAppComboBoxModel> loadAppServiceModels() throws Exception {
5050
return AzureFunctionMvpModel.getInstance().listJavaFunctionApps(false).parallelStream()
5151
.map(FunctionAppComboBoxModel::new)
5252
.sorted((app1, app2) -> app1.getAppName().compareToIgnoreCase(app2.getAppName()))

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/function/runner/deploy/ui/FunctionDeploymentPanel.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.ui.HyperlinkLabel;
1313
import com.intellij.ui.ListCellRendererWrapper;
1414
import com.microsoft.azure.toolkit.intellij.appservice.AppServiceComboBoxModel;
15+
import com.microsoft.azure.toolkit.intellij.common.AzureComboBox;
1516
import com.microsoft.azure.toolkit.intellij.function.FunctionAppComboBox;
1617
import com.microsoft.azure.toolkit.intellij.function.FunctionAppComboBoxModel;
1718
import com.microsoft.azure.toolkit.intellij.common.AzureSettingPanel;
@@ -130,14 +131,12 @@ protected void resetFromConfig(@NotNull FunctionDeployConfiguration configuratio
130131
this.appSettingsKey = configuration.getAppSettingsKey();
131132
appSettingsTable.setAppSettings(FunctionUtils.loadAppSettingsFromSecurityStorage(appSettingsKey));
132133
}
133-
if (StringUtils.isAllEmpty(configuration.getFunctionId(), configuration.getAppName())) {
134-
functionAppComboBox.refreshItems();
135-
} else {
136-
final FunctionAppComboBoxModel functionAppComboBoxModel =
137-
new FunctionAppComboBoxModel(configuration.getModel());
138-
appSettingsFunctionApp = functionAppComboBoxModel;
139-
functionAppComboBox.refreshItemsWithDefaultValue(functionAppComboBoxModel);
134+
if (!StringUtils.isAllEmpty(configuration.getFunctionId(), configuration.getAppName())) {
135+
final FunctionAppComboBoxModel configModel = new FunctionAppComboBoxModel(configuration.getModel());
136+
appSettingsFunctionApp = configModel;
137+
functionAppComboBox.setConfigModel(configModel);
140138
}
139+
functionAppComboBox.refreshItems();
141140
final Module previousModule = configuration.getModule();
142141
if (previousModule != null) {
143142
for (int i = 0; i < cbFunctionModule.getItemCount(); i++) {

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/webapp/WebAppComboBox.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ protected void createResource() {
4444
name = "webapp.list.detail|subscription|selected",
4545
type = AzureOperation.Type.SERVICE
4646
)
47-
protected List<WebAppComboBoxModel> loadItems() throws Exception {
47+
protected List<WebAppComboBoxModel> loadAppServiceModels() throws Exception {
4848
return AzureWebAppMvpModel.getInstance().listJavaWebApps(false).parallelStream()
4949
.map(WebAppComboBoxModel::new)
5050
.sorted((app1, app2) -> app1.getAppName().compareToIgnoreCase(app2.getAppName()))

PluginsAndFeatures/azure-toolkit-for-intellij/src/com/microsoft/azure/toolkit/intellij/webapp/runner/webappconfig/slimui/WebAppSlimSettingPanel.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
import com.intellij.ui.HideableDecorator;
1414
import com.intellij.ui.HyperlinkLabel;
1515
import com.microsoft.azure.management.appservice.DeploymentSlot;
16-
import com.microsoft.azure.toolkit.intellij.common.AzureArtifactComboBox;
16+
import com.microsoft.azure.toolkit.intellij.appservice.AppServiceComboBoxModel;
17+
import com.microsoft.azure.toolkit.intellij.common.*;
1718
import com.microsoft.azure.toolkit.intellij.webapp.WebAppComboBox;
1819
import com.microsoft.azure.toolkit.intellij.webapp.WebAppComboBoxModel;
19-
import com.microsoft.azure.toolkit.intellij.common.AzureSettingPanel;
2020
import com.microsoft.azure.toolkit.intellij.webapp.runner.Constants;
2121
import com.microsoft.azure.toolkit.intellij.webapp.runner.webappconfig.WebAppConfiguration;
22-
import com.microsoft.azure.toolkit.intellij.common.AzureArtifact;
23-
import com.microsoft.azure.toolkit.intellij.common.AzureArtifactManager;
2422
import com.microsoft.intellij.ui.util.UIUtils;
2523
import com.microsoft.tooling.msservices.components.DefaultLoader;
2624
import org.apache.commons.compress.utils.FileNameUtils;
@@ -186,12 +184,11 @@ protected JLabel getLblMavenProject() {
186184

187185
@Override
188186
protected void resetFromConfig(@NotNull WebAppConfiguration configuration) {
189-
final WebAppComboBoxModel configurationModel = new WebAppComboBoxModel(configuration.getModel());
190-
if (StringUtils.isAllEmpty(configurationModel.getAppName(), configurationModel.getResourceId())) {
191-
comboBoxWebApp.refreshItems();
192-
} else {
193-
comboBoxWebApp.refreshItemsWithDefaultValue(configurationModel);
187+
if (!StringUtils.isAllEmpty(configuration.getWebAppName(), configuration.getWebAppId())) {
188+
final WebAppComboBoxModel configModel = new WebAppComboBoxModel(configuration.getModel());
189+
comboBoxWebApp.setConfigModel(configModel);
194190
}
191+
comboBoxWebApp.refreshItems();
195192
if (configuration.getAzureArtifactType() != null) {
196193
lastSelectedAzureArtifact = AzureArtifactManager
197194
.getInstance(project)

0 commit comments

Comments
 (0)