From aac0ef5dc1988e13762089db9f48e39b84592ffb Mon Sep 17 00:00:00 2001 From: egonzale Date: Mon, 30 Nov 2020 08:35:08 +0100 Subject: [PATCH] [JBPM-9464] Kie server notification causes bad status in BC --- .../AsyncKieServerInstanceManager.java | 4 + .../client/container/ContainerPresenter.java | 164 ++++++++++++------ .../ContainerRemoteStatusPresenter.java | 164 +++++++++++------- .../status/ContainerRemoteStatusView.java | 8 +- .../status/card/ContainerCardPresenter.java | 2 + .../status/card/ContainerCardView.java | 6 + .../client/remote/RemotePresenter.java | 23 ++- .../client/remote/RemoteStatusPresenter.java | 32 +++- .../client/remote/RemoteStatusView.java | 7 + .../remote/card/ContainerCardPresenter.java | 8 +- .../container/ContainerPresenterTest.java | 102 ++++++++--- .../ContainerRemoteStatusPresenterTest.java | 111 +++++++----- .../client/remote/RemotePresenterTest.java | 12 +- 13 files changed, 431 insertions(+), 212 deletions(-) diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-backend/src/main/java/org/kie/workbench/common/screens/server/management/backend/runtime/AsyncKieServerInstanceManager.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-backend/src/main/java/org/kie/workbench/common/screens/server/management/backend/runtime/AsyncKieServerInstanceManager.java index 8c1ee3dce659..85da178e211f 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-backend/src/main/java/org/kie/workbench/common/screens/server/management/backend/runtime/AsyncKieServerInstanceManager.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-backend/src/main/java/org/kie/workbench/common/screens/server/management/backend/runtime/AsyncKieServerInstanceManager.java @@ -69,6 +69,10 @@ public AsyncKieServerInstanceManager(final @EmbeddedController NotificationServi this.executor = executorService; } + @Override + public boolean isAsync() { + return true; + } @Override public List startScanner(final ServerTemplate serverTemplate, final ContainerSpec containerSpec, diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenter.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenter.java index f4ce17f50ffa..c404f9a2e338 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenter.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenter.java @@ -18,8 +18,10 @@ import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Map; import java.util.Optional; +import java.util.Set; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; @@ -34,6 +36,8 @@ import org.kie.server.api.model.KieContainerStatus; import org.kie.server.api.model.Message; import org.kie.server.api.model.Severity; +import org.kie.server.controller.api.model.events.ServerInstanceDeleted; +import org.kie.server.controller.api.model.events.ServerInstanceDisconnected; import org.kie.server.controller.api.model.events.ServerInstanceUpdated; import org.kie.server.controller.api.model.runtime.Container; import org.kie.server.controller.api.model.spec.Capability; @@ -77,6 +81,9 @@ public class ContainerPresenter { private final Event serverTemplateSelectedEvent; private final Event notification; private ContainerSpec containerSpec; + private Boolean isEmpty = null; + private Set serverInstances = new HashSet<>(); + @Inject public ContainerPresenter(final Logger logger, @@ -104,7 +111,7 @@ public ContainerPresenter(final Logger logger, @PostConstruct public void init() { view.init(this); - view.setStatus(containerRemoteStatusPresenter.getView()); + view.setStatus(containerStatusEmptyPresenter.getView()); view.setRulesConfig(containerRulesConfigPresenter.getView()); view.setProcessConfig(containerProcessConfigPresenter.getView()); } @@ -119,43 +126,49 @@ protected void setContainerSpec(ContainerSpec containerSpec){ public void onRefresh(@Observes final RefreshRemoteServers refresh) { if (refresh != null && refresh.getContainerSpecKey() != null) { - load(refresh.getContainerSpecKey()); + runtimeManagementService.call((RemoteCallback) content -> { + logger.info("onRefresh {}", content); + checkNotNull("content", content); + updateContainerStatusView(content.getContainerSpec(), content.getContainers()); + }).getContainersByContainerSpec(refresh.getContainerSpecKey().getServerTemplateKey().getId(), + refresh.getContainerSpecKey().getId()); } else { - logger.warn("Illegal event argument."); + logger.warn("Illegal event argument RefreshRemoteServers {}", refresh); } } - public void load(@Observes final ContainerSpecSelected containerSpecSelected) { + public void onSelectContainerSpec(@Observes final ContainerSpecSelected containerSpecSelected) { if (containerSpecSelected != null && containerSpecSelected.getContainerSpecKey() != null) { + logger.info("onSelectContainerSpec {}", containerSpecSelected); load(containerSpecSelected.getContainerSpecKey()); } else { - logger.warn("Illegal event argument."); - } - } - - public void onInstanceUpdated(@Observes ServerInstanceUpdated instanceUpdated) { - if (instanceUpdated != null && containerSpec != null && containerSpec.getServerTemplateKey().getId().equals(instanceUpdated.getServerInstance().getServerTemplateId())) { - load(containerSpec); + logger.warn("Illegal event argument ContainerSpecSelected {}", containerSpecSelected); } } - public void loadContainers(@Observes final ContainerSpecData content) { + public void onChangeContainerSpecData(@Observes final ContainerSpecData content) { if (content != null && content.getContainerSpec() != null && content.getContainers() != null && containerSpec != null && containerSpec.getId() != null && containerSpec.getId().equals(content.getContainerSpec().getId())) { - resetReleaseIdForFailedContainers(content.getContainers(), content.getContainerSpec()); - setup(content.getContainerSpec(), - content.getContainers()); - } else { - logger.warn("Illegal event argument."); + logger.info("onChangeContainers {}", content); + resetReleaseIdForFailedContainers(content.getContainerSpec(), content.getContainers()); + setup(content.getContainerSpec(), content.getContainers()); } } - private void resetReleaseIdForFailedContainers(Collection containers, ContainerSpec containerSpec) { + public void onUpdateContainerSpec(@Observes final ContainerUpdateEvent updateEvent) { + final ContainerRuntimeOperation runtimeOperation = updateEvent.getContainerRuntimeOperation(); + + if (updateEvent.getContainerSpec().equals(containerSpec) && runtimeOperation != STOP_CONTAINER) { + refresh(); + } + } + + private void resetReleaseIdForFailedContainers(ContainerSpec containerSpec, Collection containers) { containers.forEach(container -> { if (KieContainerStatus.FAILED == container.getStatus() || container.getResolvedReleasedId() == null) { container.setResolvedReleasedId(containerSpec.getReleasedId()); @@ -168,15 +181,6 @@ private void resetReleaseIdForFailedContainers(Collection containers, } } - - public void refreshOnContainerUpdateEvent(@Observes final ContainerUpdateEvent updateEvent) { - final ContainerRuntimeOperation runtimeOperation = updateEvent.getContainerRuntimeOperation(); - - if (updateEvent.getContainerSpec().equals(containerSpec) && runtimeOperation != STOP_CONTAINER) { - refresh(); - } - } - public void refresh() { load(containerSpec); } @@ -184,40 +188,42 @@ public void refresh() { public void load(final ContainerSpecKey containerSpecKey) { checkNotNull("containerSpecKey", containerSpecKey); runtimeManagementService.call((RemoteCallback) content -> { + logger.debug("load {}", content); checkNotNull("content", content); - setContainerSpec(content.getContainerSpec()); - loadContainers(content); + if(content.getContainerSpec() != null && content.getContainers() != null) { + setup(content.getContainerSpec(), content.getContainers()); + } }).getContainersByContainerSpec(containerSpecKey.getServerTemplateKey().getId(), containerSpecKey.getId()); + } private void setup(final ContainerSpec containerSpec, final Collection containers) { - this.containerSpec = checkNotNull("containerSpec", - containerSpec); - updateView(containers); + this.containerSpec = checkNotNull("containerSpec", containerSpec); + updateView(containerSpec, containers); } - private void updateView(final Collection containers) { - containerStatusEmptyPresenter.setup(containerSpec); - containerRemoteStatusPresenter.setup(containerSpec, - containers); - view.clear(); - if (isEmpty(containers)) { - view.setStatus(containerStatusEmptyPresenter.getView()); - } else { - view.setStatus(containerRemoteStatusPresenter.getView()); - } + private void updateView(final ContainerSpec containerSpecKey, final Collection containers) { + containerStatusEmptyPresenter.setup(containerSpecKey); + containerRemoteStatusPresenter.setup(containerSpecKey, containers); + - view.setContainerName(containerSpec.getContainerName()); - view.setGroupIp(containerSpec.getReleasedId().getGroupId()); - view.setArtifactId(containerSpec.getReleasedId().getArtifactId()); - containerRulesConfigPresenter.setVersion(containerSpec.getReleasedId().getVersion()); + updateContainerView(containerSpecKey); + updateContainerStatusView(containerSpecKey, containers); + + } + + private void updateContainerView(ContainerSpec updatedContainerSpec) { + view.setContainerName(updatedContainerSpec.getContainerName()); + view.setGroupIp(updatedContainerSpec.getReleasedId().getGroupId()); + view.setArtifactId(updatedContainerSpec.getReleasedId().getArtifactId()); + containerRulesConfigPresenter.setVersion(updatedContainerSpec.getReleasedId().getVersion()); containerProcessConfigPresenter.disable(); - updateStatus(containerSpec.getStatus() != null ? containerSpec.getStatus() : KieContainerStatus.STOPPED); + updateStatus(updatedContainerSpec.getStatus() != null ? updatedContainerSpec.getStatus() : KieContainerStatus.STOPPED); - for (Map.Entry entry : containerSpec.getConfigs().entrySet()) { + for (Map.Entry entry : updatedContainerSpec.getConfigs().entrySet()) { switch (entry.getKey()) { case RULE: setupRuleConfig((RuleConfig) entry.getValue()); @@ -225,17 +231,69 @@ private void updateView(final Collection containers) { case PROCESS: setupProcessConfig((ProcessConfig) entry.getValue()); break; + case PLANNING: + // do nothing + break; } } } + + public void onServerInstanceUpdated( @Observes final ServerInstanceUpdated serverInstanceUpdated ) { + if(this.containerSpec == null) { + return; + } + if ( serverInstanceUpdated != null && serverInstanceUpdated.getServerInstance() != null ) { + serverInstanceUpdated.getServerInstance().getContainers().stream() + .filter(c -> !KieContainerStatus.STOPPED.equals(c.getStatus())) + .filter(c -> this.containerSpec.getId().equals(c.getContainerSpecId())) + .filter(c -> this.containerSpec.getServerTemplateKey().getId().equals(c.getServerTemplateId())) + .forEach(c -> serverInstances.add(c.getServerInstanceId())); + updateContainerStatusView(); + } else { + logger.warn( "Illegal event argument ServerInstanceUpdated {}", serverInstanceUpdated); + } + } - private boolean isEmpty(final Collection containers) { - for (final Container container : containers) { - if (!container.getStatus().equals(KieContainerStatus.STOPPED)) { - return false; + public void onServerInstanceDisconnect( @Observes final ServerInstanceDisconnected serverInstanceDisconnected ) { + if ( serverInstanceDisconnected != null && + serverInstanceDisconnected.getServerInstanceId() != null ) { + if(serverInstances.remove(serverInstanceDisconnected.getServerInstanceId())) { + updateContainerStatusView(); } + } else { + logger.warn( "Illegal event argument ServerInstanceDisconnected {}", serverInstanceDisconnected); + } + } + + public void onServerInstanceDelete( @Observes final ServerInstanceDeleted serverInstanceDeleted ) { + if ( serverInstanceDeleted != null && + serverInstanceDeleted.getServerInstanceId() != null ) { + + if(serverInstances.remove(serverInstanceDeleted.getServerInstanceId())) { + updateContainerStatusView(); + } + } else { + logger.warn( "Illegal event argument ServerInstanceDeleted {}", serverInstanceDeleted); + } + } + + private void updateContainerStatusView(ContainerSpecKey containerSpecUpdated, Collection containers) { + logger.debug( "updateContainerStatusView {} with number of containers {}", containerSpecUpdated, containers.size()); + serverInstances.clear(); + containers.stream().filter(c -> !KieContainerStatus.STOPPED.equals(c.getStatus())).forEach(c -> serverInstances.add(c.getServerInstanceId())); + updateContainerStatusView(); + } + + private void updateContainerStatusView() { + logger.debug( "updateContainerStatusView with number of containers {}", serverInstances); + // switch from empty -> not empty. Avoid the blink + if ((isEmpty== null && serverInstances.isEmpty()) || (serverInstances.isEmpty() && !isEmpty)) { + view.setStatus(containerStatusEmptyPresenter.getView()); + isEmpty = true; + } else if ((isEmpty == null && !serverInstances.isEmpty()) || (!serverInstances.isEmpty() && isEmpty)) { + view.setStatus(containerRemoteStatusPresenter.getView()); + isEmpty = false; } - return true; } protected void updateStatus(final KieContainerStatus status) { diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenter.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenter.java index 568bd09ba2e4..9778fa7fdf58 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenter.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenter.java @@ -16,25 +16,30 @@ package org.kie.workbench.common.screens.server.management.client.container.status; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.enterprise.event.Observes; import javax.inject.Inject; +import com.google.gwt.user.client.ui.IsWidget; import org.jboss.errai.ioc.client.api.ManagedInstance; import org.kie.server.api.model.KieContainerStatus; import org.kie.server.controller.api.model.events.ServerInstanceDeleted; +import org.kie.server.controller.api.model.events.ServerInstanceDisconnected; import org.kie.server.controller.api.model.events.ServerInstanceUpdated; import org.kie.server.controller.api.model.runtime.Container; -import org.kie.server.controller.api.model.spec.ContainerSpec; +import org.kie.server.controller.api.model.spec.ContainerSpecKey; import org.kie.workbench.common.screens.server.management.client.container.status.card.ContainerCardPresenter; import org.slf4j.Logger; -import com.google.gwt.user.client.ui.IsWidget; +import static java.util.Collections.emptyList; @Dependent public class ContainerRemoteStatusPresenter { @@ -43,16 +48,20 @@ public interface View extends IsWidget { void addCard( final IsWidget content ); + void removeCard(final IsWidget content); + void clear(); + + } private final Logger logger; private final View view; private final ManagedInstance cardPresenterProvider; - private final Map> index = new HashMap>(); + private final Map index = new HashMap(); - private ContainerSpec containerSpec; + private ContainerSpecKey containerSpec; @Inject public ContainerRemoteStatusPresenter( final Logger logger, @@ -65,6 +74,7 @@ public ContainerRemoteStatusPresenter( final Logger logger, @PostConstruct public void init() { + this.view.clear(); } public View getView() { @@ -72,89 +82,111 @@ public View getView() { } public void onServerInstanceUpdated( @Observes final ServerInstanceUpdated serverInstanceUpdated ) { - if ( serverInstanceUpdated != null && - serverInstanceUpdated.getServerInstance() != null ) { - final String updatedServerInstanceKey = serverInstanceUpdated.getServerInstance().getServerInstanceId(); - if ( index.containsKey( updatedServerInstanceKey )) { - final Map oldIndex = new HashMap( index.remove( updatedServerInstanceKey ) ); - final Map newIndexIndex = new HashMap( serverInstanceUpdated.getServerInstance().getContainers().size() ); - index.put( updatedServerInstanceKey, newIndexIndex ); - for ( final Container container : serverInstanceUpdated.getServerInstance().getContainers() ) { - ContainerCardPresenter presenter = oldIndex.remove( container.getContainerSpecId() ); - if ( !container.getStatus().equals( KieContainerStatus.STOPPED ) ) { - if ( presenter != null ) { - presenter.updateContent(serverInstanceUpdated.getServerInstance(), - container ); - } else { - presenter = buildContainer( container, false ); - } - newIndexIndex.put( container.getContainerName(), presenter ); - } - } - for ( final ContainerCardPresenter presenter : oldIndex.values() ) { - presenter.delete(); - } - } else { - for ( final Container container : serverInstanceUpdated.getServerInstance().getContainers() ) { - if ( containerSpec != null && - container.getServerTemplateId().equals( containerSpec.getServerTemplateKey().getId() ) && - container.getContainerSpecId().equals( containerSpec.getId() ) ) { - buildAndIndexContainer( container ); - } - } - } + if ( serverInstanceUpdated != null && serverInstanceUpdated.getServerInstance() != null ) { + updateView(serverInstanceUpdated.getServerInstance().getContainers()); + } else { + logger.warn( "Illegal event argument ServerInstanceUpdated {}", serverInstanceUpdated); + } + } + + public void onServerInstanceDisconnect( @Observes final ServerInstanceDisconnected serverInstanceDisconnected ) { + if ( serverInstanceDisconnected != null && + serverInstanceDisconnected.getServerInstanceId() != null ) { + updateServerInstanceView(serverInstanceDisconnected.getServerInstanceId(), emptyList()); } else { - logger.warn( "Illegal event argument." ); + logger.warn( "Illegal event argument ServerInstanceDisconnected {}", serverInstanceDisconnected); } } - public void onDelete( @Observes final ServerInstanceDeleted serverInstanceDeleted ) { + public void onServerInstanceDelete( @Observes final ServerInstanceDeleted serverInstanceDeleted ) { if ( serverInstanceDeleted != null && serverInstanceDeleted.getServerInstanceId() != null ) { - final String deletedServerInstanceId = serverInstanceDeleted.getServerInstanceId(); - if ( index.containsKey( deletedServerInstanceId ) ) { - final Map oldIndex = index.remove( deletedServerInstanceId ); - if ( oldIndex != null ) { - for ( final ContainerCardPresenter presenter : oldIndex.values() ) { - presenter.delete(); - } - } - } + updateServerInstanceView(serverInstanceDeleted.getServerInstanceId(), emptyList()); } else { - logger.warn( "Illegal event argument." ); + logger.warn( "Illegal event argument ServerInstanceDeleted {}", serverInstanceDeleted); } } - public void setup( final ContainerSpec containerSpec, + public void setup( final ContainerSpecKey containerSpec, final Collection containers ) { + // change view we reset the view + if(containerSpec == null || !containerSpec.equals(this.containerSpec)) { + logger.debug("Clear ContainerRemoteStatusPresenter {} to {} ", this.containerSpec, containerSpec); + index.clear(); + view.clear(); + } this.containerSpec = containerSpec; - this.view.clear(); - for ( Container container : containers ) { - if ( !container.getStatus().equals( KieContainerStatus.STOPPED ) ) { - buildAndIndexContainer( container ); + + if(containerSpec == null) { + return; + } + + updateView(containers); + + } + + private void updateView(final Collection containers) { + Set serverInstanceIds = containers.stream().map(c -> c.getServerInstanceId()).collect(Collectors.toSet()); + for(String serverInstanceId : serverInstanceIds) { + Collection containersByServerInstanceId = new ArrayList<>(); + for(Container container : containers) { + if(container.getServerInstanceId().equals(serverInstanceId)) { + containersByServerInstanceId.add(container); + } } + updateServerInstanceView(serverInstanceId, containersByServerInstanceId); } } - private void buildAndIndexContainer( final Container container ) { - index( container, buildContainer( container, true ) ); + + private boolean isContainerSpecCompliant(ContainerSpecKey containerSpec, Container container) { + return containerSpec != null && + container.getServerTemplateId().equals( containerSpec.getServerTemplateKey().getId() ) && + container.getContainerSpecId().equals( containerSpec.getId() ); } - private ContainerCardPresenter buildContainer( final Container container, boolean addCard ) { - final ContainerCardPresenter cardPresenter = cardPresenterProvider.get(); - cardPresenter.setup( container.getServerInstanceKey(), container ); - if(addCard) { - view.addCard( cardPresenter.getView().asWidget() ); + + private void updateServerInstanceView(String serverInstanceId, Collection containers) { + // ensure all compliant containers are shown + boolean containerFound = false; + for(Container container : containers) { + if(isContainerSpecCompliant(this.containerSpec, container) && !KieContainerStatus.STOPPED.equals(container.getStatus()) ) { + containerFound = true; + if(hasIndexEntry(container)) { + logger.debug("Update entry serverInstanceId {} and container {}", serverInstanceId, container); + updateIndexEntry(container); + } else { + logger.debug("Add entry serverInstanceId {} and container {}", serverInstanceId, container); + addIndexEntry(container); + } + } } - return cardPresenter; - } - private void index( final Container container, - final ContainerCardPresenter cardPresenter ) { - if ( !index.containsKey( container.getServerInstanceKey().getServerInstanceId() ) ) { - index.put( container.getServerInstanceKey().getServerInstanceId(), new HashMap() ); + if(!containerFound && index.containsKey( serverInstanceId )) { + logger.debug("Remove entry serverInstanceId {}", serverInstanceId); + view.removeCard(index.remove( serverInstanceId ).getView().asWidget()); } - index.get( container.getServerInstanceKey().getServerInstanceId() ).put( container.getContainerSpecId(), cardPresenter ); + } + + private boolean hasIndexEntry(Container container) { + return index.containsKey(container.getServerInstanceId()); + } + + private ContainerCardPresenter addIndexEntry(final Container container) { + ContainerCardPresenter presenter = buildContainer(container); + view.addCard(presenter.getView().asWidget()); + return index.put( container.getServerInstanceId(), presenter); + } + + private ContainerCardPresenter updateIndexEntry(final Container container) { + index.get(container.getServerInstanceId()).updateContent(container.getServerInstanceKey(), container ); + return index.get(container.getServerInstanceId()); + } + + private ContainerCardPresenter buildContainer( final Container container) { + final ContainerCardPresenter cardPresenter = cardPresenterProvider.get(); + cardPresenter.setup( container.getServerInstanceKey(), container ); + return cardPresenter; } } \ No newline at end of file diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusView.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusView.java index 445e33ee2b89..4b56b17479a0 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusView.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusView.java @@ -38,8 +38,12 @@ public class ContainerRemoteStatusView extends Composite @Override public void addCard(final IsWidget widget) { - cardContainer.add(checkNotNull("widget", - widget)); + cardContainer.add(checkNotNull("widget", widget)); + } + + @Override + public void removeCard(final IsWidget widget) { + cardContainer.remove(checkNotNull("widget", widget)); } @Override diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardPresenter.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardPresenter.java index 298c889fc402..6b84b5291adf 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardPresenter.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardPresenter.java @@ -40,6 +40,8 @@ public interface View extends IsWidget { void setCard( CardPresenter.View card ); void delete(); + + void removeCard(CardPresenter.View card); } private final View view; diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardView.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardView.java index 69d812907222..b6d635608610 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardView.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/container/status/card/ContainerCardView.java @@ -43,6 +43,12 @@ public void setCard(final CardPresenter.View cardView) { cardView).asWidget()); } + @Override + public void removeCard(final CardPresenter.View cardView) { + container.remove(checkNotNull("cardView", + cardView).asWidget()); + } + @Override public void delete() { removeFromParent(); diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenter.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenter.java index cf4218502626..31571109e2c2 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenter.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenter.java @@ -16,6 +16,7 @@ package org.kie.workbench.common.screens.server.management.client.remote; +import java.util.ArrayList; import java.util.Collection; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; @@ -26,6 +27,7 @@ import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.ErrorCallback; import org.jboss.errai.common.client.api.RemoteCallback; +import org.kie.server.api.model.KieContainerStatus; import org.kie.server.controller.api.model.events.ServerInstanceUpdated; import org.kie.server.controller.api.model.runtime.Container; import org.kie.server.controller.api.model.runtime.ServerInstanceKey; @@ -68,6 +70,7 @@ public interface View extends UberView { private final Event notification; private ServerInstanceKey serverInstanceKey; + private Boolean isEmpty = null; @Inject public RemotePresenter( final Logger logger, @@ -150,13 +153,25 @@ public void callback( final Collection containers ) { private void loadContent( final Collection containers ) { - view.clear(); + Collection nonStoppedContainers = new ArrayList<>(); + for (Container container : containers) { + if(!KieContainerStatus.STOPPED.equals(container.getStatus())) { + nonStoppedContainers.add(container); + } + } + + if(isEmpty == null) { + isEmpty = !nonStoppedContainers.isEmpty(); + } + + remoteStatusPresenter.setup( nonStoppedContainers ); view.setServerName( serverInstanceKey.getServerName() ); view.setServerURL( serverInstanceKey.getUrl() ); - if ( containers.isEmpty() ) { + if ((nonStoppedContainers.isEmpty() && isEmpty == null) || (nonStoppedContainers.isEmpty() && !isEmpty)) { + isEmpty = true; view.setEmptyView( remoteEmptyPresenter.getView() ); - } else { - remoteStatusPresenter.setup( containers ); + } else if ((!nonStoppedContainers.isEmpty() && isEmpty == null) || (!nonStoppedContainers.isEmpty() && isEmpty)){ + isEmpty = false; view.setStatusPresenter( remoteStatusPresenter.getView() ); } } diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusPresenter.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusPresenter.java index 3ef32c6fa5a9..2c7e7a39ed91 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusPresenter.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusPresenter.java @@ -17,16 +17,21 @@ package org.kie.workbench.common.screens.server.management.client.remote; import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; +import com.google.gwt.user.client.ui.IsWidget; import org.jboss.errai.ioc.client.api.ManagedInstance; import org.kie.server.controller.api.model.runtime.Container; import org.kie.workbench.common.screens.server.management.client.remote.card.ContainerCardPresenter; -import com.google.gwt.user.client.ui.IsWidget; +import static java.util.stream.Collectors.toSet; @Dependent public class RemoteStatusPresenter { @@ -35,12 +40,15 @@ public interface View extends IsWidget { void addCard( final IsWidget content ); + void removeCard (final IsWidget content); + void clear(); } private final View view; private final ManagedInstance presenterProvider; - + private final Map cards = new HashMap<>(); + @Inject public RemoteStatusPresenter( final View view, final ManagedInstance presenterProvider ) { @@ -57,12 +65,26 @@ public View getView() { } public void setup( final Collection containers ) { - view.clear(); for ( final Container container : containers ) { - final ContainerCardPresenter newCard = presenterProvider.get(); + ContainerCardPresenter newCard = null; + if(!cards.containsKey(key(container))) { + newCard = presenterProvider.get(); + cards.put(key(container), newCard); + view.addCard( newCard.getView().asWidget() ); + } else { + newCard = cards.get(key(container)); + } newCard.setup( container ); - view.addCard( newCard.getView().asWidget() ); } + Set containerSpecIds = containers.stream().map(this::key).collect(toSet()); + Set deletedKeys = new HashSet<>(cards.keySet()).stream().filter(key -> !containerSpecIds.contains(key)).collect(toSet()); + for(String key : deletedKeys) { + view.removeCard(cards.remove(key).getView().asWidget()); + } + } + + private String key(Container container) { + return container.getServerInstanceId() + "-" + container.getContainerSpecId(); } } diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusView.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusView.java index 19e9e5a7f1c1..d9eda63161da 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusView.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/RemoteStatusView.java @@ -42,8 +42,15 @@ public void addCard(final IsWidget widget) { widget)); } + @Override + public void removeCard(IsWidget widget) { + cardContainer.remove(checkNotNull("widget", + widget)); + } + @Override public void clear() { cardContainer.clear(); } + } diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/card/ContainerCardPresenter.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/card/ContainerCardPresenter.java index c5c8962a9ed1..ffec594436bc 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/card/ContainerCardPresenter.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/main/java/org/kie/workbench/common/screens/server/management/client/remote/card/ContainerCardPresenter.java @@ -38,6 +38,7 @@ public class ContainerCardPresenter { private final ManagedInstance presenterProvider; private final org.kie.workbench.common.screens.server.management.client.container.status.card.ContainerCardPresenter.View view; private final Event containerSpecSelectedEvent; + private CardPresenter card = null; @Inject public ContainerCardPresenter( final ManagedInstance presenterProvider, @@ -63,7 +64,10 @@ public void execute() { containerSpecSelectedEvent.fire( new ContainerSpecSelected( buildContainerSpecKey( container ) ) ); } } ); - + if(card != null) { + view.removeCard(card.getView()); + } + final InfoTitlePresenter infoTitlePresenter = presenterProvider.select( InfoTitlePresenter.class ).get(); infoTitlePresenter.setup( container.getResolvedReleasedId() ); @@ -73,7 +77,7 @@ public void execute() { final FooterPresenter footerPresenter = presenterProvider.select( FooterPresenter.class ).get(); footerPresenter.setup( container.getUrl(), container.getResolvedReleasedId().getVersion() ); - CardPresenter card = presenterProvider.select( CardPresenter.class ).get(); + card = presenterProvider.select( CardPresenter.class ).get(); card.addTitle( linkTitlePresenter ); card.addTitle( infoTitlePresenter ); card.addBody( bodyPresenter ); diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenterTest.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenterTest.java index fa83d029ac20..100fa44c5004 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenterTest.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/ContainerPresenterTest.java @@ -165,7 +165,7 @@ public void testOnInstanceUpdatedWhenContainerSpecIsNull() { ServerInstanceUpdated serverInstanceUpdated = mock(ServerInstanceUpdated.class); ContainerSpec containerSpec = null; presenter.setContainerSpec(containerSpec); - presenter.onInstanceUpdated(serverInstanceUpdated); + presenter.onServerInstanceUpdated(serverInstanceUpdated); verify(runtimeManagementService, times(0)).getContainersByContainerSpec(any(), any()); } @@ -176,7 +176,7 @@ public void testOnInstanceUpdatedWhenContainerSpecServerTemplateNotEqualServerIn ServerInstance serverInstance = mock(ServerInstance.class); when(serverInstanceUpdated.getServerInstance()).thenReturn(serverInstance); when(serverInstance.getServerTemplateId()).thenReturn(serverTemplateKey + "1"); - presenter.onInstanceUpdated(serverInstanceUpdated); + presenter.onServerInstanceUpdated(serverInstanceUpdated); verify(runtimeManagementService, times(0)).getContainersByContainerSpec(any(), any()); } @@ -188,14 +188,14 @@ public void testInit() { verify(view).init(presenter); assertEquals(view, presenter.getView()); - verify(view).setStatus(containerRemoteStatusPresenter.getView()); + verify(view).setStatus(containerStatusEmptyPresenter.getView()); verify(view).setRulesConfig(containerRulesConfigPresenter.getView()); verify(view).setProcessConfig(containerProcessConfigPresenter.getView()); } @Test public void testStartContainer() { - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); presenter.startContainer(); @@ -221,7 +221,9 @@ public void testStartContainer() { @Test public void testStopContainer() { - presenter.loadContainers(containerSpecData); + + presenter.onChangeContainerSpecData(containerSpecData); + presenter.stopContainer(); @@ -246,7 +248,7 @@ public void testStopContainer() { @Test public void testDeactivateContainerFromStopedState() { - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); presenter.toggleActivationContainer(); @@ -258,7 +260,7 @@ public void testDeactivateContainerFromStopedState() { @Test public void testDeactivateContainerFromStartedState() { - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); presenter.startContainer(); containerSpec.setStatus(KieContainerStatus.STARTED); @@ -274,7 +276,7 @@ public void testDeactivateContainerFromStartedState() { @Test public void testDeactivateThenActivateContainerFromStartedState() { - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); presenter.startContainer(); containerSpec.setStatus(KieContainerStatus.STARTED); @@ -297,7 +299,7 @@ public void testDeactivateThenActivateContainerFromStartedState() { @Test public void testLoadContainersEmpty() { - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); verifyLoad(true, 1, false); } @@ -312,12 +314,12 @@ public void testLoadContainersOnlyOnSelectedContainerEvent() { KieContainerStatus.STOPPED, new HashMap()); presenter.setContainerSpec(containerSpec1); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); verifyLoad(true, 0, false); presenter.setContainerSpec(containerSpec); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); verifyLoad(true, 1, false); @@ -330,10 +332,13 @@ public void testRefresh() { serverTemplateKey.getId(), containerSpec.getId())).thenReturn(containerSpecData); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); presenter.refresh(); - verifyLoad(true, 2, false); + verify(containerStatusEmptyPresenter, times(2)).setup(containerSpec); + verify(containerRemoteStatusPresenter, times(2)).setup(containerSpec, containers); + verify(view, times(1)).setStatus(containerStatusEmptyPresenterView); + verify(view, never()).setStatus(containerRemoteStatusPresenterView); } @Test @@ -345,7 +350,7 @@ public void testLoadContainers() { null, null); containerSpecData.getContainers().add(container); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); verifyLoad(true, 1, false); } @@ -360,7 +365,7 @@ public void testLoadContainersNonStoped() { null); container.setStatus(KieContainerStatus.STARTED); containerSpecData.getContainers().add(container); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); verifyLoad(false, 1, false); } @@ -376,7 +381,7 @@ public void testLoadContainersHasFailed() { container.setStatus(KieContainerStatus.FAILED); containerSpecData.getContainers().add(container); assertNull(container.getResolvedReleasedId()); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); assertEquals(KieContainerStatus.FAILED, containerSpecData.getContainerSpec().getStatus()); assertNotNull(container.getResolvedReleasedId()); @@ -390,8 +395,6 @@ private void verifyLoad(boolean empty, int times, boolean hasFailed) { verify(containerRemoteStatusPresenter, times(times)).setup(containerSpec, containers); - verify(view, - times(times)).clear(); if (empty) { verify(view, @@ -438,9 +441,31 @@ public void testLoad() { serverTemplateKey.getId(), containerSpec.getId())).thenReturn(containerSpecData); - presenter.load(new ContainerSpecSelected(containerSpec)); + presenter.onSelectContainerSpec(new ContainerSpecSelected(containerSpec)); - verifyLoad(true, 1, false); + verify(containerStatusEmptyPresenter, times(1)).setup(containerSpec); + verify(containerRemoteStatusPresenter, times(1)).setup(containerSpec, containers); + + verify(view, never()).setStatus(containerRemoteStatusPresenterView); + verify(view, times(1)).setStatus(containerStatusEmptyPresenterView); + + + verify(view,times(1)).setContainerName(containerSpec.getContainerName()); + verify(view, times(1)).setGroupIp(containerSpec.getReleasedId().getGroupId()); + verify(view,times(1)).setArtifactId(containerSpec.getReleasedId().getArtifactId()); + verify(containerRulesConfigPresenter, times(1)).setVersion(releaseId.getVersion()); + verify(containerProcessConfigPresenter, times(1)).disable(); + + verify(view,times(1)).setContainerStartState(State.DISABLED); + verify(view, times(1)).setContainerStopState(State.ENABLED); + + + verify(containerProcessConfigPresenter, + times(1)).setup(containerSpec, + (ProcessConfig) containerSpec.getConfigs().get(Capability.PROCESS)); + verify(containerRulesConfigPresenter, + times(1)).setup(containerSpec, + (RuleConfig) containerSpec.getConfigs().get(Capability.RULE)); } @Test @@ -452,7 +477,7 @@ public void testRefreshOnContainerUpdateEventWhenRuntimeOperationIsNotStopContai ContainerRuntimeOperation.START_CONTAINER); doNothing().when(presenter).refresh(); - presenter.refreshOnContainerUpdateEvent(updateEvent); + presenter.onUpdateContainerSpec(updateEvent); verify(presenter).refresh(); } @@ -466,7 +491,7 @@ public void testRefreshOnContainerUpdateEventWhenRuntimeOperationIsStopContainer ContainerRuntimeOperation.STOP_CONTAINER); doNothing().when(presenter).refresh(); - presenter.refreshOnContainerUpdateEvent(updateEvent); + presenter.onUpdateContainerSpec(updateEvent); verify(presenter, never()).refresh(); @@ -482,7 +507,7 @@ public void testRefreshOnContainerUpdateEventWithSameContainerSpec() { doNothing().when(presenter).refresh(); - presenter.refreshOnContainerUpdateEvent(updateEvent); + presenter.onUpdateContainerSpec(updateEvent); verify(presenter).refresh(); } @@ -499,7 +524,7 @@ public void testRefreshOnContainerUpdateEventWithDifferentContainerSpec() { null, ContainerRuntimeOperation.START_CONTAINER); - presenter.refreshOnContainerUpdateEvent(updateEvent); + presenter.onUpdateContainerSpec(updateEvent); verify(presenter, never()).refresh(); @@ -510,10 +535,33 @@ public void testOnRefresh() { when(runtimeManagementService.getContainersByContainerSpec( serverTemplateKey.getId(), containerSpec.getId())).thenReturn(containerSpecData); - + presenter.load(containerSpec); + presenter.onRefresh(new RefreshRemoteServers(containerSpec)); - verifyLoad(true, 1, false); + verify(containerStatusEmptyPresenter, times(1)).setup(containerSpec); + verify(containerRemoteStatusPresenter, times(1)).setup(containerSpec, containers); + + verify(view, never()).setStatus(containerRemoteStatusPresenterView); + verify(view, times(1)).setStatus(containerStatusEmptyPresenterView); + + + verify(view,times(1)).setContainerName(containerSpec.getContainerName()); + verify(view, times(1)).setGroupIp(containerSpec.getReleasedId().getGroupId()); + verify(view,times(1)).setArtifactId(containerSpec.getReleasedId().getArtifactId()); + verify(containerRulesConfigPresenter, times(1)).setVersion(releaseId.getVersion()); + verify(containerProcessConfigPresenter, times(1)).disable(); + + verify(view,times(1)).setContainerStartState(State.DISABLED); + verify(view, times(1)).setContainerStopState(State.ENABLED); + + + verify(containerProcessConfigPresenter, + times(1)).setup(containerSpec, + (ProcessConfig) containerSpec.getConfigs().get(Capability.PROCESS)); + verify(containerRulesConfigPresenter, + times(1)).setup(containerSpec, + (RuleConfig) containerSpec.getConfigs().get(Capability.RULE)); } @Test @@ -531,7 +579,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { final String successMessage = "SUCCESS"; when(view.getRemoveContainerSuccessMessage()).thenReturn(successMessage); - presenter.loadContainers(containerSpecData); + presenter.onChangeContainerSpecData(containerSpecData); presenter.removeContainer(); verify(specManagementService).deleteContainerSpec(serverTemplateKey.getId(), diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenterTest.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenterTest.java index 54363e509b35..dc46233c2096 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenterTest.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/container/status/ContainerRemoteStatusPresenterTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertEquals; import static org.kie.workbench.common.screens.server.management.client.util.Convert.toKey; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -50,6 +51,7 @@ import org.kie.workbench.common.screens.server.management.client.container.status.card.ContainerCardPresenter; import org.mockito.ArgumentCaptor; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.slf4j.Logger; @@ -91,19 +93,23 @@ public void testOnDelete() { final Container container = new Container( "containerSpecId", "containerName", serverInstanceKey, Collections.emptyList(), null, null ); container.setStatus( KieContainerStatus.STARTED ); - presenter.setup( new ContainerSpec(), Collections.singletonList( container ) ); + ContainerSpec spec = new ContainerSpec(); + spec.setId("containerSpecId"); + spec.setServerTemplateKey(new ServerTemplateKey("templateId", "aName")); + + presenter.setup( spec, Collections.singletonList( container ) ); verify( view ).clear(); verify( cardPresenter ).setup( container.getServerInstanceKey(), container ); verify( view ).addCard( any( IsWidget.class ) ); - presenter.onDelete( new ServerInstanceDeleted( serverInstanceKey.getServerInstanceId() ) ); + presenter.onServerInstanceDelete(new ServerInstanceDeleted( serverInstanceKey.getServerInstanceId() ) ); - verify( cardPresenter ).delete(); + verify( view ).removeCard(anyObject()); - presenter.onDelete( new ServerInstanceDeleted( "randomKey" ) ); + presenter.onServerInstanceDelete( new ServerInstanceDeleted( "randomKey" ) ); - verify( cardPresenter ).delete(); + verify( view ).removeCard(anyObject()); } @Test @@ -113,25 +119,26 @@ public void testOnServerInstanceUpdated() { when( presenterProvider.get() ).thenReturn( cardPresenter ); final ServerInstance serverInstance = new ServerInstance( "templateId", "serverName", "serverInstanceId", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); - final Container container = new Container( "containerSpecId", "containerName", serverInstance, Collections.emptyList(), null, null ); + final Container container = new Container( "containerSpecId", "containerName", serverInstance, Collections.emptyList(), null, "url" ); container.setStatus( KieContainerStatus.STARTED ); - final Container containerToBeRemoved = new Container( "containerToBeRemovedSpecId", "containerToBeRemovedName", serverInstance, Collections.emptyList(), null, null ); + final Container containerToBeRemoved = new Container( "containerToBeRemovedSpecId", "containerToBeRemovedName", serverInstance, Collections.emptyList(), null, "url" ); containerToBeRemoved.setStatus( KieContainerStatus.STARTED ); serverInstance.addContainer( container ); - - presenter.setup( new ContainerSpec(), Arrays.asList( container, containerToBeRemoved ) ); + ContainerSpec spec = new ContainerSpec(); + spec.setId("containerSpecId"); + spec.setServerTemplateKey(new ServerTemplateKey("templateId", "aname")); + presenter.setup(spec , Arrays.asList( container, containerToBeRemoved ) ); presenter.onServerInstanceUpdated( new ServerInstanceUpdated( serverInstance ) ); //One container updated, one removed - verify( cardPresenter ).updateContent( serverInstance, container ); - verify( cardPresenter ).delete(); + verify( cardPresenter ).updateContent( container.getServerInstanceKey(), container ); + verify( view ).addCard(anyObject()); final ArgumentCaptor containerCaptor = ArgumentCaptor.forClass( Container.class ); - verify( cardPresenter, times( 2 ) ).setup( eq( container.getServerInstanceKey() ), containerCaptor.capture() ); + verify( cardPresenter, times( 1 ) ).setup( eq( container.getServerInstanceKey() ), containerCaptor.capture() ); final List containers = containerCaptor.getAllValues(); - assertEquals( 2, containers.size() ); + assertEquals( 1, containers.size() ); assertEquals( container, containers.get( 0 ) ); - assertEquals( containerToBeRemoved, containers.get( 1 ) ); } @Test @@ -150,36 +157,43 @@ public void testOnServerInstanceUpdatedNewInstance() { .when( presenterProvider ).get(); final ServerInstance serverInstance = new ServerInstance( "templateId", "serverInstanceId", "serverInstanceId", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); - final Container existingContainer = new Container( "containerToBeRemovedSpecId", "containerToBeRemovedName", serverInstance, Collections.emptyList(), null, null ); - existingContainer.setStatus( KieContainerStatus.STARTED ); - - final ServerInstance newServerInstance = new ServerInstance( "templateId", "newserverInstanceId", "newserverInstanceId", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); - final Container newContainer = new Container( "containerSpecId", "containerName", newServerInstance, Collections.emptyList(), null, null ); - newContainer.setStatus( KieContainerStatus.STARTED ); - newServerInstance.addContainer( newContainer ); + final Container container = new Container( "containerSpecId", "containerNameX", serverInstance, Collections.emptyList(), null, "url" ); + container.setStatus( KieContainerStatus.STARTED ); + serverInstance.addContainer( container ); // To check when ContainerSpec not available - presenter.onServerInstanceUpdated( new ServerInstanceUpdated( newServerInstance ) ); - - verify( cardPresenter , times(0)).setup( toKey( newServerInstance ), newContainer ); - - presenter.setup( new ContainerSpec( "containerSpecId", "containerName", new ServerTemplateKey( "templateId", "templateId" ), new ReleaseId(), KieContainerStatus.STARTED, Collections.emptyMap() ), Arrays.asList( existingContainer ) ); - - verify( cardPresenter ).setup( toKey( serverInstance ), existingContainer ); - - presenter.onServerInstanceUpdated( new ServerInstanceUpdated( newServerInstance ) ); + presenter.onServerInstanceUpdated( new ServerInstanceUpdated( serverInstance ) ); + verify( presenterProvider , times(0)).get(); - //One container added - verify( cardPresenter2 ).setup( toKey( newServerInstance ), newContainer ); + + // check selection + presenter.setup( new ContainerSpec( "containerSpecId", "containerName", new ServerTemplateKey( "templateId", "templateId" ), new ReleaseId(), KieContainerStatus.STARTED, Collections.emptyMap() ), Arrays.asList( container ) ); + verify( presenterProvider , times(1)).get(); + verify( cardPresenter, times(1) ).setup( eq(toKey( serverInstance )) , eq(container) ); - final Container newContainer2 = new Container( "containerSpecId", "containerNameX", newServerInstance, Collections.emptyList(), null, null ); - newContainer2.setStatus( KieContainerStatus.STARTED ); - newServerInstance.addContainer( newContainer2 ); + // update selection + presenter.onServerInstanceUpdated( new ServerInstanceUpdated( serverInstance ) ); + verify( cardPresenter ).setup( toKey( serverInstance ), container ); //One new container added to existing server - presenter.onServerInstanceUpdated( new ServerInstanceUpdated( newServerInstance ) ); + final ServerInstance newServerInstance = new ServerInstance( "templateId", "newserverInstanceId", "newserverInstanceId", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); + final Container newContainer = new Container( "containerSpecId", "containerName", newServerInstance, Collections.emptyList(), null, "url" ); + newContainer.setStatus( KieContainerStatus.STARTED ); + newServerInstance.addContainer( newContainer ); - verify( cardPresenter3 ).setup( newContainer2.getServerInstanceKey(), newContainer2 ); + presenter.onServerInstanceUpdated( new ServerInstanceUpdated( newServerInstance ) ); + verify( presenterProvider , times(2)).get(); + verify( cardPresenter2 ).setup( newContainer.getServerInstanceKey(), newContainer ); + + // update container not belonging to current template + final ServerInstance newServerInstanceNotTemplate = new ServerInstance( "notTemplateId", "newserverInstanceIdNotTemplate", "newserverInstanceIdNotTemplate", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); + final Container newContainerNotTeamplate = new Container( "containerSpecId", "containerName", newServerInstance, Collections.emptyList(), null, "url" ); + newContainerNotTeamplate.setStatus( KieContainerStatus.STARTED ); + newServerInstance.addContainer( newContainerNotTeamplate ); + + presenter.onServerInstanceUpdated( new ServerInstanceUpdated( newServerInstanceNotTemplate ) ); + // no new invocations + verify( presenterProvider , times(2)).get(); } @Test @@ -189,9 +203,9 @@ public void testOnServerInstanceUpdatedDuplicatedContainerName() { when( presenterProvider.get() ).thenReturn( cardPresenter ); final ServerInstance serverInstance = new ServerInstance( "templateId", "serverName", "serverInstanceId", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); - final Container container = new Container( "containerSpecId", "containerName", serverInstance, Collections.emptyList(), null, null ); + final Container container = new Container( "containerSpecId", "containerName", serverInstance, Collections.emptyList(), null, "url" ); container.setStatus( KieContainerStatus.STARTED ); - final Container container2 = new Container( "containerSpecId2", "containerName", serverInstance, Collections.emptyList(), null, null ); + final Container container2 = new Container( "containerSpecId2", "containerName", serverInstance, Collections.emptyList(), null, "url" ); container2.setStatus( KieContainerStatus.STARTED ); final Container containerToBeRemoved = new Container( "containerToBeRemovedSpecId", "containerToBeRemovedName", serverInstance, Collections.emptyList(), null, null ); @@ -199,21 +213,22 @@ public void testOnServerInstanceUpdatedDuplicatedContainerName() { serverInstance.addContainer( container ); serverInstance.addContainer( container2 ); - presenter.setup( new ContainerSpec(), Arrays.asList( container, container2, containerToBeRemoved ) ); + ContainerSpec spec = new ContainerSpec(); + spec.setId("containerSpecId"); + spec.setServerTemplateKey(new ServerTemplateKey("templateId", "aName")); + presenter.setup( spec, Arrays.asList( container, container2, containerToBeRemoved ) ); presenter.onServerInstanceUpdated( new ServerInstanceUpdated( serverInstance ) ); - //One container updated, one removed - verify( cardPresenter ).updateContent( serverInstance, container ); - verify( cardPresenter ).updateContent( serverInstance, container2 ); - verify( cardPresenter ).delete(); + //One container updated + verify( cardPresenter, times(1) ).updateContent(Mockito.anyObject(), Mockito.anyObject()); + verify( cardPresenter ).updateContent( container.getServerInstanceKey(), container ); + final ArgumentCaptor containerCaptor = ArgumentCaptor.forClass( Container.class ); - verify( cardPresenter, times( 3 ) ).setup( eq( container.getServerInstanceKey() ), containerCaptor.capture() ); + verify( cardPresenter, times( 1 ) ).setup( eq( container.getServerInstanceKey() ), containerCaptor.capture() ); final List containers = containerCaptor.getAllValues(); - assertEquals( 3, containers.size() ); + assertEquals( 1, containers.size() ); assertEquals( container, containers.get( 0 ) ); - assertEquals( container2, containers.get( 1 ) ); - assertEquals( containerToBeRemoved, containers.get( 2 ) ); } } \ No newline at end of file diff --git a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenterTest.java b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenterTest.java index f16cc9e65031..142cab07889d 100644 --- a/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenterTest.java +++ b/kie-wb-common-screens/kie-wb-common-server-ui/kie-wb-common-server-ui-client/src/test/java/org/kie/workbench/common/screens/server/management/client/remote/RemotePresenterTest.java @@ -24,6 +24,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.kie.server.api.model.KieContainerStatus; import org.kie.server.api.model.Message; import org.kie.server.controller.api.model.events.ServerInstanceUpdated; import org.kie.server.controller.api.model.runtime.Container; @@ -44,6 +45,7 @@ import org.uberfire.workbench.events.NotificationEvent; import static org.junit.Assert.*; +import static org.mockito.Matchers.anyCollectionOf; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) @@ -128,6 +130,7 @@ public void testRemoveError() { public void testSelectAndRefresh() { final ServerInstanceKey serverInstanceKey = new ServerInstanceKey( "templateId", "serverName", "serverInstanceId", "url" ); final Container container = new Container( "containerSpecId", "containerName", serverInstanceKey, Collections.emptyList(), null, null ); + container.setStatus(KieContainerStatus.STARTED); final List containers = Collections.singletonList( container ); when( runtimeManagementService.getContainersByServerInstance( serverInstanceKey.getServerTemplateId(), @@ -137,7 +140,7 @@ public void testSelectAndRefresh() { presenter.onSelect( new ServerInstanceSelected( serverInstanceKey ) ); - verify( view ).clear(); + verify( view ).setServerName( serverInstanceKey.getServerName() ); verify( view ).setServerURL( serverInstanceKey.getUrl() ); verify( remoteStatusPresenter ).setup( containers ); @@ -155,7 +158,7 @@ public void testSelectAndRefreshEmptyContainers() { presenter.onSelect( new ServerInstanceSelected( serverInstanceKey ) ); - verify( view ).clear(); + verify( remoteStatusPresenter, times( 1 ) ).setup(anyCollectionOf(Container.class)); verify( view ).setServerName( serverInstanceKey.getServerName() ); verify( view ).setServerURL( serverInstanceKey.getUrl() ); verify( view ).setEmptyView( remoteEmptyPresenter.getView() ); @@ -168,10 +171,10 @@ public void testOnInstanceUpdate() { presenter.onInstanceUpdate( new ServerInstanceUpdated( serverInstance ) ); - verify( view, times( 2 ) ).clear(); + verify( remoteStatusPresenter, times( 2 ) ).setup(anyCollectionOf(Container.class)); verify( view, times( 2 ) ).setServerName( serverInstance.getServerName() ); verify( view, times( 2 ) ).setServerURL( serverInstance.getUrl() ); - verify( view, times( 2 ) ).setEmptyView( remoteEmptyPresenter.getView() ); + verify( view, times( 1 ) ).setEmptyView( remoteEmptyPresenter.getView() ); } @Test @@ -182,7 +185,6 @@ public void testOnInstanceUpdateDifferentServer() { final ServerInstance serverInstance2 = new ServerInstance( "templateId2", "serverName2", "serverInstanceId2", "url", "1.0", Collections.emptyList(), Collections.emptyList() ); presenter.onInstanceUpdate( new ServerInstanceUpdated( serverInstance2 ) ); - verify( view ).clear(); verify( view ).setServerName( serverInstance.getServerName() ); verify( view ).setServerURL( serverInstance.getUrl() ); verify( view ).setEmptyView( remoteEmptyPresenter.getView() );