/******************************************************************************* * 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.api.environment.server; import org.eclipse.che.api.core.rest.ServiceContext; import org.eclipse.che.api.core.rest.shared.dto.Link; import org.eclipse.che.api.core.rest.shared.dto.LinkParameter; import org.eclipse.che.api.machine.shared.dto.MachineDto; import org.eclipse.che.api.machine.shared.dto.ServerDto; import javax.inject.Singleton; import javax.ws.rs.core.UriBuilder; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static java.lang.String.format; import static java.util.Collections.singletonList; import static org.eclipse.che.api.core.util.LinksHelper.createLink; import static org.eclipse.che.api.machine.shared.Constants.ENVIRONMENT_OUTPUT_CHANNEL_TEMPLATE; import static org.eclipse.che.api.machine.shared.Constants.ENVIRONMENT_STATUS_CHANNEL_TEMPLATE; import static org.eclipse.che.api.machine.shared.Constants.EXEC_AGENT_REFERENCE; import static org.eclipse.che.api.machine.shared.Constants.LINK_REL_ENVIRONMENT_OUTPUT_CHANNEL; import static org.eclipse.che.api.machine.shared.Constants.TERMINAL_REFERENCE; import static org.eclipse.che.dto.server.DtoFactory.cloneDto; import static org.eclipse.che.dto.server.DtoFactory.newDto; /** * Helps to inject Machine related links. * * @author Anton Korneta */ @Singleton public class MachineLinksInjector { public MachineDto injectLinks(MachineDto machine, ServiceContext serviceContext) { final List<Link> links = new ArrayList<>(); injectTerminalLink(machine, serviceContext, links); injectExecAgentLink(machine, serviceContext, links); // add workspace channel links final Link workspaceChannelLink = createLink("GET", serviceContext.getBaseUriBuilder() .path("ws") .scheme("https".equals( serviceContext.getBaseUriBuilder().build().getScheme()) ? "wss" : "ws") .build() .toString(), null); final LinkParameter channelParameter = newDto(LinkParameter.class).withName("channel") .withRequired(true); links.add(cloneDto(workspaceChannelLink).withRel(LINK_REL_ENVIRONMENT_OUTPUT_CHANNEL) .withParameters(singletonList(cloneDto(channelParameter) .withDefaultValue(format(ENVIRONMENT_OUTPUT_CHANNEL_TEMPLATE, machine.getWorkspaceId()))))); links.add(cloneDto(workspaceChannelLink).withRel(ENVIRONMENT_STATUS_CHANNEL_TEMPLATE) .withParameters(singletonList(cloneDto(channelParameter) .withDefaultValue(format(ENVIRONMENT_STATUS_CHANNEL_TEMPLATE, machine.getWorkspaceId()))))); return machine.withLinks(links); } protected void injectTerminalLink(MachineDto machine, ServiceContext serviceContext, List<Link> links) { final String scheme = serviceContext.getBaseUriBuilder().build().getScheme(); if (machine.getRuntime() != null) { final Collection<ServerDto> servers = machine.getRuntime().getServers().values(); servers.stream() .filter(server -> TERMINAL_REFERENCE.equals(server.getRef())) .findAny() .ifPresent(terminal -> links.add(createLink("GET", UriBuilder.fromUri(terminal.getUrl()) .scheme("https".equals(scheme) ? "wss" : "ws") .path("/pty") .build() .toString(), TERMINAL_REFERENCE))); } } protected void injectExecAgentLink(MachineDto machine, ServiceContext serviceContext, List<Link> links) { final String scheme = serviceContext.getBaseUriBuilder().build().getScheme(); if (machine.getRuntime() != null) { final Collection<ServerDto> servers = machine.getRuntime().getServers().values(); servers.stream() .filter(server -> EXEC_AGENT_REFERENCE.equals(server.getRef())) .findAny() .ifPresent(terminal -> links.add(createLink("GET", UriBuilder.fromUri(terminal.getUrl()) .scheme("https".equals(scheme) ? "wss" : "ws") .path("/connect") .build() .toString(), EXEC_AGENT_REFERENCE))); } } }