/* * 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.status; import java.util.Collection; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.enterprise.event.Observes; import javax.inject.Inject; 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.ServerInstanceUpdated; import org.kie.server.controller.api.model.runtime.Container; import org.kie.server.controller.api.model.spec.ContainerSpec; 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; @Dependent public class ContainerRemoteStatusPresenter { public interface View extends IsWidget { void addCard( final IsWidget content ); void clear(); } private final Logger logger; private final View view; private final ManagedInstance<ContainerCardPresenter> cardPresenterProvider; private final Map<String, Map<String, ContainerCardPresenter>> index = new HashMap<String, Map<String, ContainerCardPresenter>>(); private ContainerSpec containerSpec; @Inject public ContainerRemoteStatusPresenter( final Logger logger, final View view, final ManagedInstance<ContainerCardPresenter> cardPresenterProvider ) { this.logger = logger; this.view = view; this.cardPresenterProvider = cardPresenterProvider; } @PostConstruct public void init() { } public View getView() { return view; } 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<String, ContainerCardPresenter> oldIndex = new HashMap<String, ContainerCardPresenter>( index.remove( updatedServerInstanceKey ) ); final Map<String, ContainerCardPresenter> newIndexIndex = new HashMap<String, ContainerCardPresenter>( serverInstanceUpdated.getServerInstance().getContainers().size() ); index.put( updatedServerInstanceKey, newIndexIndex ); for ( final Container container : serverInstanceUpdated.getServerInstance().getContainers() ) { ContainerCardPresenter presenter = oldIndex.remove( container.getContainerName() ); if ( !container.getStatus().equals( KieContainerStatus.STOPPED ) ) { if ( presenter != null ) { presenter.updateContent( serverInstanceUpdated.getServerInstance(), container ); } else { presenter = buildContainer( container ); } newIndexIndex.put( container.getContainerName(), presenter ); } } for ( final ContainerCardPresenter presenter : oldIndex.values() ) { presenter.delete(); } } else { for ( final Container container : serverInstanceUpdated.getServerInstance().getContainers() ) { if ( container.getServerTemplateId().equals( containerSpec.getServerTemplateKey().getId() ) && container.getContainerSpecId().equals( containerSpec.getId() ) ) { buildAndIndexContainer( container ); } } } } else { logger.warn( "Illegal event argument." ); } } public void onDelete( @Observes final ServerInstanceDeleted serverInstanceDeleted ) { if ( serverInstanceDeleted != null && serverInstanceDeleted.getServerInstanceId() != null ) { final String deletedServerInstanceId = serverInstanceDeleted.getServerInstanceId(); if ( index.containsKey( deletedServerInstanceId ) ) { final Map<String, ContainerCardPresenter> oldIndex = index.remove( deletedServerInstanceId ); if ( oldIndex != null ) { for ( final ContainerCardPresenter presenter : oldIndex.values() ) { presenter.delete(); } } } } else { logger.warn( "Illegal event argument." ); } } public void setup( final ContainerSpec containerSpec, final Collection<Container> containers ) { this.containerSpec = containerSpec; this.view.clear(); for ( Container container : containers ) { if ( !container.getStatus().equals( KieContainerStatus.STOPPED ) ) { buildAndIndexContainer( container ); } } } private void buildAndIndexContainer( final Container container ) { index( container, buildContainer( container ) ); } private ContainerCardPresenter buildContainer( final Container container ) { final ContainerCardPresenter cardPresenter = cardPresenterProvider.get(); cardPresenter.setup( container.getServerInstanceKey(), container ); view.addCard( cardPresenter.getView().asWidget() ); return cardPresenter; } private void index( final Container container, final ContainerCardPresenter cardPresenter ) { if ( !index.containsKey( container.getServerInstanceKey().getServerInstanceId() ) ) { index.put( container.getServerInstanceKey().getServerInstanceId(), new HashMap<String, ContainerCardPresenter>() ); } index.get( container.getServerInstanceKey().getServerInstanceId() ).put( container.getContainerName(), cardPresenter ); } }