Skip to content

Commit e160f68

Browse files
eharris369GitHub Enterprise
authored andcommitted
Merge pull request #193 from eharris/192-requireMicroclimate1811
Issue #192: Require Microclimate 18.11 and use capablities
2 parents ede9905 + 9ebd92a commit e160f68

File tree

11 files changed

+197
-18
lines changed

11 files changed

+197
-18
lines changed

dev/com.ibm.microclimate.core/src/com/ibm/microclimate/core/internal/MCEclipseApplication.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
import com.ibm.microclimate.core.MicroclimateCorePlugin;
4242
import com.ibm.microclimate.core.internal.connection.MicroclimateConnection;
43+
import com.ibm.microclimate.core.internal.constants.ProjectCapabilities;
4344
import com.ibm.microclimate.core.internal.constants.ProjectType;
4445
import com.ibm.microclimate.core.internal.launch.MicroclimateLaunchConfigDelegate;
4546
import com.ibm.microclimate.core.internal.messages.Messages;
@@ -219,5 +220,16 @@ private void validationEvent(int severity, String filePath, String message, Stri
219220
MCLogger.logError("Failed to create a marker for the " + name + " application: " + message, e);
220221
}
221222
}
223+
224+
@Override
225+
public boolean supportsDebug() {
226+
// Only supported for certain project types
227+
if (projectType.isType(ProjectType.TYPE_LIBERTY) || projectType.isType(ProjectType.TYPE_SPRING)) {
228+
// And only if the project supports it
229+
ProjectCapabilities capabilities = getProjectCapabilities();
230+
return capabilities.supportsDebugMode() && capabilities.canRestart();
231+
}
232+
return false;
233+
}
222234

223235
}

dev/com.ibm.microclimate.core/src/com/ibm/microclimate/core/internal/MicroclimateApplication.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,18 @@
99

1010
package com.ibm.microclimate.core.internal;
1111

12+
import java.io.IOException;
1213
import java.net.MalformedURLException;
1314
import java.net.URL;
1415

1516
import org.eclipse.core.runtime.IPath;
17+
import org.json.JSONException;
18+
import org.json.JSONObject;
1619

1720
import com.ibm.microclimate.core.internal.connection.MicroclimateConnection;
1821
import com.ibm.microclimate.core.internal.constants.AppState;
1922
import com.ibm.microclimate.core.internal.constants.BuildStatus;
23+
import com.ibm.microclimate.core.internal.constants.ProjectCapabilities;
2024
import com.ibm.microclimate.core.internal.constants.ProjectType;
2125
import com.ibm.microclimate.core.internal.constants.StartMode;
2226

@@ -39,6 +43,7 @@ public class MicroclimateApplication {
3943
private boolean autoBuild = true;
4044
private boolean enabled = true;
4145
private String containerId;
46+
private ProjectCapabilities projectCapabilities;
4247

4348
// Must be updated whenever httpPort changes. Can be null
4449
private URL baseUrl;
@@ -167,10 +172,6 @@ public boolean isRunning() {
167172
return baseUrl != null;
168173
}
169174

170-
public boolean isSupportedProject() {
171-
return mcConnection.supportsProjectType(projectType);
172-
}
173-
174175
public boolean hasBuildLog() {
175176
return (!projectType.isType(ProjectType.TYPE_NODE));
176177
}
@@ -201,6 +202,21 @@ public synchronized void invalidatePorts() {
201202
httpPort = -1;
202203
debugPort = -1;
203204
}
205+
206+
public ProjectCapabilities getProjectCapabilities() {
207+
if (projectCapabilities == null) {
208+
try {
209+
JSONObject obj = mcConnection.requestProjectCapabilities(this);
210+
projectCapabilities = new ProjectCapabilities(obj);
211+
} catch (Exception e) {
212+
MCLogger.logError("Failed to get the project capabilities for application: " + name, e); //$NON-NLS-1$
213+
}
214+
}
215+
if (projectCapabilities == null) {
216+
return ProjectCapabilities.emptyCapabilities;
217+
}
218+
return projectCapabilities;
219+
}
204220

205221
public void connectDebugger() {
206222
// Override as needed
@@ -225,6 +241,10 @@ public void validationError(String filePath, String message, String quickFixId,
225241
public void validationWarning(String filePath, String message, String quickFixId, String quickFixDescription) {
226242
// Override as needed
227243
}
244+
245+
public boolean supportsDebug() {
246+
return false;
247+
}
228248

229249
@Override
230250
public String toString() {

dev/com.ibm.microclimate.core/src/com/ibm/microclimate/core/internal/connection/MicroclimateConnection.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,24 @@ public void requestValidateGenerate(MicroclimateApplication app) throws JSONExce
402402
requestValidate(app);
403403
}
404404

405+
public JSONObject requestProjectCapabilities(MicroclimateApplication app) throws IOException, JSONException {
406+
final URI statusUrl = baseUrl.resolve(MCConstants.APIPATH_PROJECT_LIST + "/" + app.projectID + "/" + MCConstants.APIPATH_CAPABILITIES);
407+
408+
HttpResult result = HttpUtil.get(statusUrl);
409+
410+
if (!result.isGoodResponse) {
411+
final String msg = String.format("Received bad response from server %d with error message %s", //$NON-NLS-1$
412+
result.responseCode, result.error);
413+
throw new IOException(msg);
414+
} else if (result.response == null) {
415+
// I don't think this will ever happen.
416+
throw new IOException("Server returned good response code, but empty content when getting project capabilities"); //$NON-NLS-1$
417+
}
418+
419+
JSONObject capabilities = new JSONObject(result.response);
420+
return capabilities;
421+
}
422+
405423
public boolean isConnected() {
406424
return isConnected;
407425
}
@@ -497,9 +515,4 @@ public void requestProjectDelete(String projectId)
497515
public IPath getWorkspacePath() {
498516
return localWorkspacePath;
499517
}
500-
501-
public boolean supportsProjectType(ProjectType type) {
502-
return type.isType(ProjectType.TYPE_LIBERTY) ||
503-
(type.isType(ProjectType.TYPE_SPRING) && mcVersion >= MCConstants.SPRING_MC_VERSION);
504-
}
505518
}

dev/com.ibm.microclimate.core/src/com/ibm/microclimate/core/internal/constants/MCConstants.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ private MCConstants() {}
3131
APIPATH_BUILD = "build",
3232
APIPATH_CLOSE = "close",
3333
APIPATH_OPEN = "open",
34+
APIPATH_CAPABILITIES = "capabilities",
3435

3536
// JSON keys
3637
KEY_PROJECT_ID = "projectID",
@@ -91,6 +92,10 @@ private MCConstants() {}
9192
VALUE_TYPE_MISSING = "missing",
9293
VALUE_TYPE_INVALID = "invalid",
9394

95+
KEY_CAPABILIITES = "capabilities",
96+
KEY_START_MODES = "startModes",
97+
KEY_CONTROL_COMMANDS = "controlCommands",
98+
9499
KEY_AUTO_GENERATE = "autoGenerate",
95100

96101
// JSON attribute values
@@ -102,12 +107,8 @@ private MCConstants() {}
102107

103108
;
104109

105-
// Microclimate 18.09 is required
106-
// otherwise we will be missing the Workspace ENV data and the project restart endpoint.
110+
// Microclimate 18.11 is required as earlier versions are missing needed APIs.
107111
public static final int
108-
// This version supports only Liberty projects.
109-
REQUIRED_MC_VERSION = 1809,
110-
// This version supports both Spring and Liberty projects.
111-
SPRING_MC_VERSION = 1810;
112+
REQUIRED_MC_VERSION = 1811;
112113

113114
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*******************************************************************************
2+
* IBM Confidential
3+
* OCO Source Materials
4+
* (C) Copyright IBM Corp. 2018 All Rights Reserved.
5+
* The source code for this program is not published or otherwise
6+
* divested of its trade secrets, irrespective of what has
7+
* been deposited with the U.S. Copyright Office.
8+
*******************************************************************************/
9+
10+
package com.ibm.microclimate.core.internal.constants;
11+
12+
import java.util.HashSet;
13+
import java.util.Set;
14+
15+
import org.json.JSONArray;
16+
import org.json.JSONException;
17+
import org.json.JSONObject;
18+
19+
import com.ibm.microclimate.core.internal.MCLogger;
20+
21+
public class ProjectCapabilities {
22+
23+
public static final ProjectCapabilities emptyCapabilities = new ProjectCapabilities();
24+
25+
private final Set<StartMode> startModes = new HashSet<StartMode>();
26+
private final Set<ControlCommand> controlCommands = new HashSet<ControlCommand>();
27+
28+
public enum StartMode {
29+
RUN("run"),
30+
DEBUG("debug");
31+
32+
private final String name;
33+
34+
private StartMode(String name) {
35+
this.name = name;
36+
}
37+
38+
public String getName() {
39+
return name;
40+
}
41+
42+
public static StartMode getStartMode(String name) {
43+
for (StartMode mode : StartMode.values()) {
44+
if (mode.name.equals(name)) {
45+
return mode;
46+
}
47+
}
48+
return null;
49+
}
50+
};
51+
52+
public enum ControlCommand {
53+
RESTART("restart");
54+
55+
private final String name;
56+
57+
private ControlCommand(String name) {
58+
this.name = name;
59+
}
60+
61+
public String getName() {
62+
return name;
63+
}
64+
65+
public static ControlCommand getControlCommand(String name) {
66+
for (ControlCommand command : ControlCommand.values()) {
67+
if (command.name.equals(name)) {
68+
return command;
69+
}
70+
}
71+
return null;
72+
}
73+
}
74+
75+
public ProjectCapabilities(JSONObject capabilities) {
76+
try {
77+
if (capabilities.has(MCConstants.KEY_START_MODES)) {
78+
JSONArray modes = capabilities.getJSONArray(MCConstants.KEY_START_MODES);
79+
for (int i = 0; i < modes.length(); i++) {
80+
StartMode startMode = StartMode.getStartMode(modes.getString(i));
81+
if (startMode != null) {
82+
this.startModes.add(startMode);
83+
}
84+
}
85+
}
86+
} catch (JSONException e) {
87+
MCLogger.logError("Failed to parse the start mode capabilities.", e);
88+
}
89+
90+
try {
91+
if (capabilities.has(MCConstants.KEY_CONTROL_COMMANDS)) {
92+
JSONArray commands = capabilities.getJSONArray(MCConstants.KEY_CONTROL_COMMANDS);
93+
for (int i = 0; i < commands.length(); i++) {
94+
ControlCommand controlCommand = ControlCommand.getControlCommand(commands.getString(i));
95+
if (controlCommand != null) {
96+
this.controlCommands.add(controlCommand);
97+
}
98+
}
99+
}
100+
} catch (JSONException e) {
101+
MCLogger.logError("Failed to parse the control command capabilities.", e);
102+
}
103+
}
104+
105+
private ProjectCapabilities() {
106+
// Intentionally empty
107+
}
108+
109+
public boolean canRestart() {
110+
return controlCommands.contains(ControlCommand.RESTART);
111+
}
112+
113+
public boolean supportsDebugMode() {
114+
return startModes.contains(StartMode.DEBUG);
115+
}
116+
117+
}

dev/com.ibm.microclimate.ui/src/com/ibm/microclimate/ui/internal/actions/ImportProjectAction.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
import org.eclipse.jface.action.IAction;
1616
import org.eclipse.jface.viewers.ISelection;
1717
import org.eclipse.jface.viewers.IStructuredSelection;
18+
import org.eclipse.osgi.util.NLS;
1819
import org.eclipse.ui.IObjectActionDelegate;
1920
import org.eclipse.ui.IWorkbenchPart;
2021
import org.eclipse.ui.internal.wizards.datatransfer.SmartImportJob;
2122

2223
import com.ibm.microclimate.core.internal.MCLogger;
24+
import com.ibm.microclimate.core.internal.MCUtil;
2325
import com.ibm.microclimate.core.internal.MicroclimateApplication;
26+
import com.ibm.microclimate.ui.internal.messages.Messages;
2427

2528
public class ImportProjectAction implements IObjectActionDelegate {
2629

@@ -61,7 +64,9 @@ public void run(IAction action) {
6164
SmartImportJob importJob = new SmartImportJob(path.toFile(), null, true, false);
6265
importJob.schedule();
6366
} catch (Exception e) {
64-
MCLogger.logError("Error requesting build for application: " + app.name, e); //$NON-NLS-1$
67+
MCLogger.logError("Error importing project: " + app.name, e); //$NON-NLS-1$
68+
MCUtil.openDialog(true, NLS.bind(Messages.ImportProjectError, app.name), e.getMessage());
69+
return;
6570
}
6671
}
6772

dev/com.ibm.microclimate.ui/src/com/ibm/microclimate/ui/internal/actions/RestartDebugModeAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void selectionChanged(IAction action, ISelection selection) {
4545
Object obj = sel.getFirstElement();
4646
if (obj instanceof MCEclipseApplication) {
4747
app = (MCEclipseApplication)obj;
48-
if (app.isEnabled() && app.isSupportedProject()) {
48+
if (app.isEnabled() && app.supportsDebug()) {
4949
action.setEnabled(app.getAppState() == AppState.STARTED || app.getAppState() == AppState.STARTING);
5050
return;
5151
}

dev/com.ibm.microclimate.ui/src/com/ibm/microclimate/ui/internal/actions/RestartRunModeAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void selectionChanged(IAction action, ISelection selection) {
4545
Object obj = sel.getFirstElement();
4646
if (obj instanceof MCEclipseApplication) {
4747
app = (MCEclipseApplication)obj;
48-
if (app.isEnabled() && app.isSupportedProject()) {
48+
if (app.isEnabled() && app.getProjectCapabilities().canRestart()) {
4949
action.setEnabled(app.getAppState() == AppState.STARTED || app.getAppState() == AppState.STARTING);
5050
return;
5151
}

dev/com.ibm.microclimate.ui/src/com/ibm/microclimate/ui/internal/actions/StartBuildAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
import org.eclipse.jface.action.IAction;
1313
import org.eclipse.jface.viewers.ISelection;
1414
import org.eclipse.jface.viewers.IStructuredSelection;
15+
import org.eclipse.osgi.util.NLS;
1516
import org.eclipse.ui.IObjectActionDelegate;
1617
import org.eclipse.ui.IWorkbenchPart;
1718

1819
import com.ibm.microclimate.core.internal.MCLogger;
20+
import com.ibm.microclimate.core.internal.MCUtil;
1921
import com.ibm.microclimate.core.internal.MicroclimateApplication;
2022
import com.ibm.microclimate.core.internal.constants.BuildStatus;
2123
import com.ibm.microclimate.core.internal.constants.MCConstants;
24+
import com.ibm.microclimate.ui.internal.messages.Messages;
2225

2326
public class StartBuildAction implements IObjectActionDelegate {
2427

@@ -57,6 +60,8 @@ public void run(IAction action) {
5760
app.mcConnection.requestProjectBuild(app, MCConstants.VALUE_ACTION_BUILD);
5861
} catch (Exception e) {
5962
MCLogger.logError("Error requesting build for application: " + app.name, e); //$NON-NLS-1$
63+
MCUtil.openDialog(true, NLS.bind(Messages.StartBuildError, app.name), e.getMessage());
64+
return;
6065
}
6166
}
6267

dev/com.ibm.microclimate.ui/src/com/ibm/microclimate/ui/internal/messages/Messages.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public class Messages extends NLS {
6262
public static String refreshResourceJobLabel;
6363
public static String RefreshResourceError;
6464

65+
public static String ImportProjectError;
66+
public static String StartBuildError;
67+
6568
static {
6669
// initialize resource bundle
6770
NLS.initializeMessages(BUNDLE_NAME, Messages.class);

0 commit comments

Comments
 (0)