Skip to content

Commit 812ec45

Browse files
committed
NIFI-3785 - Added response merging for move-options endpoint
1 parent 020a153 commit 812ec45

6 files changed

Lines changed: 122 additions & 30 deletions

File tree

nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupOptionEntity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,20 @@ public boolean isDisabled() {
8383
public void setDisabled(boolean disabled) {
8484
this.disabled = disabled;
8585
}
86+
87+
@Override
88+
public boolean equals(Object o) {
89+
if (this == o) {
90+
return true;
91+
}
92+
if (o == null || getClass() != o.getClass()) {
93+
return false;
94+
}
95+
return ((ProcessGroupOptionEntity) o).getValue().equals(getValue());
96+
}
97+
98+
@Override
99+
public int hashCode() {
100+
return getValue().hashCode();
101+
}
86102
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.apache.nifi.web.api.entity;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.xml.bind.annotation.XmlRootElement;
5+
6+
import java.util.List;
7+
8+
@XmlRootElement(name = "processGroupOptionsEntity")
9+
public class ProcessGroupOptionsEntity extends Entity {
10+
private List<ProcessGroupOptionEntity> processGroupOptionEntities;
11+
12+
@Schema(description = "The list of ProcessGroupOptionEntities.")
13+
public List<ProcessGroupOptionEntity> getProcessGroupOptionEntities() {
14+
return processGroupOptionEntities;
15+
}
16+
17+
public void setProcessGroupOptionEntities(List<ProcessGroupOptionEntity> processGroupOptionEntities) {
18+
this.processGroupOptionEntities = processGroupOptionEntities;
19+
}
20+
}

nifi-framework-bundle/nifi-framework/nifi-framework-cluster/src/main/java/org/apache/nifi/cluster/coordination/http/StandardHttpResponseMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.apache.nifi.cluster.coordination.http.endpoints.PortStatusEndpointMerger;
7171
import org.apache.nifi.cluster.coordination.http.endpoints.PrioritizerTypesEndpointMerger;
7272
import org.apache.nifi.cluster.coordination.http.endpoints.ProcessGroupEndpointMerger;
73+
import org.apache.nifi.cluster.coordination.http.endpoints.ProcessGroupOptionsEndpointMerger;
7374
import org.apache.nifi.cluster.coordination.http.endpoints.ProcessGroupsEndpointMerger;
7475
import org.apache.nifi.cluster.coordination.http.endpoints.ProcessorDiagnosticsEndpointMerger;
7576
import org.apache.nifi.cluster.coordination.http.endpoints.ProcessorEndpointMerger;
@@ -145,6 +146,7 @@ public StandardHttpResponseMapper(final NiFiProperties nifiProperties) {
145146
endpointMergers.add(new RemoteProcessGroupsEndpointMerger());
146147
endpointMergers.add(new ProcessGroupEndpointMerger());
147148
endpointMergers.add(new ProcessGroupsEndpointMerger());
149+
endpointMergers.add(new ProcessGroupOptionsEndpointMerger());
148150
endpointMergers.add(new FlowSnippetEndpointMerger());
149151
endpointMergers.add(new PasteEndpointMerger());
150152
endpointMergers.add(new ProvenanceQueryEndpointMerger());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.apache.nifi.cluster.coordination.http.endpoints;
2+
3+
import org.apache.nifi.cluster.coordination.http.EndpointResponseMerger;
4+
import org.apache.nifi.cluster.manager.NodeResponse;
5+
import org.apache.nifi.web.api.entity.ProcessGroupOptionEntity;
6+
import org.apache.nifi.web.api.entity.ProcessGroupOptionsEntity;
7+
8+
import java.net.URI;
9+
import java.util.ArrayList;
10+
import java.util.HashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
import java.util.regex.Pattern;
14+
15+
public class ProcessGroupOptionsEndpointMerger implements EndpointResponseMerger {
16+
public static final Pattern CONTROLLER_SERVICES_MOVE_OPTIONS_URI = Pattern.compile("/nifi-api/controller-services/(?:(?:root)|(?:[a-f0-9\\-]{36}))/move-options");
17+
18+
@Override
19+
public boolean canHandle(URI uri, String method) {
20+
return "GET".equalsIgnoreCase(method) && CONTROLLER_SERVICES_MOVE_OPTIONS_URI.matcher(uri.getPath()).matches();
21+
}
22+
23+
@Override
24+
public final NodeResponse merge(final URI uri, final String method, final Set<NodeResponse> successfulResponses, final Set<NodeResponse> problematicResponses, final NodeResponse clientResponse) {
25+
if (!canHandle(uri, method)) {
26+
throw new IllegalArgumentException("Cannot use Endpoint Mapper of type " + getClass().getSimpleName() + " to map responses for URI " + uri + ", HTTP Method " + method);
27+
}
28+
29+
final ProcessGroupOptionsEntity responseEntity = clientResponse.getClientResponse().readEntity(ProcessGroupOptionsEntity.class);
30+
final Set<ProcessGroupOptionEntity> processGroupOptionEntities = new HashSet<>(responseEntity.getProcessGroupOptionEntities());
31+
32+
for (final NodeResponse nodeResponse : successfulResponses) {
33+
final ProcessGroupOptionsEntity nodeResponseEntity = nodeResponse == clientResponse ? responseEntity : nodeResponse.getClientResponse().readEntity(ProcessGroupOptionsEntity.class);
34+
final List<ProcessGroupOptionEntity> nodeProcessGroupOptionEntities = nodeResponseEntity.getProcessGroupOptionEntities();
35+
36+
processGroupOptionEntities.addAll(nodeProcessGroupOptionEntities);
37+
}
38+
39+
responseEntity.setProcessGroupOptionEntities(new ArrayList<>(processGroupOptionEntities));
40+
41+
// create a new client response
42+
return new NodeResponse(clientResponse, responseEntity);
43+
}
44+
}

nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import org.apache.nifi.web.api.entity.ControllerServiceReferencingComponentsEntity;
7878
import org.apache.nifi.web.api.entity.ControllerServiceRunStatusEntity;
7979
import org.apache.nifi.web.api.entity.ProcessGroupOptionEntity;
80+
import org.apache.nifi.web.api.entity.ProcessGroupOptionsEntity;
8081
import org.apache.nifi.web.api.entity.PropertyDescriptorEntity;
8182
import org.apache.nifi.web.api.entity.UpdateControllerServiceReferenceRequestEntity;
8283
import org.apache.nifi.web.api.entity.VerifyConfigRequestEntity;
@@ -693,6 +694,10 @@ public Response getProcessGroupOptions(
693694
throw new IllegalArgumentException("Controller service id must be specified.");
694695
}
695696

697+
if (isReplicateRequest()) {
698+
return replicate(HttpMethod.GET);
699+
}
700+
696701
AtomicReference<List<ProcessGroupOptionEntity>> options = new AtomicReference<>();
697702
serviceFacade.authorizeAccess(lookup -> {
698703
final NiFiUser user = NiFiUserUtils.getNiFiUser();
@@ -710,7 +715,10 @@ public Response getProcessGroupOptions(
710715
}
711716
});
712717

713-
return generateOkResponse(options.get()).build();
718+
ProcessGroupOptionsEntity processGroupOptionsEntity = new ProcessGroupOptionsEntity();
719+
processGroupOptionsEntity.setProcessGroupOptionEntities(options.get());
720+
721+
return generateOkResponse(processGroupOptionsEntity).build();
714722
}
715723

716724
/**

nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/flow-designer/state/controller-services/controller-services.effects.ts

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -666,37 +666,13 @@ export class ControllerServicesEffects {
666666
map((action) => action.request),
667667
switchMap((request) =>
668668
from(this.controllerServiceService.getMoveOptions(request.controllerService.id)).pipe(
669-
map((response: SelectOption[]) => {
670-
const moveDialogReference = this.dialog.open(MoveControllerService, {
671-
...LARGE_DIALOG,
672-
data: {
673-
controllerService: request.controllerService,
674-
options: response
675-
}
676-
});
677-
678-
moveDialogReference.componentInstance.goToReferencingComponent = (
679-
component: ControllerServiceReferencingComponent
680-
) => {
681-
const route: string[] = this.getRouteForReference(component);
682-
this.router.navigate(route);
683-
};
684-
685-
moveDialogReference.afterClosed().subscribe((response) => {
686-
if (response != 'ROUTED') {
687-
this.store.dispatch(
688-
ControllerServicesActions.loadControllerServices({
689-
request: {
690-
processGroupId: request.controllerService.parentGroupId!
691-
}
692-
})
693-
);
694-
}
695-
});
669+
map((response) => {
670+
console.log(response);
671+
console.log(request);
672+
return { request, options: response.processGroupOptionEntities };
696673
}),
697674
tap({
698675
error: (errorResponse: HttpErrorResponse) => {
699-
this.dialog.closeAll();
700676
this.store.dispatch(
701677
ErrorActions.snackBarError({
702678
error: this.errorHelper.getErrorString(errorResponse)
@@ -705,7 +681,33 @@ export class ControllerServicesEffects {
705681
}
706682
})
707683
)
708-
)
684+
),
685+
tap(({ request, options }) => {
686+
const moveDialogReference = this.dialog.open(MoveControllerService, {
687+
...LARGE_DIALOG,
688+
data: {
689+
controllerService: request.controllerService,
690+
options
691+
}
692+
});
693+
moveDialogReference.componentInstance.goToReferencingComponent = (
694+
component: ControllerServiceReferencingComponent
695+
) => {
696+
const route: string[] = this.getRouteForReference(component);
697+
this.router.navigate(route);
698+
};
699+
moveDialogReference.afterClosed().subscribe((response) => {
700+
if (response != 'ROUTED') {
701+
this.store.dispatch(
702+
ControllerServicesActions.loadControllerServices({
703+
request: {
704+
processGroupId: request.controllerService.parentGroupId!
705+
}
706+
})
707+
);
708+
}
709+
});
710+
})
709711
),
710712
{ dispatch: false }
711713
);

0 commit comments

Comments
 (0)