Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.

Commit 249eacd

Browse files
committed
feat: ctx menu or dialog shows "namespace"/"project" depending on cluster type (#237, #701)
Signed-off-by: Andre Dietisheim <[email protected]> Signed-off-by: Stephane Bouchet <[email protected]>
1 parent 6d7e8db commit 249eacd

File tree

6 files changed

+105
-44
lines changed

6 files changed

+105
-44
lines changed

src/main/java/org/jboss/tools/intellij/openshift/actions/OdoAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void actionPerformed(AnActionEvent anActionEvent, TreePath path, Object s
4545
this.actionPerformedOnSelectedObject(anActionEvent, getElement(selected), odo);
4646
}
4747

48-
private Odo getOdo(AnActionEvent anActionEvent) {
48+
protected Odo getOdo(AnActionEvent anActionEvent) {
4949
try {
5050
return ActionUtils.getApplicationRootNode(anActionEvent).getOdo().getNow(null);
5151
} catch(Exception e) {

src/main/java/org/jboss/tools/intellij/openshift/actions/project/CreateProjectAction.java

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.jboss.tools.intellij.openshift.ui.project.CreateNewProjectDialog;
2626
import org.jboss.tools.intellij.openshift.utils.odo.Odo;
2727
import org.jetbrains.annotations.NotNull;
28+
import org.slf4j.Logger;
29+
import org.slf4j.LoggerFactory;
2830

2931
import java.awt.Point;
3032
import java.io.IOException;
@@ -33,10 +35,27 @@
3335
import java.util.concurrent.CompletionException;
3436

3537
import static org.jboss.tools.intellij.openshift.actions.ActionUtils.runWithProgress;
38+
import static org.jboss.tools.intellij.openshift.actions.NodeUtils.getRoot;
3639
import static org.jboss.tools.intellij.openshift.telemetry.TelemetryService.TelemetryResult;
3740

3841
public class CreateProjectAction extends LoggedInClusterAction {
3942

43+
private static final Logger LOGGER = LoggerFactory.getLogger(CreateProjectAction.class);
44+
45+
@Override
46+
public void update(AnActionEvent e) {
47+
super.update(e);
48+
if (e.getPresentation().isVisible()) {
49+
Odo odo = getOdo(e);
50+
if (odo == null) {
51+
return;
52+
}
53+
if (!odo.isOpenShift()) {
54+
e.getPresentation().setText("New " + getKind(odo));
55+
}
56+
}
57+
}
58+
4059
@Override
4160
public String getTelemetryActionName() { return "create project"; }
4261

@@ -55,14 +74,15 @@ public void actionPerformedOnSelectedObject(AnActionEvent anActionEvent, Object
5574
doActionPerformed(location, odo, getEventProject(anActionEvent));
5675
}
5776

58-
private void doActionPerformed(final Point location, final Odo odo, Project project) {
77+
private void doActionPerformed(final Point location, @NotNull final Odo odo, Project project) {
78+
String kind = getKind(odo);
5979
runWithProgress((ProgressIndicator progress) ->
6080
CompletableFuture
6181
.supplyAsync(() -> {
6282
try {
6383
return odo.getNamespaces();
6484
} catch (IOException e) {
65-
NotificationUtils.notifyError("Create New Project", "Could not get projects: " + e.getMessage());
85+
NotificationUtils.notifyError("Create New " + kind, "Could not get " + kind.toLowerCase() + "s: " + e.getMessage());
6686
sendTelemetryError(e.getMessage());
6787
throw new CompletionException(e);
6888
}
@@ -71,7 +91,7 @@ private void doActionPerformed(final Point location, final Odo odo, Project proj
7191
if (error != null) {
7292
return null;
7393
}
74-
CreateNewProjectDialog dialog = openCreateProjectDialog(allProjects, location, project);
94+
CreateNewProjectDialog dialog = openCreateProjectDialog(allProjects, kind, location, project);
7595
if (dialog.isOK()) {
7696
return dialog.getNewProject();
7797
} else {
@@ -87,28 +107,54 @@ private void doActionPerformed(final Point location, final Odo odo, Project proj
87107
}
88108
createProject(newProject, odo);
89109
}, SwingUtils.EXECUTOR_BACKGROUND),
90-
"Create Active Project...",
91-
project);
110+
"Create Active " + kind + "...",
111+
project);
92112
}
93113

94-
private void createProject(String newProject, Odo odo) {
95-
Notification notification = NotificationUtils.notifyInformation("Create Project", "Creating project " + newProject);
114+
private void createProject(String newProject, @NotNull Odo odo) {
115+
String kind = getKind(odo);
116+
Notification notification = NotificationUtils.notifyInformation("Create " + kind, "Creating " + kind.toLowerCase() + " newProject");
96117
try {
97-
odo.createProject(newProject);
98-
notification.expire();
99-
NotificationUtils.notifyInformation("Create Project", "Project " + newProject + " successfully created");
100-
sendTelemetryResults(TelemetryResult.SUCCESS);
101-
} catch (IOException | CompletionException e) {
102-
notification.expire();
103-
sendTelemetryError(e);
104-
UIHelper.executeInUI(() -> Messages.showErrorDialog("Error: " + e.getLocalizedMessage(), "Create Project"));
105-
}
118+
odo.createProject(newProject);
119+
notification.expire();
120+
NotificationUtils.notifyInformation("Create " + kind, kind + newProject + " successfully created");
121+
sendTelemetryResults(TelemetryResult.SUCCESS);
122+
} catch (IOException | CompletionException e) {
123+
notification.expire();
124+
sendTelemetryError(e);
125+
UIHelper.executeInUI(() -> Messages.showErrorDialog("Error: " + e.getLocalizedMessage(), "Create " + kind));
126+
}
106127
}
107128

108-
private CreateNewProjectDialog openCreateProjectDialog(List<String> allProjects, Point location, Project project) {
109-
CreateNewProjectDialog dialog = new CreateNewProjectDialog(project, allProjects, location);
129+
protected CreateNewProjectDialog openCreateProjectDialog(List<String> allProjects, String kind, Point location, Project project) {
130+
CreateNewProjectDialog dialog = new CreateNewProjectDialog(project, allProjects, kind, location);
110131
dialog.show();
111132
return dialog;
112133
}
113134

135+
@Override
136+
public boolean isVisible(Object selected) {
137+
return isRoot(selected)
138+
&& isLoggedIn(selected);
139+
}
140+
141+
private boolean isLoggedIn(Object node) {
142+
ApplicationsRootNode root = getRoot(node);
143+
if (root == null) {
144+
return false;
145+
}
146+
return root.isLogged();
147+
}
148+
149+
private boolean isRoot(Object node) {
150+
return node instanceof ApplicationsRootNode;
151+
}
152+
153+
private String getKind(Odo odo) {
154+
if (odo.isOpenShift()) {
155+
return "Project";
156+
} else {
157+
return "Namespace";
158+
}
159+
}
114160
}

src/main/java/org/jboss/tools/intellij/openshift/ui/BaseDialog.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@ public abstract class BaseDialog extends DialogWrapper {
3434
protected BaseDialog(@Nullable Project project, Point location) {
3535
super(project, false);
3636
this.location = location;
37-
init();
3837
}
3938

39+
/**
40+
* Set the borders, location etc.
41+
* Has to be called from the extending subclass.
42+
*/
4043
@Override
4144
protected void init() {
4245
super.init();

src/main/java/org/jboss/tools/intellij/openshift/ui/project/CreateNewProjectDialog.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,16 @@
3232

3333
public class CreateNewProjectDialog extends BaseDialog {
3434

35-
private static final int WIDTH = 300;
35+
private static final int WIDTH = 200;
36+
private final String kind;
3637
private final Collection<String> allProjects;
3738
private JBTextField newProjectTextField;
3839

3940
private String newProject;
4041

41-
public CreateNewProjectDialog(@Nullable Project project, Collection<String> allProjects, Point location) {
42+
public CreateNewProjectDialog(@Nullable Project project, Collection<String> allProjects, String kind, Point location) {
4243
super(project, location);
44+
this.kind = kind;
4345
this.allProjects = allProjects;
4446
init();
4547
}
@@ -48,15 +50,15 @@ public CreateNewProjectDialog(@Nullable Project project, Collection<String> allP
4850
protected void init() {
4951
super.init();
5052
setOKButtonText("Create");
51-
setTitle("Create New Project");
53+
setTitle("Create New " + kind);
5254
}
5355

5456
@Override
5557
protected @Nullable JComponent createCenterPanel() {
5658
JComponent panel = new JPanel(new MigLayout(
5759
"flowx, ins 0, gap 0, fillx, filly, hidemode 3",
5860
"[left]10[" + WIDTH +",fill]"));
59-
JLabel newActiveProjectLabel = new JBLabel("New project:", SwingConstants.LEFT);
61+
JLabel newActiveProjectLabel = new JBLabel("New " + kind.toLowerCase() + ":", SwingConstants.LEFT);
6062
newActiveProjectLabel.setBorder(JBUI.Borders.empty(10, 0));
6163
panel.add(newActiveProjectLabel, "left, bottom");
6264
this.newProjectTextField = new JBTextField();
@@ -97,7 +99,7 @@ public ValidationInfo get() {
9799
private ValidationInfo getValidationInfo(String newProject) {
98100
ValidationInfo validation = new ValidationInfo("").withOKEnabled();
99101
if (StringUtil.isEmptyOrSpaces(newProject)) {
100-
validation = new ValidationInfo("Provide project name").forComponent(newProjectTextField).asWarning();
102+
validation = new ValidationInfo("Provide " + kind.toLowerCase() + " name").forComponent(newProjectTextField).asWarning();
101103
} else if (allProjects.contains(newProject)) {
102104
validation = new ValidationInfo("Already exists, choose new name").forComponent(newProjectTextField).asWarning();
103105
} else if (!nameRegex.matcher(newProject).matches()) {

src/test/java/org/jboss/tools/intellij/openshift/actions/ActionTest.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@
2828
import org.jboss.tools.intellij.openshift.utils.odo.ComponentFeature;
2929
import org.jboss.tools.intellij.openshift.utils.odo.ComponentFeatures;
3030
import org.jboss.tools.intellij.openshift.utils.odo.ComponentInfo;
31+
import org.jboss.tools.intellij.openshift.utils.odo.Odo;
3132
import org.jboss.tools.intellij.openshift.utils.odo.Service;
3233
import org.jboss.tools.intellij.openshift.utils.odo.URL;
34+
import org.jetbrains.annotations.NotNull;
3335

3436
import javax.swing.tree.TreePath;
3537
import javax.swing.tree.TreeSelectionModel;
38+
import java.util.concurrent.CompletableFuture;
3639

40+
import static org.mockito.ArgumentMatchers.any;
3741
import static org.mockito.Mockito.mock;
3842
import static org.mockito.Mockito.when;
3943

@@ -56,8 +60,8 @@ public AnActionEvent createEvent(Object selected) {
5660
public abstract AnAction getAction();
5761

5862
public void testActionOnLoggedInCluster() {
59-
ApplicationsRootNode applicationsRootNode = mock(ApplicationsRootNode.class);
60-
when(applicationsRootNode.isLogged()).thenReturn(true);
63+
CompletableFuture<Odo> odoFuture = createOdoFuture(true);
64+
ApplicationsRootNode applicationsRootNode = createApplicationRootNode(true, odoFuture);
6165
AnActionEvent event = createEvent(applicationsRootNode);
6266
AnAction action = getAction();
6367
action.update(event);
@@ -81,6 +85,24 @@ protected void verifyLoggedOutCluster(boolean visible) {
8185
assertFalse(visible);
8286
}
8387

88+
@NotNull
89+
protected static ApplicationsRootNode createApplicationRootNode(boolean loggedIn, CompletableFuture<Odo> odoFuture) {
90+
ApplicationsRootNode applicationsRootNode = mock(ApplicationsRootNode.class);
91+
when(applicationsRootNode.isLogged()).thenReturn(loggedIn);
92+
when(applicationsRootNode.getRoot()).thenReturn(applicationsRootNode);
93+
when(applicationsRootNode.getOdo()).thenReturn(odoFuture);
94+
return applicationsRootNode;
95+
}
96+
97+
@NotNull
98+
protected static CompletableFuture<Odo> createOdoFuture(boolean isOpenShift) {
99+
Odo odo = mock(Odo.class);
100+
when(odo.isOpenShift()).thenReturn(isOpenShift);
101+
CompletableFuture<Odo> odoFuture = mock(CompletableFuture.class);
102+
when(odoFuture.getNow(any())).thenReturn(odo);
103+
return odoFuture;
104+
}
105+
84106
public void testActionOnProject() {
85107
NamespaceNode projectNode = mock(NamespaceNode.class);
86108
AnActionEvent event = createEvent(projectNode);

src/test/java/org/jboss/tools/intellij/openshift/actions/project/CreateProjectActionTest.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,16 @@
1919
import org.jboss.tools.intellij.openshift.actions.ActionTest;
2020

2121
import static org.mockito.Mockito.mock;
22-
import static org.mockito.Mockito.when;
2322

2423
public class CreateProjectActionTest extends ActionTest {
2524
@Override
2625
public AnAction getAction() {
2726
return new CreateProjectAction();
2827
}
2928

30-
public void testActionOnLoggedInCluster() {
31-
ApplicationsRootNode applicationsRootNode = mock(ApplicationsRootNode.class);
32-
when(applicationsRootNode.isLogged()).thenReturn(true);
33-
AnActionEvent event = createEvent(applicationsRootNode);
34-
AnAction action = getAction();
35-
action.update(event);
36-
assertTrue(event.getPresentation().isVisible());
37-
}
38-
39-
public void testThatActionOnLoggedOutCluster() {
40-
ApplicationsRootNode applicationsRootNode = mock(ApplicationsRootNode.class);
41-
when(applicationsRootNode.isLogged()).thenReturn(false);
42-
AnActionEvent event = createEvent(applicationsRootNode);
43-
AnAction action = getAction();
44-
action.update(event);
45-
assertFalse(event.getPresentation().isVisible());
29+
@Override
30+
protected void verifyLoggedInCluster(boolean visible) {
31+
assertTrue(visible);
4632
}
4733

4834
public void testActionOnProject() {
@@ -68,4 +54,6 @@ public void testActionOnService() {
6854
action.update(event);
6955
assertFalse(event.getPresentation().isVisible());
7056
}
57+
58+
7159
}

0 commit comments

Comments
 (0)