org.springframework.ide.eclipse.boot.dash.cloudfoundry.DevtoolsDebugTargetDisconnector.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.ide.eclipse.boot.dash.cloudfoundry.DevtoolsDebugTargetDisconnector.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Pivotal, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Pivotal, Inc. - initial API and implementation
 *******************************************************************************/
package org.springframework.ide.eclipse.boot.dash.cloudfoundry;

import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

import org.springframework.ide.eclipse.boot.dash.model.AbstractBootDashModel;
import org.springframework.ide.eclipse.boot.dash.model.BootDashElement;
import org.springframework.ide.eclipse.boot.dash.model.BootDashModel.ElementStateListener;
import org.springframework.ide.eclipse.boot.dash.model.RunState;
import org.springsource.ide.eclipse.commons.livexp.ui.Disposable;

import static org.springframework.ide.eclipse.boot.dash.model.RunState.*;

/**
 * Listens for statechanges on Cloudfoundry model so that when elements are stopped, connected
 * devtools debug connections are also terminated.
 *
 * @author Kris De Volder
 */
public class DevtoolsDebugTargetDisconnector implements Disposable {

    /**
     * States in which devtools client shouldn't be connected.
     */
    private static final EnumSet<RunState> NON_CONNECTABLE = EnumSet.of(STARTING, INACTIVE, CRASHED, FLAPPING);

    private ElementStateListener listener;
    private Map<BootDashElement, RunState> lastKnownState = new HashMap<BootDashElement, RunState>();
    private AbstractBootDashModel model;

    public DevtoolsDebugTargetDisconnector(AbstractBootDashModel model) {
        this.model = model;
        model.addElementStateListener(listener = new ElementStateListener() {
            public void stateChanged(BootDashElement e) {
                handleStateChange(e);
            }
        });
    }

    private void handleStateChange(BootDashElement e) {
        if (e instanceof CloudAppDashElement) {
            RunState newState = e.getRunState();
            RunState oldState = lastKnownState.get(e);
            //Careful 'oldState' may be null (meaning we have not yet seen a 'previous' event for that element)
            if (NON_CONNECTABLE.contains(newState) && newState != oldState) {
                //Cast should be safe because we are connected to CloudFoundryBootDashModel so all elements
                // should be CloudDashElement
                DevtoolsUtil.disconnectDevtoolsClientsFor((CloudAppDashElement) e);
            }
        }
    }

    @Override
    public void dispose() {
        if (listener != null) {
            this.model.removeElementStateListener(listener);
            listener = null;
        }
        lastKnownState = null;
    }

}