/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.screens.server.management.client; import java.util.ArrayList; import java.util.Collection; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; import javax.inject.Inject; import com.google.gwt.user.client.ui.IsWidget; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.kie.server.controller.api.model.events.ServerInstanceDeleted; import org.kie.server.controller.api.model.events.ServerTemplateDeleted; import org.kie.server.controller.api.model.events.ServerTemplateUpdated; import org.kie.server.controller.api.model.runtime.ServerInstanceKey; import org.kie.server.controller.api.model.spec.ContainerSpec; import org.kie.server.controller.api.model.spec.ServerTemplate; import org.kie.server.controller.api.model.spec.ServerTemplateKey; import org.kie.workbench.common.screens.server.management.client.container.ContainerPresenter; import org.kie.workbench.common.screens.server.management.client.container.empty.ServerContainerEmptyPresenter; import org.kie.workbench.common.screens.server.management.client.empty.ServerEmptyPresenter; import org.kie.workbench.common.screens.server.management.client.events.ContainerSpecSelected; import org.kie.workbench.common.screens.server.management.client.events.ServerInstanceSelected; import org.kie.workbench.common.screens.server.management.client.events.ServerTemplateListRefresh; import org.kie.workbench.common.screens.server.management.client.events.ServerTemplateSelected; import org.kie.workbench.common.screens.server.management.client.navigation.ServerNavigationPresenter; import org.kie.workbench.common.screens.server.management.client.navigation.template.ServerTemplatePresenter; import org.kie.workbench.common.screens.server.management.client.remote.RemotePresenter; import org.kie.workbench.common.screens.server.management.client.util.ClientContainerRuntimeOperation; import org.kie.workbench.common.screens.server.management.model.ContainerUpdateEvent; import org.kie.workbench.common.screens.server.management.service.SpecManagementService; import org.slf4j.Logger; import org.uberfire.client.annotations.WorkbenchPartTitle; import org.uberfire.client.annotations.WorkbenchPartView; import org.uberfire.client.annotations.WorkbenchScreen; import org.uberfire.lifecycle.OnOpen; import org.uberfire.workbench.events.NotificationEvent; @ApplicationScoped @WorkbenchScreen(identifier = "ServerManagementBrowser") public class ServerManagementBrowserPresenter { public interface View extends IsWidget { void setNavigation( ServerNavigationPresenter.View view ); void setServerTemplate( ServerTemplatePresenter.View view ); void setEmptyView( ServerEmptyPresenter.View view ); void setContent( IsWidget view ); String getSuccessMessage( final ClientContainerRuntimeOperation containerRuntimeOperation, final int size ); String getErrorMessage( final ClientContainerRuntimeOperation containerRuntimeOperation, final int size ); String getWarnMessage( final ClientContainerRuntimeOperation containerRuntimeOperation, final int size ); } private final Logger logger; private final View view; private final ServerNavigationPresenter navigationPresenter; private final ServerTemplatePresenter serverTemplatePresenter; private final ServerEmptyPresenter serverEmptyPresenter; private final ServerContainerEmptyPresenter serverContainerEmptyPresenter; private final ContainerPresenter containerPresenter; private final RemotePresenter remotePresenter; private final Caller<SpecManagementService> specManagementService; private final Event<ServerTemplateSelected> serverTemplateSelectedEvent; private final Event<NotificationEvent> notification; private boolean isEmpty = true; @Inject public ServerManagementBrowserPresenter( final Logger logger, final View view, final ServerNavigationPresenter navigationPresenter, final ServerTemplatePresenter serverTemplatePresenter, final ServerEmptyPresenter serverEmptyPresenter, final ServerContainerEmptyPresenter serverContainerEmptyPresenter, final ContainerPresenter containerPresenter, final RemotePresenter remotePresenter, final Caller<SpecManagementService> specManagementService, final Event<ServerTemplateSelected> serverTemplateSelectedEvent, final Event<NotificationEvent> notification ) { this.logger = logger; this.view = view; this.navigationPresenter = navigationPresenter; this.serverTemplatePresenter = serverTemplatePresenter; this.serverEmptyPresenter = serverEmptyPresenter; this.serverContainerEmptyPresenter = serverContainerEmptyPresenter; this.containerPresenter = containerPresenter; this.remotePresenter = remotePresenter; this.specManagementService = specManagementService; this.serverTemplateSelectedEvent = serverTemplateSelectedEvent; this.notification = notification; } @PostConstruct public void init() { this.view.setNavigation( navigationPresenter.getView() ); } @OnOpen public void onOpen() { refreshList( new ServerTemplateListRefresh() ); } public void onServerDeleted( @Observes final ServerTemplateDeleted serverTemplateDeleted ) { if ( serverTemplateDeleted != null ) { refreshList( new ServerTemplateListRefresh() ); } else { logger.warn( "Illegal event argument." ); } } private void refreshList( @Observes final ServerTemplateListRefresh refresh ) { specManagementService.call( new RemoteCallback<Collection<ServerTemplateKey>>() { @Override public void callback( final Collection<ServerTemplateKey> serverTemplateKeys ) { setup( serverTemplateKeys, refresh.getSelectServerTemplateId() ); } } ).listServerTemplateKeys(); } public void onSelected( @Observes final ServerTemplateSelected serverTemplateSelected ) { if ( serverTemplateSelected != null && serverTemplateSelected.getServerTemplateKey() != null && serverTemplateSelected.getServerTemplateKey().getId() != null ) { selectServerTemplate( serverTemplateSelected.getServerTemplateKey().getId(), serverTemplateSelected.getContainerId() ); } else { logger.warn( "Illegal event argument." ); } } private void selectServerTemplate( final String serverTemplateId, final String containerId ) { specManagementService.call( new RemoteCallback<ServerTemplate>() { @Override public void callback( final ServerTemplate serverTemplate ) { setup( serverTemplate, containerId ); } } ).getServerTemplate( serverTemplateId ); } public void onSelected( @Observes final ContainerSpecSelected containerSpecSelected ) { if ( containerSpecSelected != null && containerSpecSelected.getContainerSpecKey() != null ) { this.view.setContent( containerPresenter.getView() ); } else { logger.warn( "Illegal event argument." ); } } public void onSelected( @Observes final ServerInstanceSelected serverInstanceSelected ) { if ( serverInstanceSelected != null && serverInstanceSelected.getServerInstanceKey() != null ) { this.view.setContent( remotePresenter.getView() ); } else { logger.warn( "Illegal event argument." ); } } public void onContainerUpdate( @Observes final ContainerUpdateEvent containerUpdateEvent ) { if ( containerUpdateEvent != null && containerUpdateEvent.getContainerRuntimeOperation() != null && containerUpdateEvent.getContainerRuntimeState() != null && containerUpdateEvent.getFailedServerInstances().size() > 0 ) { final ClientContainerRuntimeOperation containerRuntimeOperation = ClientContainerRuntimeOperation.convert( containerUpdateEvent.getContainerRuntimeOperation() ); final String message; final NotificationEvent.NotificationType notificationType; switch ( containerUpdateEvent.getContainerRuntimeState() ) { case OFFLINE: message = view.getErrorMessage( containerRuntimeOperation, containerUpdateEvent.getFailedServerInstances().size() ); notificationType = NotificationEvent.NotificationType.ERROR; break; case PARTIAL_ONLINE: message = view.getWarnMessage( containerRuntimeOperation, containerUpdateEvent.getFailedServerInstances().size() ); notificationType = NotificationEvent.NotificationType.WARNING; break; case ONLINE: message = view.getSuccessMessage( containerRuntimeOperation, containerUpdateEvent.getFailedServerInstances().size() ); notificationType = NotificationEvent.NotificationType.SUCCESS; break; default: message = null; notificationType = null; break; } if ( message != null ) { notification.fire( new NotificationEvent( message, notificationType ) ); } } else { logger.warn( "Illegal event argument." ); } } public void setup( final Collection<ServerTemplateKey> serverTemplateKeys, final String selectServerTemplateId ) { if ( serverTemplateKeys.isEmpty() ) { isEmpty = true; this.view.setEmptyView( serverEmptyPresenter.getView() ); navigationPresenter.clear(); } else { isEmpty = false; ServerTemplateKey serverTemplate2BeSelected = null; if ( selectServerTemplateId != null ) { for ( ServerTemplateKey serverTemplateKey : serverTemplateKeys ) { if ( serverTemplateKey.getId().equals( selectServerTemplateId ) ) { serverTemplate2BeSelected = serverTemplateKey; break; } } } if ( serverTemplate2BeSelected == null ) { serverTemplate2BeSelected = serverTemplateKeys.iterator().next(); } navigationPresenter.setup( serverTemplate2BeSelected, serverTemplateKeys ); serverTemplateSelectedEvent.fire( new ServerTemplateSelected( serverTemplate2BeSelected ) ); } } public void onServerTemplateUpdated( @Observes final ServerTemplateUpdated serverTemplateUpdated ) { if ( serverTemplateUpdated != null && serverTemplateUpdated.getServerTemplate() != null ) { final ServerTemplate serverTemplate = serverTemplateUpdated.getServerTemplate(); if ( isEmpty ) { setup( new ArrayList<ServerTemplateKey>() {{ add( serverTemplate ); }}, serverTemplate.getId() ); } } else { logger.warn( "Illegal event argument." ); } } public void onDelete( @Observes final ServerInstanceDeleted serverInstanceDeleted ) { if ( serverInstanceDeleted != null && serverInstanceDeleted.getServerInstanceId() != null && serverTemplatePresenter.getCurrentServerTemplate() != null ) { final String deletedServerInstanceId = serverInstanceDeleted.getServerInstanceId(); for ( final ServerInstanceKey serverInstanceKey : serverTemplatePresenter.getCurrentServerTemplate().getServerInstanceKeys() ) { if ( deletedServerInstanceId.equals( serverInstanceKey.getServerInstanceId() ) ) { refreshList( new ServerTemplateListRefresh( serverTemplatePresenter.getCurrentServerTemplate().getId() ) ); break; } } } else { logger.warn( "Illegal event argument." ); } } private void setup( final ServerTemplate serverTemplate, final String selectContainerId ) { this.view.setServerTemplate( serverTemplatePresenter.getView() ); ContainerSpec firstContainerSpec = null; if ( serverTemplate.getContainersSpec().isEmpty() ) { serverContainerEmptyPresenter.setTemplate( serverTemplate ); this.view.setContent( serverContainerEmptyPresenter.getView() ); firstContainerSpec = null; } else { if ( selectContainerId != null ) { for ( final ContainerSpec containerSpec : serverTemplate.getContainersSpec() ) { if ( containerSpec.getId().equals( selectContainerId ) ) { firstContainerSpec = containerSpec; break; } } } if ( firstContainerSpec == null ) { firstContainerSpec = serverTemplate.getContainersSpec().iterator().next(); } } serverTemplatePresenter.setup( serverTemplate, firstContainerSpec ); } @WorkbenchPartTitle public String getTitle() { return "Server Management Browser"; } @WorkbenchPartView public IsWidget getView() { return view; } }