/*******************************************************************************
* 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.model.impl;
import org.eclipse.che.api.core.model.machine.Command;
import org.eclipse.che.api.core.model.project.ProjectConfig;
import org.eclipse.che.api.core.model.workspace.Environment;
import org.eclipse.che.api.core.model.workspace.WorkspaceConfig;
import org.eclipse.che.api.machine.server.model.impl.CommandImpl;
import org.eclipse.che.commons.annotation.Nullable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
/**
* Data object for {@link WorkspaceConfig}.
*
* @author Alexander Garagatyi
* @author Yevhenii Voevodin
*/
@Entity(name = "WorkspaceConfig")
@Table(name = "workspaceconfig")
public class WorkspaceConfigImpl implements WorkspaceConfig {
public static WorkspaceConfigImplBuilder builder() {
return new WorkspaceConfigImplBuilder();
}
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "description", columnDefinition = "TEXT")
private String description;
@Column(name = "defaultenv", nullable = false)
private String defaultEnv;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "commands_id")
private List<CommandImpl> commands;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "projects_id")
private List<ProjectConfigImpl> projects;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "environments_id")
@MapKeyColumn(name = "environments_key")
private Map<String, EnvironmentImpl> environments;
public WorkspaceConfigImpl() {}
public WorkspaceConfigImpl(String name,
String description,
String defaultEnv,
List<? extends Command> commands,
List<? extends ProjectConfig> projects,
Map<String, ? extends Environment> environments) {
this.name = name;
this.defaultEnv = defaultEnv;
this.description = description;
if (environments != null) {
this.environments = environments.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey,
entry -> new EnvironmentImpl(entry.getValue())));
}
if (commands != null) {
this.commands = commands.stream()
.map(CommandImpl::new)
.collect(toList());
}
if (projects != null) {
this.projects = projects.stream()
.map(ProjectConfigImpl::new)
.collect(toList());
}
}
public WorkspaceConfigImpl(WorkspaceConfig workspaceConfig) {
this(workspaceConfig.getName(),
workspaceConfig.getDescription(),
workspaceConfig.getDefaultEnv(),
workspaceConfig.getCommands(),
workspaceConfig.getProjects(),
workspaceConfig.getEnvironments());
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = requireNonNull(name, "Non-null name required");
}
@Override
@Nullable
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String getDefaultEnv() {
return defaultEnv;
}
public void setDefaultEnv(String defaultEnv) {
this.defaultEnv = defaultEnv;
}
@Override
public List<CommandImpl> getCommands() {
if (commands == null) {
commands = new ArrayList<>();
}
return commands;
}
public void setCommands(List<CommandImpl> commands) {
this.commands = commands;
}
@Override
public List<ProjectConfigImpl> getProjects() {
if (projects == null) {
projects = new ArrayList<>();
}
return projects;
}
public void setProjects(List<ProjectConfigImpl> projects) {
this.projects = projects;
}
@Override
public Map<String, EnvironmentImpl> getEnvironments() {
if (environments == null) {
return new HashMap<>();
}
return environments;
}
public void setEnvironments(Map<String, EnvironmentImpl> environments) {
this.environments = environments;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof WorkspaceConfigImpl)) {
return false;
}
final WorkspaceConfigImpl that = (WorkspaceConfigImpl)obj;
return Objects.equals(id, that.id)
&& Objects.equals(name, that.name)
&& Objects.equals(description, that.description)
&& Objects.equals(defaultEnv, that.defaultEnv)
&& getCommands().equals(that.getCommands())
&& getProjects().equals(that.getProjects())
&& getEnvironments().equals(that.getEnvironments());
}
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + Objects.hashCode(id);
hash = 31 * hash + Objects.hashCode(name);
hash = 31 * hash + Objects.hashCode(description);
hash = 31 * hash + Objects.hashCode(defaultEnv);
hash = 31 * hash + getCommands().hashCode();
hash = 31 * hash + getProjects().hashCode();
hash = 31 * hash + getEnvironments().hashCode();
return hash;
}
@Override
public String toString() {
return "WorkspaceConfigImpl{" +
"id=" + id +
", name='" + name + '\'' +
", description='" + description + '\'' +
", defaultEnv='" + defaultEnv + '\'' +
", commands=" + commands +
", projects=" + projects +
", environments=" + environments +
'}';
}
/**
* Helps to build complex {@link WorkspaceConfigImpl users workspace instance}.
*
* @see WorkspaceConfigImpl#builder()
*/
public static class WorkspaceConfigImplBuilder {
private String name;
private String defaultEnvName;
private List<? extends Command> commands;
private List<? extends ProjectConfig> projects;
private Map<String, ? extends Environment> environments;
private String description;
private WorkspaceConfigImplBuilder() {}
public WorkspaceConfigImpl build() {
return new WorkspaceConfigImpl(name,
description,
defaultEnvName,
commands,
projects,
environments);
}
public WorkspaceConfigImplBuilder fromConfig(WorkspaceConfig workspaceConfig) {
this.name = workspaceConfig.getName();
this.description = workspaceConfig.getDescription();
this.defaultEnvName = workspaceConfig.getDefaultEnv();
this.projects = workspaceConfig.getProjects();
this.commands = workspaceConfig.getCommands();
this.environments = workspaceConfig.getEnvironments();
return this;
}
public WorkspaceConfigImplBuilder setName(String name) {
this.name = name;
return this;
}
public WorkspaceConfigImplBuilder setDefaultEnv(String defaultEnvName) {
this.defaultEnvName = defaultEnvName;
return this;
}
public WorkspaceConfigImplBuilder setCommands(List<? extends Command> commands) {
this.commands = commands;
return this;
}
public WorkspaceConfigImplBuilder setProjects(List<? extends ProjectConfig> projects) {
this.projects = projects;
return this;
}
public WorkspaceConfigImplBuilder setEnvironments(Map<String, ? extends Environment> environments) {
this.environments = environments;
return this;
}
public WorkspaceConfigImplBuilder setDescription(String description) {
this.description = description;
return this;
}
}
}