/*******************************************************************************
* Copyright (c) 2016 Rogue Wave Software, 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:
* Rogue Wave Software, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.composer.ide.communication;
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.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.util.loging.Log;
import org.eclipse.che.ide.websocket.MessageBus;
import org.eclipse.che.ide.websocket.WebSocketException;
import org.eclipse.che.ide.websocket.events.MessageHandler;
import org.eclipse.che.plugin.composer.shared.dto.ComposerOutput;
import static org.eclipse.che.plugin.composer.shared.Constants.COMPOSER_CHANNEL_NAME;
/**
* Handler which receives messages from the Composer tool.
*
* @author Kaloyan Raev
*/
@Singleton
public class ComposerOutputHandler {
private final EventBus eventBus;
private final DtoFactory factory;
private final ProcessesPanelPresenter processesPanelPresenter;
private final CommandConsoleFactory commandConsoleFactory;
private final AppContext appContext;
@Inject
public ComposerOutputHandler(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 {
handleComposerOutput(messageBus);
}
});
}
@Override
public void onWsAgentStopped(WsAgentStateEvent event) {
}
});
}
private void handleComposerOutput(final MessageBus messageBus) {
final DefaultOutputConsole outputConsole = (DefaultOutputConsole) commandConsoleFactory.create("Composer");
try {
messageBus.subscribe(COMPOSER_CHANNEL_NAME, new MessageHandler() {
@Override
public void onMessage(String message) {
Log.info(getClass(), message);
ComposerOutput archetypeOutput = factory.createDtoFromJson(message, ComposerOutput.class);
processesPanelPresenter.addCommandOutput(appContext.getDevMachine().getId(), outputConsole);
switch (archetypeOutput.getState()) {
case START:
outputConsole.clearOutputsButtonClicked();
outputConsole.printText(archetypeOutput.getOutput(),"green");
break;
case IN_PROGRESS:
outputConsole.printText(archetypeOutput.getOutput());
break;
case DONE:
outputConsole.printText(archetypeOutput.getOutput(),"green");
break;
case ERROR:
outputConsole.printText(archetypeOutput.getOutput(),"red");
break;
default:
break;
}
}
});
} catch (WebSocketException e) {
e.printStackTrace();
}
}
}