/*******************************************************************************
* Copyright (c) 2017 RedHat, 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* RedHat, Inc. - initial commit
*******************************************************************************/
package org.eclipse.che.plugin.testing.ide.handler;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.testing.shared.TestingOutput;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.machine.WsAgentStateController;
import org.eclipse.che.ide.api.machine.events.WsAgentStateEvent;
import org.eclipse.che.ide.api.machine.events.WsAgentStateHandler;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.console.CommandConsoleFactory;
import org.eclipse.che.ide.console.DefaultOutputConsole;
import org.eclipse.che.ide.processes.panel.ProcessesPanelPresenter;
import org.eclipse.che.ide.websocket.MessageBus;
import org.eclipse.che.ide.websocket.WebSocketException;
import org.eclipse.che.ide.websocket.events.MessageHandler;
import static org.eclipse.che.api.testing.shared.Constants.TESTING_OUTPUT_CHANNEL_NAME;;
/**
* Handler which receives messages from the Testing tools.
*
* @author David Festal
*/
@Singleton
public class TestingHandler {
private final EventBus eventBus;
private final DtoFactory factory;
private final ProcessesPanelPresenter processesPanelPresenter;
private final CommandConsoleFactory commandConsoleFactory;
private final AppContext appContext;
@Inject
public TestingHandler(EventBus eventBus,
DtoFactory factory,
WsAgentStateController wsAgentStateController,
ProcessesPanelPresenter processesPanelPresenter,
CommandConsoleFactory commandConsoleFactory,
AppContext appContext) {
this.eventBus = eventBus;
this.factory = factory;
this.processesPanelPresenter = processesPanelPresenter;
this.commandConsoleFactory = commandConsoleFactory;
this.appContext = appContext;
handleOperations(factory, wsAgentStateController);
}
private void handleOperations(final DtoFactory factory, final WsAgentStateController wsAgentStateController) {
eventBus.addHandler(WsAgentStateEvent.TYPE, new WsAgentStateHandler() {
@Override
public void onWsAgentStarted(WsAgentStateEvent event) {
wsAgentStateController.getMessageBus().then(new Operation<MessageBus>() {
@Override
public void apply(MessageBus messageBus) throws OperationException {
handleTestingOutput(messageBus);
}
});
}
@Override
public void onWsAgentStopped(WsAgentStateEvent event) {
}
});
}
private void handleTestingOutput(final MessageBus messageBus) {
final DefaultOutputConsole outputConsole = (DefaultOutputConsole)commandConsoleFactory.create("Tests");
try {
messageBus.subscribe(TESTING_OUTPUT_CHANNEL_NAME, new MessageHandler() {
@Override
public void onMessage(String message) {
TestingOutput archetypeOutput = factory.createDtoFromJson(message, TestingOutput.class);
switch (archetypeOutput.getState()) {
case SESSION_START:
processesPanelPresenter.addCommandOutput(appContext.getDevMachine().getId(), outputConsole);
outputConsole.clearOutputsButtonClicked();
case DETAIL:
outputConsole.printText(archetypeOutput.getOutput());
break;
case SUCCESS:
outputConsole.printText(archetypeOutput.getOutput(), "green");
break;
case ERROR:
outputConsole.printText(archetypeOutput.getOutput(), "red");
break;
case FAILURE:
outputConsole.printText(archetypeOutput.getOutput(), "darkred");
break;
default:
break;
}
}
});
} catch (WebSocketException e) {
e.printStackTrace();
}
}
}