Skip to content

Commit 0989b43

Browse files
committed
defect #1119315 [Jira plugin] Setting config. in Jira plugin via API
-additional fixes
1 parent 7637a00 commit 0989b43

File tree

4 files changed

+95
-54
lines changed

4 files changed

+95
-54
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<modelVersion>4.0.0</modelVersion>
88
<groupId>com.microfocus.octane.plugins</groupId>
99
<artifactId>jira-octane-quality-insight-plugin</artifactId>
10-
<version>1.0.8.0</version>
10+
<version>1.0.8.1</version>
1111
<organization>
1212
<name>Micro Focus ALM Octane</name>
1313
<url>https://www.microfocus.com/en-us/products/alm-octane/overview</url>

src/main/java/com/microfocus/octane/plugins/admin/ConfigResource.java

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@
2424
import com.microfocus.octane.plugins.descriptors.OctaneEntityTypeManager;
2525
import com.microfocus.octane.plugins.rest.ProxyConfiguration;
2626
import com.microfocus.octane.plugins.rest.RestStatusException;
27-
import com.microfocus.octane.plugins.rest.entities.OctaneEntityCollection;
28-
import com.microfocus.octane.plugins.rest.query.LogicalQueryPhrase;
29-
import com.microfocus.octane.plugins.rest.query.QueryPhrase;
3027
import org.apache.commons.lang.StringUtils;
3128
import org.slf4j.Logger;
3229
import org.slf4j.LoggerFactory;
@@ -63,33 +60,19 @@ public ConfigResource(UserManager userManager) {
6360
@GET
6461
@Path("/workspaces-dialog/additional-data")
6562
public Response getDataForWorkspaceDialog(@QueryParam("space-config-id") String spaceConfId, @QueryParam("workspace-config-id") String workspaceConfId) {
66-
if (!validateUserPermission()) {
63+
if (!hasPermission()) {
6764
return Response.status(Status.FORBIDDEN).build();
6865
}
6966

70-
SpaceConfiguration spConfig = ConfigurationManager.getInstance().getSpaceConfigurationById(spaceConfId, true).get();
71-
72-
Set<Long> usedWorkspaces = spaceConfId == null ? Collections.emptySet() : ConfigurationManager.getInstance().getWorkspaceConfigurations().stream()
73-
.filter(w -> w.getSpaceConfigurationId().equals(spaceConfId))
74-
.map(WorkspaceConfiguration::getWorkspaceId).collect(Collectors.toSet());
75-
Set<String> usedJiraProjects = ConfigurationManager.getInstance().getWorkspaceConfigurations().stream().flatMap(c -> c.getJiraProjects().stream()).collect(Collectors.toSet());
76-
77-
if (workspaceConfId != null) {
78-
WorkspaceConfiguration wc = ConfigurationManager.getInstance().getWorkspaceConfigurationById(workspaceConfId, true).get();
79-
usedWorkspaces.remove(wc.getWorkspaceId());
80-
usedJiraProjects.removeAll(wc.getJiraProjects());
81-
}
82-
8367
try {
84-
Collection<KeyValueItem> select2workspaces = ConfigurationUtil.getValidWorkspaces(spConfig, usedWorkspaces);
68+
Collection<KeyValueItem> select2workspaces = ConfigurationUtil.getValidWorkspaces(spaceConfId, workspaceConfId);
8569

86-
Collection<KeyValueItem> select2IssueTypes = ComponentAccessor.getConstantsManager().getAllIssueTypeObjects()
87-
.stream().map(e -> new KeyValueItem(e.getName(), e.getName())).sorted(Comparator.comparing(KeyValueItem::getId)).collect(Collectors.toList());
70+
Collection<KeyValueItem> select2Projects = ConfigurationUtil.getValidProjects(workspaceConfId);
8871

89-
Collection<KeyValueItem> select2Projects = ComponentAccessor.getProjectManager().getProjectObjects()
72+
Collection<KeyValueItem> select2IssueTypes = ComponentAccessor.getConstantsManager().getAllIssueTypeObjects()
9073
.stream()
91-
.filter(e -> !usedJiraProjects.contains(e.getKey()))
92-
.map(e -> new KeyValueItem(e.getKey(), e.getKey())).sorted(Comparator.comparing(KeyValueItem::getId))
74+
.map(e -> new KeyValueItem(e.getName(), e.getName()))
75+
.sorted(Comparator.comparing(KeyValueItem::getId))
9376
.collect(Collectors.toList());
9477

9578
Map<String, Object> data = new HashMap<>();
@@ -101,6 +84,7 @@ public Response getDataForWorkspaceDialog(@QueryParam("space-config-id") String
10184
} catch (IllegalArgumentException e) {
10285
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
10386
} catch (RestStatusException e) {
87+
SpaceConfiguration spConfig = ConfigurationManager.getInstance().getSpaceConfigurationById(spaceConfId, true).get();
10488
RuntimeException translatedException = ConfigurationUtil.tryTranslateException(e, spConfig);
10589
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(translatedException.getMessage()).build();
10690
}
@@ -109,7 +93,7 @@ public Response getDataForWorkspaceDialog(@QueryParam("space-config-id") String
10993
@GET
11094
@Path("/workspaces")
11195
public Response getAllWorkspaceConfigurations() {
112-
if (!validateUserPermission()) {
96+
if (!hasPermission()) {
11397
return Response.status(Status.FORBIDDEN).build();
11498
}
11599
Collection<WorkspaceConfigurationOutgoing> result = ConfigurationManager.getInstance().getWorkspaceConfigurations()
@@ -123,7 +107,7 @@ public Response getAllWorkspaceConfigurations() {
123107
@GET
124108
@Path("/workspaces/{id}")
125109
public Response getWorkspaceConfigurationById(@PathParam("id") String id) {
126-
if (!validateUserPermission()) {
110+
if (!hasPermission()) {
127111
return Response.status(Status.FORBIDDEN).build();
128112
}
129113

@@ -139,7 +123,7 @@ public Response getWorkspaceConfigurationById(@PathParam("id") String id) {
139123
@GET
140124
@Path("/workspaces/supported-octane-types")
141125
public Response getSupportedOctaneTypes(@QueryParam("space-config-id") String spaceConfigurationId, @QueryParam("workspace-id") long workspaceId, @QueryParam("udf-name") String udfName) {
142-
if (!validateUserPermission()) {
126+
if (!hasPermission()) {
143127
return Response.status(Status.FORBIDDEN).build();
144128
}
145129

@@ -152,7 +136,7 @@ public Response getSupportedOctaneTypes(@QueryParam("space-config-id") String sp
152136
@GET
153137
@Path("/workspaces/possible-jira-fields")
154138
public Response getPossibleJiraFields(@QueryParam("space-config-id") String spaceConfigurationId, @QueryParam("workspace-id") long workspaceId) {
155-
if (!validateUserPermission()) {
139+
if (!hasPermission()) {
156140
return Response.status(Status.FORBIDDEN).build();
157141
}
158142

@@ -164,7 +148,7 @@ public Response getPossibleJiraFields(@QueryParam("space-config-id") String spac
164148
@POST
165149
@Path("/workspaces")
166150
public Response addWorkspaceConfiguration(WorkspaceConfigurationOutgoing wco) {
167-
if (!validateUserPermission()) {
151+
if (!hasPermission()) {
168152
return Response.status(Status.FORBIDDEN).build();
169153
}
170154

@@ -181,7 +165,7 @@ public Response addWorkspaceConfiguration(WorkspaceConfigurationOutgoing wco) {
181165
@PUT
182166
@Path("/workspaces/{workspaceConfigurationId}")
183167
public Response updateWorkspaceConfiguration(@PathParam("workspaceConfigurationId") String workspaceConfigurationId, WorkspaceConfigurationOutgoing wco) {
184-
if (!validateUserPermission()) {
168+
if (!hasPermission()) {
185169
return Response.status(Status.FORBIDDEN).build();
186170
}
187171

@@ -200,7 +184,7 @@ public Response updateWorkspaceConfiguration(@PathParam("workspaceConfigurationI
200184
@DELETE
201185
@Path("/workspaces/{id}")
202186
public Response deleteWorkspaceConfigurationById(@PathParam("id") String id) {
203-
if (!validateUserPermission()) {
187+
if (!hasPermission()) {
204188
return Response.status(Status.FORBIDDEN).build();
205189
}
206190

@@ -216,7 +200,7 @@ public Response deleteWorkspaceConfigurationById(@PathParam("id") String id) {
216200
@Produces(MediaType.APPLICATION_JSON)
217201
@Path("/proxy")
218202
public Response getProxy() {
219-
if (!validateUserPermission()) {
203+
if (!hasPermission()) {
220204
return Response.status(Status.FORBIDDEN).build();
221205
}
222206

@@ -244,7 +228,7 @@ public Response getProxy() {
244228
@Consumes(MediaType.APPLICATION_JSON)
245229
@Path("/proxy")
246230
public Response setProxy(final ProxyConfigurationOutgoing proxyOutgoing) {
247-
if (!validateUserPermission()) {
231+
if (!hasPermission()) {
248232
return Response.status(Status.FORBIDDEN).build();
249233
}
250234

@@ -269,7 +253,7 @@ public Response setProxy(final ProxyConfigurationOutgoing proxyOutgoing) {
269253
@Produces(MediaType.APPLICATION_JSON)
270254
@Path("/spaces")
271255
public Response getSpaceConfigurations() {
272-
if (!validateUserPermission()) {
256+
if (!hasPermission()) {
273257
return Response.status(Status.FORBIDDEN).build();
274258
}
275259

@@ -284,11 +268,12 @@ public Response getSpaceConfigurations() {
284268
@Consumes(MediaType.APPLICATION_JSON)
285269
@Produces(MediaType.APPLICATION_JSON)
286270
public Response addSpaceConfiguration(SpaceConfigurationOutgoing sco) {
287-
if (!validateUserPermission()) {
271+
if (!hasPermission()) {
288272
return Response.status(Status.FORBIDDEN).build();
289273
}
290274

291275
try {
276+
ConfigurationUtil.validateName(sco);
292277
SpaceConfiguration spaceConfig = ConfigurationUtil.validateRequiredAndConvertToInternal(sco, true);
293278
ConfigurationUtil.doSpaceConfigurationUniquenessValidation(spaceConfig);
294279
ConfigurationManager.getInstance().addSpaceConfiguration(spaceConfig);
@@ -303,12 +288,13 @@ public Response addSpaceConfiguration(SpaceConfigurationOutgoing sco) {
303288
@Consumes(MediaType.APPLICATION_JSON)
304289
@Path("spaces/{id}")
305290
public Response updateSpaceConfiguration(@PathParam("id") String id, final SpaceConfigurationOutgoing sco) {
306-
if (!validateUserPermission()) {
291+
if (!hasPermission()) {
307292
return Response.status(Status.FORBIDDEN).build();
308293
}
309294

310295
try {
311296
sco.setId(id);
297+
ConfigurationUtil.validateName(sco);
312298
SpaceConfiguration spaceConfig = ConfigurationUtil.validateRequiredAndConvertToInternal(sco, false);
313299
ConfigurationUtil.doSpaceConfigurationUniquenessValidation(spaceConfig);
314300
SpaceConfiguration updated = ConfigurationManager.getInstance().updateSpaceConfiguration(spaceConfig);
@@ -322,7 +308,7 @@ public Response updateSpaceConfiguration(@PathParam("id") String id, final Space
322308
@Path("spaces/{id}")
323309
@Produces(MediaType.APPLICATION_JSON)
324310
public Response deleteSpaceConfiguration(@PathParam("id") String id) {
325-
if (!validateUserPermission()) {
311+
if (!hasPermission()) {
326312
return Response.status(Status.FORBIDDEN).build();
327313
}
328314

@@ -339,7 +325,7 @@ public Response deleteSpaceConfiguration(@PathParam("id") String id) {
339325
@Consumes(MediaType.APPLICATION_JSON)
340326
@Produces(MediaType.APPLICATION_JSON)
341327
public Response testSpaceConfiguration(SpaceConfigurationOutgoing spaceConfigurationOutgoing) {
342-
if (!validateUserPermission()) {
328+
if (!hasPermission()) {
343329
return Response.status(Status.FORBIDDEN).build();
344330
}
345331

@@ -353,7 +339,7 @@ public Response testSpaceConfiguration(SpaceConfigurationOutgoing spaceConfigura
353339
}
354340
}
355341

356-
private boolean validateUserPermission() {
342+
private boolean hasPermission() {
357343
UserProfile username = userManager.getRemoteUser(request);
358344
return isAdministrator(userManager, username);
359345
}

src/main/java/com/microfocus/octane/plugins/configuration/ConfigurationManager.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public Optional<SpaceConfiguration> getSpaceConfigurationById(String spaceConfig
8787
if (throwIfNotFound && !opt.isPresent()) {
8888
throw new IllegalArgumentException(String.format("Space configuration with id %s - not found", spaceConfigurationId));
8989
}
90+
9091
return opt;
9192
}
9293

@@ -95,7 +96,11 @@ public Optional<WorkspaceConfiguration> getWorkspaceConfigurationById(String wor
9596
throw new IllegalArgumentException("Workspace configuration id should not be empty");
9697
}
9798

98-
Optional<WorkspaceConfiguration> opt = getConfiguration().getWorkspaces().stream().filter(s -> s.getId().equals(workspaceConfigurationId)).findFirst();
99+
Optional<WorkspaceConfiguration> opt = getConfiguration().getWorkspaces()
100+
.stream()
101+
.filter(s -> s.getId().equals(workspaceConfigurationId))
102+
.findFirst();
103+
99104
if (throwIfNotFound && !opt.isPresent()) {
100105
throw new IllegalArgumentException(String.format("Workspace configuration with id %s - not found", workspaceConfigurationId));
101106
}

src/main/java/com/microfocus/octane/plugins/configuration/ConfigurationUtil.java

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.microfocus.octane.plugins.rest.query.QueryPhrase;
1515
import org.apache.commons.lang.StringUtils;
1616

17+
import javax.ws.rs.QueryParam;
1718
import java.io.UnsupportedEncodingException;
1819
import java.net.URL;
1920
import java.net.URLDecoder;
@@ -79,6 +80,16 @@ private static Map<String, List<String>> splitQuery(URL url) throws UnsupportedE
7980
return query_pairs;
8081
}
8182

83+
public static void validateName(SpaceConfigurationOutgoing sco) {
84+
if (StringUtils.isEmpty(sco.getName())) {
85+
throw new IllegalArgumentException("Space configuration name is required");
86+
}
87+
88+
if (sco.getName().length() > 40) {
89+
throw new IllegalArgumentException("Space configuration name exceeds allowed length (40 characters)");
90+
}
91+
}
92+
8293
public static SpaceConfiguration validateRequiredAndConvertToInternal(SpaceConfigurationOutgoing sco, boolean isNew) {
8394

8495
if (StringUtils.isEmpty(sco.getLocation())) {
@@ -269,27 +280,21 @@ public static WorkspaceConfiguration validateRequiredAndConvertToInternal(Worksp
269280
}
270281

271282
private static void validateWorkspace(WorkspaceConfigurationOutgoing wco) {
272-
String spaceConfigId = wco.getSpaceConfigId();
273-
SpaceConfiguration spConfig = ConfigurationManager.getInstance().getSpaceConfigurationById(spaceConfigId, true).get();
274-
275-
Set<Long> usedWorkspaces = spaceConfigId == null ? Collections.emptySet() : ConfigurationManager.getInstance().getWorkspaceConfigurations().stream()
276-
.filter(w -> w.getSpaceConfigurationId().equals(spaceConfigId))
277-
.map(WorkspaceConfiguration::getWorkspaceId).collect(Collectors.toSet());
278-
279-
Collection<KeyValueItem> validWorkspaces = getValidWorkspaces(spConfig, usedWorkspaces);
283+
Collection<KeyValueItem> validWorkspaces = getValidWorkspaces(wco.getSpaceConfigId(), wco.getId());
280284

281-
if(validWorkspaces.stream().noneMatch(e -> e.getText().equals(wco.getWorkspaceName()))) {
285+
if (validWorkspaces.stream().noneMatch(e -> e.getText().equals(wco.getWorkspaceName()))) {
282286
throw new IllegalArgumentException("Workspace is not valid");
283287
}
284288
}
285289

286290
private static void validateJiraProjectKey(WorkspaceConfigurationOutgoing wco) {
287-
if (!ComponentAccessor.getProjectManager().getProjectObjects()
288-
.stream()
289-
.map(Project::getKey)
291+
Collection<KeyValueItem> validProjects = getValidProjects(wco.getId());
292+
293+
if (!validProjects.stream()
294+
.map(KeyValueItem::getId)
290295
.collect(Collectors.toList())
291296
.containsAll(wco.getJiraProjects())) {
292-
throw new IllegalArgumentException("Jira projects list is not valid");
297+
throw new IllegalArgumentException("Jira projects list is not valid. The projects are either already used or don't exist");
293298
}
294299
}
295300

@@ -319,13 +324,58 @@ private static void validateOctaneTypesList(WorkspaceConfigurationOutgoing wco,
319324
}
320325
}
321326

322-
public static Collection<KeyValueItem> getValidWorkspaces(SpaceConfiguration spConfig, Set<Long> usedWorkspaces) {
327+
public static Collection<KeyValueItem> getValidWorkspaces(String spaceConfigId, String workspaceConfId) {
328+
SpaceConfiguration spConfig = ConfigurationManager.getInstance().getSpaceConfigurationById(spaceConfigId, true).get();
329+
Set<Long> usedWorkspaces = getAlreadyUsedWorkspaces(workspaceConfId, spaceConfigId);
330+
323331
List<QueryPhrase> conditions = Arrays.asList(new LogicalQueryPhrase("activity_level", 0));//only active workspaces
332+
324333
OctaneEntityCollection workspaces = OctaneRestManager.getEntitiesByCondition(spConfig, PluginConstants.SPACE_CONTEXT, "workspaces", conditions, Arrays.asList("id", "name"));
334+
325335
return workspaces.getData()
326336
.stream()
327337
.filter(e -> !usedWorkspaces.contains(Long.valueOf(e.getId())))
328338
.map(e -> new KeyValueItem(e.getId(), e.getName()))
329339
.collect(Collectors.toList());
330340
}
341+
342+
private static Set<Long> getAlreadyUsedWorkspaces(String currentWsConfigId, String spaceConfigId) {
343+
Set<Long> usedWorkspaces = spaceConfigId == null ? new HashSet<>() : ConfigurationManager.getInstance().getWorkspaceConfigurations()
344+
.stream()
345+
.filter(w -> w.getSpaceConfigurationId().equals(spaceConfigId))
346+
.map(WorkspaceConfiguration::getWorkspaceId)
347+
.collect(Collectors.toSet());
348+
349+
if (currentWsConfigId != null) {
350+
WorkspaceConfiguration wc = ConfigurationManager.getInstance().getWorkspaceConfigurationById(currentWsConfigId, true).get();
351+
usedWorkspaces.remove(wc.getWorkspaceId());
352+
}
353+
354+
return usedWorkspaces;
355+
}
356+
357+
358+
public static Collection<KeyValueItem> getValidProjects(String workspaceConfId) {
359+
Set<String> usedJiraProjects = ConfigurationUtil.getAlreadyUsedJiraProjects(workspaceConfId);
360+
361+
return ComponentAccessor.getProjectManager().getProjectObjects()
362+
.stream()
363+
.filter(e -> !usedJiraProjects.contains(e.getKey()))
364+
.map(e -> new KeyValueItem(e.getKey(), e.getKey())).sorted(Comparator.comparing(KeyValueItem::getId))
365+
.collect(Collectors.toList());
366+
}
367+
368+
private static Set<String> getAlreadyUsedJiraProjects(String workspaceConfId) {
369+
Set<String> usedJiraProjects = ConfigurationManager.getInstance().getWorkspaceConfigurations()
370+
.stream()
371+
.flatMap(c -> c.getJiraProjects().stream())
372+
.collect(Collectors.toSet());
373+
374+
if (workspaceConfId != null) {
375+
WorkspaceConfiguration wc = ConfigurationManager.getInstance().getWorkspaceConfigurationById(workspaceConfId, true).get();
376+
usedJiraProjects.removeAll(wc.getJiraProjects());
377+
}
378+
379+
return usedJiraProjects;
380+
}
331381
}

0 commit comments

Comments
 (0)