/*******************************************************************************
* 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.plugin.urlfactory;
import com.google.common.base.Strings;
import com.google.common.io.CharStreams;
import org.eclipse.che.api.factory.server.FactoryMessageBodyAdapter;
import org.eclipse.che.api.factory.shared.dto.FactoryDto;
import org.eclipse.che.api.workspace.shared.dto.EnvironmentDto;
import org.eclipse.che.api.workspace.shared.dto.EnvironmentRecipeDto;
import org.eclipse.che.api.workspace.shared.dto.ExtendedMachineDto;
import org.eclipse.che.api.workspace.shared.dto.WorkspaceConfigDto;
import org.eclipse.che.dto.server.DtoFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;
import static org.eclipse.che.dto.server.DtoFactory.newDto;
/**
* Handle the creation of some elements used inside a {@link FactoryDto}
*
* @author Florent Benoit
*/
@Singleton
public class URLFactoryBuilder {
/**
* Default docker image (if repository has no dockerfile)
*/
protected static final String DEFAULT_DOCKER_IMAGE = "codenvy/ubuntu_jdk8";
/**
* Default docker type (if repository has no dockerfile)
*/
protected static final String MEMORY_LIMIT_BYTES = Long.toString(2000L * 1024L * 1024L);
protected static final String MACHINE_NAME = "ws-machine";
/**
* Check if URL is existing or not
*/
@Inject
private URLChecker URLChecker;
/**
* Grab content of URLs
*/
@Inject
private URLFetcher URLFetcher;
@Inject
private FactoryMessageBodyAdapter factoryAdapter;
/**
* Build a default factory using the provided json file or create default one
*
* @param jsonFileLocation
* location of factory json file
* @return a factory
*/
public FactoryDto createFactory(String jsonFileLocation) {
// Check if there is factory json file inside the repository
if (jsonFileLocation != null) {
String factoryJsonContent = URLFetcher.fetch(jsonFileLocation);
if (!Strings.isNullOrEmpty(factoryJsonContent)) {
// Adapt an old factory format to a new one if necessary
try {
final ByteArrayInputStream contentStream = new ByteArrayInputStream(factoryJsonContent.getBytes(UTF_8));
final InputStream newStream = factoryAdapter.adapt(contentStream);
factoryJsonContent = CharStreams.toString(new InputStreamReader(newStream, UTF_8));
} catch (IOException x) {
throw new IllegalStateException(x.getLocalizedMessage(), x);
}
return DtoFactory.getInstance().createDtoFromJson(factoryJsonContent, FactoryDto.class);
}
}
// else return a default factory
return newDto(FactoryDto.class).withV("4.0");
}
/**
* Help to generate default workspace configuration
*
* @param environmentName
* the name of the environment to create
* @param name
* the name of the workspace
* @param dockerFileLocation
* the optional location for codenvy dockerfile to use
* @return a workspace configuration
*/
public WorkspaceConfigDto buildWorkspaceConfig(String environmentName,
String name,
String dockerFileLocation) {
// if remote repository contains a codenvy docker file, use it
// else use the default image.
EnvironmentRecipeDto recipeDto;
if (dockerFileLocation != null && URLChecker.exists(dockerFileLocation)) {
recipeDto = newDto(EnvironmentRecipeDto.class).withLocation(dockerFileLocation)
.withType("dockerfile")
.withContentType("text/x-dockerfile");
} else {
recipeDto = newDto(EnvironmentRecipeDto.class).withLocation(DEFAULT_DOCKER_IMAGE)
.withType("dockerimage");
}
ExtendedMachineDto machine = newDto(ExtendedMachineDto.class).withAgents(singletonList("org.eclipse.che.ws-agent"))
.withAttributes(singletonMap("memoryLimitBytes", MEMORY_LIMIT_BYTES));
// setup environment
EnvironmentDto environmentDto = newDto(EnvironmentDto.class).withRecipe(recipeDto)
.withMachines(singletonMap(MACHINE_NAME, machine));
// workspace configuration using the environment
return newDto(WorkspaceConfigDto.class)
.withDefaultEnv(environmentName)
.withEnvironments(singletonMap(environmentName, environmentDto))
.withName(name);
}
}