/* * 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.container; import java.util.Collection; import java.util.Map; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; 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.ErrorCallback; import org.jboss.errai.common.client.api.RemoteCallback; import org.kie.server.api.model.KieContainerStatus; import org.kie.server.controller.api.model.runtime.Container; import org.kie.server.controller.api.model.spec.Capability; import org.kie.server.controller.api.model.spec.ContainerConfig; import org.kie.server.controller.api.model.spec.ContainerSpec; import org.kie.server.controller.api.model.spec.ContainerSpecKey; import org.kie.server.controller.api.model.spec.ProcessConfig; import org.kie.server.controller.api.model.spec.RuleConfig; import org.kie.workbench.common.screens.server.management.client.container.config.process.ContainerProcessConfigPresenter; import org.kie.workbench.common.screens.server.management.client.container.config.rules.ContainerRulesConfigPresenter; import org.kie.workbench.common.screens.server.management.client.container.status.ContainerRemoteStatusPresenter; import org.kie.workbench.common.screens.server.management.client.container.status.empty.ContainerStatusEmptyPresenter; import org.kie.workbench.common.screens.server.management.client.events.ContainerSpecSelected; import org.kie.workbench.common.screens.server.management.client.events.RefreshRemoteServers; import org.kie.workbench.common.screens.server.management.client.events.ServerTemplateSelected; import org.kie.workbench.common.screens.server.management.client.util.State; import org.kie.workbench.common.screens.server.management.model.ContainerSpecData; import org.kie.workbench.common.screens.server.management.service.RuntimeManagementService; import org.kie.workbench.common.screens.server.management.service.SpecManagementService; import org.slf4j.Logger; import org.uberfire.client.mvp.UberView; import org.uberfire.mvp.Command; import org.uberfire.workbench.events.NotificationEvent; import static org.uberfire.commons.validation.PortablePreconditions.*; @Dependent public class ContainerPresenter { public interface View extends UberView<ContainerPresenter> { void clear(); void disableRemoveButton(); void enableRemoveButton(); void setContainerName( final String containerName ); void setGroupIp( final String groupIp ); void setArtifactId( final String artifactId ); void setStatus( final IsWidget view ); void setProcessConfig( final ContainerProcessConfigPresenter.View view ); void setRulesConfig( final ContainerRulesConfigPresenter.View view ); void setContainerStopState( final State state ); void setContainerStartState( final State state ); void confirmRemove( final Command command ); String getRemoveContainerSuccessMessage(); String getRemoveContainerErrorMessage(); String getStopContainerErrorMessage(); String getStartContainerErrorMessage(); } private final Logger logger; private final View view; private final ContainerRemoteStatusPresenter containerRemoteStatusPresenter; private final ContainerStatusEmptyPresenter containerStatusEmptyPresenter; private final ContainerProcessConfigPresenter containerProcessConfigPresenter; private final ContainerRulesConfigPresenter containerRulesConfigPresenter; private final Caller<RuntimeManagementService> runtimeManagementService; private final Caller<SpecManagementService> specManagementService; private final Event<ServerTemplateSelected> serverTemplateSelectedEvent; private final Event<NotificationEvent> notification; private ContainerSpec containerSpec; @Inject public ContainerPresenter( final Logger logger, final View view, final ContainerRemoteStatusPresenter containerRemoteStatusPresenter, final ContainerStatusEmptyPresenter containerStatusEmptyPresenter, final ContainerProcessConfigPresenter containerProcessConfigPresenter, final ContainerRulesConfigPresenter containerRulesConfigPresenter, final Caller<RuntimeManagementService> runtimeManagementService, final Caller<SpecManagementService> specManagementService, final Event<ServerTemplateSelected> serverTemplateSelectedEvent, final Event<NotificationEvent> notification ) { this.logger = logger; this.view = view; this.containerRemoteStatusPresenter = containerRemoteStatusPresenter; this.containerStatusEmptyPresenter = containerStatusEmptyPresenter; this.containerProcessConfigPresenter = containerProcessConfigPresenter; this.containerRulesConfigPresenter = containerRulesConfigPresenter; this.runtimeManagementService = runtimeManagementService; this.specManagementService = specManagementService; this.serverTemplateSelectedEvent = serverTemplateSelectedEvent; this.notification = notification; } @PostConstruct public void init() { view.init( this ); view.setStatus( containerRemoteStatusPresenter.getView() ); view.setRulesConfig( containerRulesConfigPresenter.getView() ); view.setProcessConfig( containerProcessConfigPresenter.getView() ); } public View getView() { return view; } public void onRefresh( @Observes final RefreshRemoteServers refresh ) { if ( refresh != null && refresh.getContainerSpecKey() != null ) { load( refresh.getContainerSpecKey() ); } else { logger.warn( "Illegal event argument." ); } } public void load( @Observes final ContainerSpecSelected containerSpecSelected ) { if ( containerSpecSelected != null && containerSpecSelected.getContainerSpecKey() != null ) { load( containerSpecSelected.getContainerSpecKey() ); } else { logger.warn( "Illegal event argument." ); } } public void loadContainers( @Observes final ContainerSpecData content ) { if ( content != null && content.getContainerSpec() != null && content.getContainers() != null ) { setup( content.getContainerSpec(), content.getContainers() ); } else { logger.warn( "Illegal event argument." ); } } public void refresh() { load( containerSpec ); } public void load( final ContainerSpecKey containerSpecKey ) { checkNotNull( "containerSpecKey", containerSpecKey ); runtimeManagementService.call( new RemoteCallback<ContainerSpecData>() { @Override public void callback( final ContainerSpecData content ) { checkNotNull( "content", content ); setup( content.getContainerSpec(), content.getContainers() ); } } ).getContainersByContainerSpec( containerSpecKey.getServerTemplateKey().getId(), containerSpecKey.getId() ); } private void setup( final ContainerSpec containerSpec, final Collection<Container> containers ) { this.containerSpec = checkNotNull( "containerSpec", containerSpec ); updateView( containers ); } private void updateView( final Collection<Container> containers ) { containerStatusEmptyPresenter.setup( containerSpec ); containerRemoteStatusPresenter.setup( containerSpec, containers ); view.clear(); if ( isEmpty( containers ) ) { view.setStatus( containerStatusEmptyPresenter.getView() ); } else { view.setStatus( containerRemoteStatusPresenter.getView() ); } view.setContainerName( containerSpec.getContainerName() ); view.setGroupIp( containerSpec.getReleasedId().getGroupId() ); view.setArtifactId( containerSpec.getReleasedId().getArtifactId() ); containerRulesConfigPresenter.setVersion( containerSpec.getReleasedId().getVersion() ); containerProcessConfigPresenter.disable(); updateStatus( containerSpec.getStatus() != null ? containerSpec.getStatus() : KieContainerStatus.STOPPED ); for ( Map.Entry<Capability, ContainerConfig> entry : containerSpec.getConfigs().entrySet() ) { switch ( entry.getKey() ) { case RULE: setupRuleConfig( (RuleConfig) entry.getValue() ); break; case PROCESS: setupProcessConfig( (ProcessConfig) entry.getValue() ); break; } } } private boolean isEmpty( final Collection<Container> containers ) { for ( final Container container : containers ) { if ( !container.getStatus().equals( KieContainerStatus.STOPPED ) ) { return false; } } return true; } private void updateStatus( final KieContainerStatus status ) { switch ( status ) { case CREATING: case STARTED: view.disableRemoveButton(); view.setContainerStartState( State.ENABLED ); view.setContainerStopState( State.DISABLED ); break; case STOPPED: case DISPOSING: case FAILED: view.enableRemoveButton(); view.setContainerStartState( State.DISABLED ); view.setContainerStopState( State.ENABLED ); break; } } private void setupProcessConfig( final ProcessConfig value ) { containerProcessConfigPresenter.setup( containerSpec, value ); } private void setupRuleConfig( final RuleConfig value ) { containerRulesConfigPresenter.setup( containerSpec, value ); } public void removeContainer() { view.confirmRemove( new Command() { @Override public void execute() { specManagementService.call( new RemoteCallback<Void>() { @Override public void callback( final Void response ) { notification.fire( new NotificationEvent( view.getRemoveContainerSuccessMessage(), NotificationEvent.NotificationType.SUCCESS ) ); serverTemplateSelectedEvent.fire( new ServerTemplateSelected( containerSpec.getServerTemplateKey() ) ); } }, new ErrorCallback<Object>() { @Override public boolean error( final Object o, final Throwable throwable ) { notification.fire( new NotificationEvent( view.getRemoveContainerErrorMessage(), NotificationEvent.NotificationType.ERROR ) ); serverTemplateSelectedEvent.fire( new ServerTemplateSelected( containerSpec.getServerTemplateKey() ) ); return false; } } ).deleteContainerSpec( containerSpec.getServerTemplateKey().getId(), containerSpec.getId() ); } } ); } public void stopContainer() { specManagementService.call( new RemoteCallback<Void>() { @Override public void callback( final Void response ) { updateStatus( KieContainerStatus.STOPPED ); } }, new ErrorCallback<Object>() { @Override public boolean error( final Object o, final Throwable throwable ) { notification.fire( new NotificationEvent( view.getStopContainerErrorMessage(), NotificationEvent.NotificationType.ERROR ) ); updateStatus( KieContainerStatus.STARTED ); return false; } } ).stopContainer( containerSpec ); } public void startContainer() { specManagementService.call( new RemoteCallback<Void>() { @Override public void callback( final Void response ) { updateStatus( KieContainerStatus.STARTED ); } }, new ErrorCallback<Object>() { @Override public boolean error( final Object o, final Throwable throwable ) { notification.fire( new NotificationEvent( view.getStartContainerErrorMessage(), NotificationEvent.NotificationType.ERROR ) ); updateStatus( KieContainerStatus.STOPPED ); return false; } } ).startContainer( containerSpec ); } }