/*******************************************************************************
* 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.workspace.server.stack;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.inject.Singleton;
import org.eclipse.che.api.workspace.server.WorkspaceConfigJsonAdapter;
import javax.inject.Inject;
import static org.eclipse.che.api.workspace.server.WorkspaceConfigJsonAdapter.findDevMachine;
/**
* Moves stack source to the workspace configuration, and adapts
* workspace configuration from an old format to a new one.
*
* @author Yevhenii Voevodin
*/
@Singleton
public class StackJsonAdapter {
private final WorkspaceConfigJsonAdapter workspaceConfigAdapter;
@Inject
public StackJsonAdapter(WorkspaceConfigJsonAdapter workspaceConfigAdapter) {
this.workspaceConfigAdapter = workspaceConfigAdapter;
}
public void adaptModifying(JsonObject stack) {
// inject a new source into workspace configuration dev machine's source
// and adapt an old workspace configuration to a new one
final JsonElement wsConfEl = stack.get("workspaceConfig");
if (wsConfEl != null && wsConfEl.isJsonObject()) {
final JsonObject wsConfig = wsConfEl.getAsJsonObject();
final JsonObject defaultEnv = findDefaultEnv(wsConfig);
if (defaultEnv != null) {
final JsonObject devMachine = findDevMachine(defaultEnv);
if (devMachine != null) {
// consider stack source as the source of the dev-machine
if (stack.has("source") && stack.get("source").isJsonObject()) {
devMachine.add("source", asWorkspaceConfigSource(stack.getAsJsonObject("source")));
}
}
// convert workspace config
workspaceConfigAdapter.adaptModifying(wsConfig);
}
}
}
private static JsonObject asWorkspaceConfigSource(JsonObject stackSource) {
final JsonObject newWsSource = new JsonObject();
if (stackSource.has("type") && !stackSource.get("type").isJsonNull()) {
final String type = stackSource.get("type").getAsString();
switch (type) {
case "image":
newWsSource.addProperty("type", "image");
if (stackSource.has("origin")) {
newWsSource.addProperty("location", stackSource.get("origin").getAsString());
}
break;
case "location":
newWsSource.addProperty("type", "dockerfile");
if (stackSource.has("origin")) {
newWsSource.addProperty("location", stackSource.get("origin").getAsString());
}
break;
case "dockerfile":
case "recipe":
newWsSource.addProperty("type", "dockerfile");
if (stackSource.has("origin")) {
newWsSource.addProperty("content", stackSource.get("origin").getAsString());
}
break;
}
}
return newWsSource;
}
private static JsonObject findDefaultEnv(JsonObject wsConfig) {
final JsonElement defaultEnvNameEl = wsConfig.get("defaultEnv");
if (defaultEnvNameEl != null && wsConfig.has("environments") && wsConfig.get("environments").isJsonArray()) {
final String defaultEnvName = defaultEnvNameEl.getAsString();
for (JsonElement envEl : wsConfig.getAsJsonArray("environments")) {
if (envEl.isJsonObject()) {
final JsonObject envObj = envEl.getAsJsonObject();
if (envObj.has("name") && envObj.get("name").getAsString().equals(defaultEnvName)) {
return envEl.getAsJsonObject();
}
}
}
}
return null;
}
}