package org.intellij.sonar.configuration;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.swing.*;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.TableSpeedSearch;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.table.TableView;
import com.intellij.util.ui.ColumnInfo;
import com.intellij.util.ui.ListTableModel;
import org.intellij.sonar.persistence.SonarResource;
import org.intellij.sonar.persistence.SonarResourcesComponent;
import org.intellij.sonar.persistence.SonarServerConfig;
import org.intellij.sonar.persistence.SonarServers;
import org.intellij.sonar.sonarserver.SonarServer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.sonar.wsclient.services.Resource;
public class ResourcesSelectionConfigurable extends DialogWrapper {
private static final ColumnInfo<Resource,String> NAME_COLUMN = new ColumnInfo<Resource,String>("Name") {
@Nullable
@Override
public String valueOf(Resource resource) {
return SonarResource.of(resource).getName();
}
};
private static final ColumnInfo<Resource,String> KEY_COLUMN = new ColumnInfo<Resource,String>("Key") {
@Nullable
@Override
public String valueOf(Resource resource) {
return SonarResource.of(resource).getKey();
}
};
private Project myProject;
private String mySonarServerName;
private TableView<Resource> myResourcesTable = new TableView<Resource>();
private JButton myDownloadResourcesButton;
private JPanel myRootJPanel;
private JLabel mySelectSonarResourcesFrom;
private JPanel myPanelForSonarResources;
private List<Resource> myAllProjectsAndModules;
public List<Resource> getSelectedSonarResources() {
return selectedSonarResources;
}
private List<Resource> selectedSonarResources;
public ResourcesSelectionConfigurable(@Nullable Project project,@NotNull String sonarServerName) {
super(project);
myProject = project;
mySonarServerName = sonarServerName;
mySelectSonarResourcesFrom.setText(mySelectSonarResourcesFrom.getText()+" "+mySonarServerName);
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() {
myPanelForSonarResources.setLayout(new BorderLayout());
myPanelForSonarResources.add(createResourcesTableComponent(),BorderLayout.CENTER);
myAllProjectsAndModules = SonarResourcesComponent.getInstance().sonarResourcesBySonarServerName.get(
mySonarServerName
);
if (null == myAllProjectsAndModules)
myAllProjectsAndModules = new ArrayList<Resource>();
myResourcesTable.setModelAndUpdateColumns(
new ListTableModel<Resource>(
new ColumnInfo[]{NAME_COLUMN,KEY_COLUMN},
myAllProjectsAndModules,
0
)
);
new TableSpeedSearch(myResourcesTable);
myDownloadResourcesButton.addActionListener(
actionEvent -> {
DownloadResourcesRunnable downloadResourcesRunnable = new DownloadResourcesRunnable();
ProgressManager.getInstance()
.runProcessWithProgressSynchronously(
downloadResourcesRunnable,
"Loading SonarQube resources from server",
true,
myProject
);
}
);
return myRootJPanel;
}
private JComponent createResourcesTableComponent() {
JPanel panelForTable = ToolbarDecorator.createDecorator(myResourcesTable,null).
disableUpDownActions().
disableAddAction().disableRemoveAction().
createPanel();
panelForTable.setPreferredSize(new Dimension(-1,400));
return panelForTable;
}
private class DownloadResourcesRunnable implements Runnable {
@Override
public void run() {
final Optional<SonarServerConfig> sonarServerConfiguration = SonarServers.get(mySonarServerName);
if (sonarServerConfiguration.isPresent()) {
final SonarServer sonarServer = SonarServer.create(sonarServerConfiguration.get());
try {
myAllProjectsAndModules = sonarServer.getAllProjectsAndModules();
SonarResourcesComponent.getInstance().sonarResourcesBySonarServerName.put(
mySonarServerName,
ImmutableList.copyOf(myAllProjectsAndModules)
);
ApplicationManager.getApplication().invokeLater(
() -> myResourcesTable.setModelAndUpdateColumns(
new ListTableModel<Resource>(
new ColumnInfo[]{
NAME_COLUMN,
KEY_COLUMN
},myAllProjectsAndModules,0
)
)
);
} catch (Exception e) {
final String message = "Cannot fetch SonarQube project and modules from "+mySonarServerName
+"\n\n"+Throwables.getStackTraceAsString(e);
ApplicationManager.getApplication().invokeLater(
() -> Messages.showErrorDialog(message,"SonarQube Server Error")
);
}
}
}
}
@Override
protected void doOKAction() {
final int[] selectedRowsIndex = myResourcesTable.getSelectedRows();
selectedSonarResources = new ArrayList<Resource>(selectedRowsIndex.length);
for (int i : selectedRowsIndex) {
Resource sonarResource = myAllProjectsAndModules.get(i);
selectedSonarResources.add(sonarResource);
}
super.doOKAction();
}
}