Skip to content

Commit 032af54

Browse files
committed
ST6RI-178 Reworked project load interface in SysMLInteractive
Previously loading required using UUID or name to reference projects and their branches but there were no interface that allowed mixing the two e.g reference the project by UUID and the branch by name. This rework makes load parameterization more flexible to allow more cases to be covered.
1 parent 7a7312f commit 032af54

2 files changed

Lines changed: 92 additions & 55 deletions

File tree

  • org.omg.sysml.interactive/src/org/omg/sysml/interactive
  • org.omg.sysml.jupyter.kernel/src/main/java/org/omg/sysml/jupyter/kernel/magic

org.omg.sysml.interactive/src/org/omg/sysml/interactive/SysMLInteractive.java

Lines changed: 61 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.Collections;
3535
import java.util.Comparator;
3636
import java.util.List;
37+
import java.util.Map;
3738
import java.util.Scanner;
3839
import java.util.UUID;
3940
import java.util.stream.Collectors;
@@ -96,6 +97,12 @@
9697

9798
public class SysMLInteractive extends SysMLUtil {
9899

100+
public static final String HELP_KEY = "help";
101+
public static final String PROJECT_ID_KEY = "id";
102+
public static final String PROJECT_NAME_KEY = "name";
103+
public static final String BRANCH_ID_KEY = "branch-id";
104+
public static final String BRANCH_NAME_KEY = "branch";
105+
99106
public static final String KERNEL_LIBRARIES_DIRECTORY = "Kernel Libraries";
100107
public static final String SYSTEMS_LIBRARY_DIRECTORY = "Systems Library";
101108
public static final String DOMAIN_LIBRARIES_DIRECTORY = "Domain Libraries";
@@ -438,61 +445,74 @@ protected String publish(String name) {
438445
publish(name, null, null, false, Collections.emptyList());
439446
}
440447

441-
public String loadByName(String projectName, String branchName, List<String> help) {
442-
if (Strings.isNullOrEmpty(projectName)) {
443-
return help.isEmpty()? "": SysMLInteractiveHelp.getLoadHelp();
444-
}
448+
/**
449+
* Loads using the supplied parameters<br>
450+
* Possible parameters are:
451+
* <li> {@value SysMLInteractive#PROJECT_NAME_KEY}: name of the project</li>
452+
* <li> {@value SysMLInteractive#PROJECT_ID_KEY}: id of the project</li>
453+
* <li> {@value SysMLInteractive#BRANCH_NAME_KEY}: name of the project's branch</li>
454+
* <li> {@value SysMLInteractive#BRANCH_ID_KEY}: id of the project's branch </li>
455+
* <li>{@value SysMLInteractive#HELP_KEY}: request help string for the operation</li>
456+
*
457+
* <br>
458+
* {@value SysMLInteractive#PROJECT_NAME_KEY} and {@value SysMLInteractive#PROJECT_ID_KEY} are mutually exclusive. It is mandatory to specify one of them.
459+
* <br>
460+
* {@value SysMLInteractive#BRANCH_NAME_KEY} and {@value SysMLInteractive#BRANCH_ID_KEY} are mutually exclusive. If neither is given the project's default branch is used.
461+
* <br>
462+
* If help {@value SysMLInteractive#HELP_KEY} is passed as a parameter (with any value) the help string is printed. Every other parameters are ignored.
463+
*
464+
* <br>
465+
* <br>
466+
* @param parameters map containing the parameters and their values
467+
* @return output of the command
468+
*/
469+
public String load(Map<String, String> parameters) {
445470

446-
ProjectRepository repository = new ProjectRepository(apiBasePath);
447-
RemoteProject repositoryProject = repository.getProjectByName(projectName);
471+
if (parameters.containsKey(HELP_KEY)) {
472+
return SysMLInteractiveHelp.getLoadHelp();
473+
}
448474

449-
if (repositoryProject == null) {
450-
return "ERROR:Project doesn't exist.";
475+
if (parameters.containsKey(PROJECT_ID_KEY) && parameters.containsKey(PROJECT_NAME_KEY)) {
476+
return "ERROR:Name and id cannot be provided at the same time.";
451477
}
452478

453-
return load(repositoryProject, branchName);
454-
}
455-
456-
public String loadById(String projectId, String branchId, List<String> help) {
457-
if (Strings.isNullOrEmpty(projectId)) {
458-
return help.isEmpty()? "": SysMLInteractiveHelp.getLoadHelp();
479+
if (parameters.containsKey(BRANCH_ID_KEY) && parameters.containsKey(BRANCH_NAME_KEY)) {
480+
return "ERROR:Branch name and branch id cannot be provided at the same time";
459481
}
460482

461-
ProjectRepository repository = new ProjectRepository(apiBasePath);
462-
RemoteProject remoteProject = repository.getPRojectById(UUID.fromString(projectId));
483+
final ProjectRepository repository = new ProjectRepository(apiBasePath);
484+
final RemoteProject project;
463485

464-
if (remoteProject == null) {
465-
return "ERROR:Project doesn't exist.";
486+
if (parameters.containsKey(PROJECT_ID_KEY)) {
487+
String projectId = parameters.get(PROJECT_ID_KEY);
488+
project = repository.getProjectById(projectId);
489+
} else if (parameters.containsKey(PROJECT_NAME_KEY)) {
490+
String projectName = parameters.get(PROJECT_NAME_KEY);
491+
project = repository.getProjectByName(projectName);
492+
} else {
493+
return SysMLInteractiveHelp.getLoadHelp();
466494
}
467495

468-
if (branchId == null) {
469-
return load(remoteProject, (UUID) null);
470-
} else {
471-
UUID branchUUID = UUID.fromString(branchId);
472-
return load(remoteProject, branchUUID);
496+
if (project == null) {
497+
return "ERROR:Project doesn't exist.";
473498
}
474-
}
475-
476-
private String load(RemoteProject remoteProject, String branchName) {
499+
477500
final RemoteBranch branch;
478-
if (branchName == null) {
479-
branch = remoteProject.getDefaultBranch();
501+
502+
if (parameters.containsKey(BRANCH_NAME_KEY)) {
503+
String branchName = parameters.get(BRANCH_NAME_KEY);
504+
branch = project.getBranch(branchName);
505+
} else if (parameters.containsKey(BRANCH_ID_KEY)) {
506+
String branchIdString = parameters.get(BRANCH_ID_KEY);
507+
UUID branchId = UUID.fromString(branchIdString);
508+
branch = project.getBranch(branchId);
480509
} else {
481-
branch = remoteProject.getBranch(branchName);
510+
branch = project.getDefaultBranch();
482511
}
512+
483513
return load(branch);
484514
}
485515

486-
private String load(RemoteProject remoteProject, UUID branchId) {
487-
final RemoteBranch branch;
488-
if (branchId == null) {
489-
branch = remoteProject.getDefaultBranch();
490-
} else {
491-
branch = remoteProject.getBranch(branchId);
492-
}
493-
return load(branch);
494-
}
495-
496516
private String load(RemoteBranch branch) {
497517
if (branch == null) {
498518
return "ERROR:Branch doesn't exist";
@@ -538,8 +558,8 @@ private String load(RemoteBranch branch) {
538558

539559
protected String download(String name) {
540560
return "-h".equals(name)?
541-
loadByName(null, null, Collections.singletonList("true")):
542-
loadByName(name, null, Collections.emptyList());
561+
load(Map.of(HELP_KEY, "true")):
562+
load(Map.of(PROJECT_NAME_KEY, name));
543563
}
544564

545565
public String projects(List<String> help) {

org.omg.sysml.jupyter.kernel/src/main/java/org/omg/sysml/jupyter/kernel/magic/Load.java

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@
2222
*/
2323
package org.omg.sysml.jupyter.kernel.magic;
2424

25+
import java.util.HashMap;
2526
import java.util.List;
2627
import java.util.Map;
2728

28-
import org.omg.sysml.jupyter.kernel.ISysML;
29+
import org.omg.sysml.interactive.SysMLInteractive;
2930

3031
import io.github.spencerpark.jupyter.kernel.magic.registry.LineMagic;
3132
import io.github.spencerpark.jupyter.kernel.magic.registry.MagicsArgs;
@@ -42,20 +43,36 @@ public class Load {
4243
@LineMagic
4344
public static String load(List<String> args) {
4445
Map<String, List<String>> vals = SHOW_ARGS.parse(args);
45-
List<String> help = vals.get("help");
46-
List<String> name = vals.get("name");
47-
List<String> id = vals.get("id");
48-
List<String> branches = vals.get("branch");
49-
String branch = branches.isEmpty()? null: branches.get(0);
46+
Map<String, String> parameters = new HashMap<>();
5047

51-
if (!name.isEmpty() && !id.isEmpty()) {
52-
return "Name and id cannot be provided at the same time.";
53-
} else if (!name.isEmpty()) {
54-
return ISysML.getKernelInstance().getInteractive().loadByName(name.get(0), branch, help);
55-
} else if (!id.isEmpty()) {
56-
return ISysML.getKernelInstance().getInteractive().loadById(id.get(0), branch, help);
57-
} else {
58-
return ISysML.getKernelInstance().getInteractive().help("%load");
48+
if (optionPassed(vals,"name")) {
49+
parameters.put(SysMLInteractive.PROJECT_NAME_KEY, getFirstValueOrNull(vals, "name"));
5950
}
51+
52+
if (optionPassed(vals,"id")) {
53+
parameters.put(SysMLInteractive.PROJECT_ID_KEY, getFirstValueOrNull(vals, "id"));
54+
}
55+
56+
if (optionPassed(vals,"branch")) {
57+
parameters.put(SysMLInteractive.BRANCH_NAME_KEY, getFirstValueOrNull(vals, "branch"));
58+
}
59+
60+
if (optionPassed(vals,"help")) {
61+
parameters.put(SysMLInteractive.HELP_KEY, "true");
62+
}
63+
64+
return SysMLInteractive.getInstance().load(parameters);
65+
}
66+
67+
private static String getFirstValueOrNull(Map<String, List<String>> map, String key) {
68+
if (map.containsKey(key)) {
69+
List<String> values = map.get(key);
70+
return values.isEmpty()? null: values.get(0);
71+
}
72+
return null;
73+
}
74+
75+
private static boolean optionPassed(Map<String, List<String>> map, String key) {
76+
return map.containsKey(key) && map.get(key) != null && !map.get(key).isEmpty();
6077
}
6178
}

0 commit comments

Comments
 (0)