/******************************************************************************* * 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.factory.server.model.impl; import org.eclipse.che.api.core.model.factory.Author; import org.eclipse.che.api.core.model.factory.Button; import org.eclipse.che.api.core.model.factory.Factory; import org.eclipse.che.api.core.model.factory.Ide; import org.eclipse.che.api.core.model.factory.Policies; import org.eclipse.che.api.core.model.workspace.WorkspaceConfig; import org.eclipse.che.api.factory.server.FactoryImage; import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl; import org.eclipse.che.commons.lang.NameGenerator; import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import java.util.HashSet; import java.util.Objects; import java.util.Set; /** * Data object for {@link Factory}. * * @author Anton Korneta */ @Entity(name = "Factory") @Table(name = "che_factory") // TODO fix after issue: https://github.com/eclipse/che/issues/2110 //(uniqueConstraints = {@UniqueConstraint(columnNames = {"name", "userId"})}) public class FactoryImpl implements Factory { public static FactoryImplBuilder builder() { return new FactoryImplBuilder(); } @Id @Column(name = "id") private String id; @Column(name = "name") private String name; @Column(name = "version", nullable = false) private String version; @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, optional = false) @JoinColumn(name = "workspace_id") private WorkspaceConfigImpl workspace; @Embedded private AuthorImpl creator; // Mapping exists for explicit constraints which allows // jpa backend to perform operations in correct order @OneToOne(fetch = FetchType.LAZY) @JoinColumn(insertable = false, updatable = false, name = "user_id") private UserImpl userEntity; @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "button_id") private ButtonImpl button; @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "ide_id") private IdeImpl ide; @Embedded private PoliciesImpl policies; @ElementCollection @CollectionTable(name = "che_factory_image", joinColumns = @JoinColumn(name = "factory_id")) private Set<FactoryImage> images; public FactoryImpl() {} public FactoryImpl(String id, String name, String version, WorkspaceConfig workspace, Author creator, Policies policies, Ide ide, Button button, Set<FactoryImage> images) { this.id = id; this.name = name; this.version = version; if (workspace != null) { this.workspace = new WorkspaceConfigImpl(workspace); } if (creator != null) { this.creator = new AuthorImpl(creator); } if (policies != null) { this.policies = new PoliciesImpl(policies); } if (ide != null) { this.ide = new IdeImpl(ide); } if (button != null) { this.button = new ButtonImpl(button); } if (images != null) { this.images = new HashSet<>(images); } } public FactoryImpl(Factory factory, Set<FactoryImage> images) { this(factory.getId(), factory.getName(), factory.getV(), factory.getWorkspace(), factory.getCreator(), factory.getPolicies(), factory.getIde(), factory.getButton(), images); } public FactoryImpl(FactoryImpl factory) { this(factory, factory.images); } @Override public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String getV() { return version; } public void setV(String version) { this.version = version; } @Override public WorkspaceConfigImpl getWorkspace() { return workspace; } public void setWorkspace(WorkspaceConfigImpl workspace) { this.workspace = workspace; } @Override public AuthorImpl getCreator() { return creator; } public void setCreator(AuthorImpl creator) { this.creator = creator; } @Override public PoliciesImpl getPolicies() { return policies; } public void setPolicies(PoliciesImpl policies) { this.policies = policies; } @Override public ButtonImpl getButton() { return button; } public void setButton(ButtonImpl button) { this.button = button; } @Override public IdeImpl getIde() { return ide; } public void setIde(IdeImpl ide) { this.ide = ide; } public Set<FactoryImage> getImages() { if (images == null) { images = new HashSet<>(); } return images; } public void setImages(Set<FactoryImage> images) { this.images = images; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof FactoryImpl)) return false; final FactoryImpl other = (FactoryImpl)obj; return Objects.equals(id, other.id) && Objects.equals(name, other.name) && Objects.equals(version, other.version) && Objects.equals(workspace, other.workspace) && Objects.equals(creator, other.creator) && Objects.equals(policies, other.policies) && Objects.equals(ide, other.ide) && Objects.equals(button, other.button) && getImages().equals(other.getImages()); } @Override public int hashCode() { int hash = 7; hash = 31 * hash + Objects.hashCode(id); hash = 31 * hash + Objects.hashCode(name); hash = 31 * hash + Objects.hashCode(version); hash = 31 * hash + Objects.hashCode(workspace); hash = 31 * hash + Objects.hashCode(creator); hash = 31 * hash + Objects.hashCode(policies); hash = 31 * hash + Objects.hashCode(ide); hash = 31 * hash + Objects.hashCode(button); hash = 31 * hash + getImages().hashCode(); return hash; } @Override public String toString() { return "FactoryImpl{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", version='" + version + '\'' + ", workspace=" + workspace + ", creator=" + creator + ", policies=" + policies + ", ide=" + ide + ", button=" + button + ", images=" + images + '}'; } /** * Helps to create the instance of {@link FactoryImpl}. */ public static class FactoryImplBuilder { private String id; private String name; private String version; private WorkspaceConfig workspace; private Author creator; private Policies policies; private Ide ide; private Button button; private Set<FactoryImage> images; private FactoryImplBuilder() {} public FactoryImpl build() { return new FactoryImpl(id, name, version, workspace, creator, policies, ide, button, images); } public FactoryImplBuilder from(FactoryImpl factory) { this.id = factory.getId(); this.name = factory.getName(); this.version = factory.getV(); this.workspace = factory.getWorkspace(); this.creator = factory.getCreator(); this.policies = factory.getPolicies(); this.ide = factory.getIde(); this.button = factory.getButton(); this.images = factory.getImages(); return this; } public FactoryImplBuilder generateId() { id = NameGenerator.generate("", 16); return this; } public FactoryImplBuilder setId(String id) { this.id = id; return this; } public FactoryImplBuilder setName(String name) { this.name = name; return this; } public FactoryImplBuilder setVersion(String version) { this.version = version; return this; } public FactoryImplBuilder setWorkspace(WorkspaceConfig workspace) { this.workspace = workspace; return this; } public FactoryImplBuilder setCreator(Author creator) { this.creator = creator; return this; } public FactoryImplBuilder setPolicies(Policies policies) { this.policies = policies; return this; } public FactoryImplBuilder setIde(Ide ide) { this.ide = ide; return this; } public FactoryImplBuilder setButton(Button button) { this.button = button; return this; } public FactoryImplBuilder setImages(Set<FactoryImage> images) { this.images = images; return this; } } }