/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.macro; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.core.model.machine.Machine; import org.eclipse.che.api.core.model.machine.Server; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.machine.events.WsAgentStateEvent; import org.eclipse.che.ide.api.machine.events.WsAgentStateHandler; import org.eclipse.che.ide.api.macro.BaseMacro; import org.eclipse.che.ide.api.macro.Macro; import org.eclipse.che.ide.api.macro.MacroRegistry; import java.util.Map; import java.util.Set; /** * For every server in WsAgent's machine registers a {@link Macro} that * returns server's external address in form <b>hostname:port</b>. * * @author Vlad Zhukovskiy */ @Singleton public class ServerAddressMacroRegistrar implements WsAgentStateHandler { public static final String MACRO_NAME_TEMPLATE = "${server.port.%}"; private final MacroRegistry macroRegistry; private final AppContext appContext; private Set<Macro> macros; @Inject public ServerAddressMacroRegistrar(EventBus eventBus, MacroRegistry macroRegistry, AppContext appContext) { this.macroRegistry = macroRegistry; this.appContext = appContext; eventBus.addHandler(WsAgentStateEvent.TYPE, this); registerMacros(); } private void registerMacros() { Machine devMachine = appContext.getDevMachine(); if (devMachine != null) { macros = getMacros(devMachine); macroRegistry.register(macros); } } private Set<Macro> getMacros(Machine machine) { Set<Macro> macros = Sets.newHashSet(); for (Map.Entry<String, ? extends Server> entry : machine.getRuntime().getServers().entrySet()) { macros.add(new ServerAddressMacro(entry.getKey(), entry.getValue().getAddress())); if (entry.getKey().endsWith("/tcp")) { macros.add(new ServerAddressMacro(entry.getKey().substring(0, entry.getKey().length() - 4), entry.getValue().getAddress())); } } return macros; } @Override public void onWsAgentStarted(WsAgentStateEvent event) { registerMacros(); } @Override public void onWsAgentStopped(WsAgentStateEvent event) { for (Macro provider : macros) { macroRegistry.unregister(provider); } macros.clear(); } private class ServerAddressMacro extends BaseMacro { ServerAddressMacro(String internalPort, String externalAddress) { super(MACRO_NAME_TEMPLATE.replaceAll("%", internalPort), externalAddress, "Returns external address of the server running on port " + internalPort); } } }