blob: 23f916cb40f62be8858dc303864ef8f39d0d2786 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.orm.entities;
import java.util.Collection;
import java.util.Objects;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.UniqueConstraint;
import org.apache.commons.lang.builder.EqualsBuilder;
import com.google.common.base.MoreObjects;
@Entity
@Table(name = "clusterconfig",
uniqueConstraints = {@UniqueConstraint(name = "UQ_config_type_tag", columnNames = {"cluster_id", "type_name", "version_tag"}),
@UniqueConstraint(name = "UQ_config_type_version", columnNames = {"cluster_id", "type_name", "version"})})
@TableGenerator(name = "config_id_generator",
table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_value"
, pkColumnValue = "config_id_seq"
, initialValue = 1
)
@NamedQueries({
@NamedQuery(
name = "ClusterConfigEntity.findNextConfigVersion",
query = "SELECT COALESCE(MAX(clusterConfig.version),0) + 1 as nextVersion FROM ClusterConfigEntity clusterConfig WHERE clusterConfig.type=:configType AND clusterConfig.clusterId=:clusterId"),
@NamedQuery(
name = "ClusterConfigEntity.findAllConfigsByStack",
query = "SELECT clusterConfig FROM ClusterConfigEntity clusterConfig WHERE clusterConfig.clusterId=:clusterId AND clusterConfig.stack=:stack"),
@NamedQuery(
name = "ClusterConfigEntity.findLatestConfigsByStack",
query = "SELECT clusterConfig FROM ClusterConfigEntity clusterConfig WHERE clusterConfig.clusterId = :clusterId AND clusterConfig.stack = :stack AND clusterConfig.selectedTimestamp = (SELECT MAX(clusterConfig2.selectedTimestamp) FROM ClusterConfigEntity clusterConfig2 WHERE clusterConfig2.clusterId=:clusterId AND clusterConfig2.stack=:stack AND clusterConfig2.type = clusterConfig.type)"),
@NamedQuery(
name = "ClusterConfigEntity.findLatestConfigsByStackWithTypes",
query = "SELECT clusterConfig FROM ClusterConfigEntity clusterConfig WHERE clusterConfig.type IN :types AND clusterConfig.clusterId = :clusterId AND clusterConfig.stack = :stack AND clusterConfig.selectedTimestamp = (SELECT MAX(clusterConfig2.selectedTimestamp) FROM ClusterConfigEntity clusterConfig2 WHERE clusterConfig2.clusterId=:clusterId AND clusterConfig2.stack=:stack AND clusterConfig2.type = clusterConfig.type)"),
@NamedQuery(
name = "ClusterConfigEntity.findNotMappedClusterConfigsToService",
query = "SELECT clusterConfig FROM ClusterConfigEntity clusterConfig WHERE clusterConfig.serviceConfigEntities IS EMPTY AND clusterConfig.type != 'cluster-env'"),
@NamedQuery(
name = "ClusterConfigEntity.findEnabledConfigsByStack",
query = "SELECT config FROM ClusterConfigEntity config WHERE config.clusterId = :clusterId AND config.selected = 1 AND config.stack = :stack"),
@NamedQuery(
name = "ClusterConfigEntity.findEnabledConfigByType",
query = "SELECT config FROM ClusterConfigEntity config WHERE config.clusterId = :clusterId AND config.selected = 1 and config.type = :type"),
@NamedQuery(
name = "ClusterConfigEntity.findEnabledConfigsByTypes",
query = "SELECT config FROM ClusterConfigEntity config WHERE config.clusterId = :clusterId AND config.selected = 1 and config.type in :types"),
@NamedQuery(
name = "ClusterConfigEntity.findEnabledConfigs",
query = "SELECT config FROM ClusterConfigEntity config WHERE config.clusterId = :clusterId AND config.selected = 1") })
public class ClusterConfigEntity {
@Id
@Column(name = "config_id")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "config_id_generator")
private Long configId;
@Column(name = "cluster_id", nullable = false, insertable = false, updatable = false, length = 10)
private Long clusterId;
@Column(name = "type_name")
private String type;
@Column(name = "version")
private Long version;
@Column(name = "version_tag")
private String tag;
@Column(name = "selected", insertable = true, updatable = true, nullable = false)
private int selected = 0;
@Basic(fetch = FetchType.LAZY)
@Column(name = "config_data", nullable = false, insertable = true)
@Lob
private String configJson;
@Basic(fetch = FetchType.LAZY)
@Column(name = "config_attributes", nullable = true, insertable = true)
@Lob
private String configAttributesJson;
@Column(name = "create_timestamp", nullable = false, insertable = true, updatable = false)
private long timestamp;
/**
* The most recent time that this configuration was marked as
* {@link #selected}. This is useful when configruations are being reverted
* since a reversion does not create a new instance. Another configuration may
* technically be newer via its creation date ({@link #timestamp}), however
* that does not indicate it was the most recently enabled configuration.
*/
@Column(name = "selected_timestamp", nullable = false, insertable = true, updatable = true)
private long selectedTimestamp = 0;
@ManyToOne
@JoinColumn(name = "cluster_id", referencedColumnName = "cluster_id", nullable = false)
private ClusterEntity clusterEntity;
@OneToMany(mappedBy = "clusterConfigEntity")
private Collection<ConfigGroupConfigMappingEntity> configGroupConfigMappingEntities;
@ManyToMany(mappedBy = "clusterConfigEntities")
private Collection<ServiceConfigEntity> serviceConfigEntities;
@Column(name = "unmapped", nullable = false, insertable = true, updatable = true)
private short unmapped = 0;
/**
* Unidirectional one-to-one association to {@link StackEntity}
*/
@OneToOne
@JoinColumn(name = "stack_id", unique = false, nullable = false, insertable = true, updatable = true)
private StackEntity stack;
public boolean isUnmapped() {
return unmapped != 0;
}
public void setUnmapped(boolean unmapped) {
this.unmapped = (short)(unmapped ? 1 : 0);
}
public Long getConfigId() {
return configId;
}
public void setConfigId(Long configId) {
this.configId = configId;
}
public Long getClusterId() {
return clusterId;
}
public void setClusterId(Long clusterId) {
this.clusterId = clusterId;
}
public String getType() {
return type;
}
public void setType(String typeName) {
type = typeName;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
public String getTag() {
return tag;
}
public void setTag(String versionTag) {
tag = versionTag;
}
public String getData() {
return configJson;
}
public void setData(String data) {
configJson = data;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long stamp) {
timestamp = stamp;
}
public long getSelectedTimestamp() {
return selectedTimestamp;
}
public String getAttributes() {
return configAttributesJson;
}
public void setAttributes(String attributes) {
configAttributesJson = attributes;
}
/**
* Gets the cluster configuration's stack.
*
* @return the stack.
*/
public StackEntity getStack() {
return stack;
}
/**
* Sets the cluster configuration's stack.
*
* @param stack
* the stack to set for the cluster config (not {@code null}).
*/
public void setStack(StackEntity stack) {
this.stack = stack;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
ClusterConfigEntity that = (ClusterConfigEntity) object;
EqualsBuilder equalsBuilder = new EqualsBuilder();
equalsBuilder.append(configId, that.configId);
equalsBuilder.append(clusterId, that.clusterId);
equalsBuilder.append(type, that.type);
equalsBuilder.append(tag, that.tag);
equalsBuilder.append(stack, that.stack);
return equalsBuilder.isEquals();
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return Objects.hash(configId, clusterId, type, tag, stack);
}
public ClusterEntity getClusterEntity() {
return clusterEntity;
}
public void setClusterEntity(ClusterEntity clusterEntity) {
this.clusterEntity = clusterEntity;
}
public Collection<ConfigGroupConfigMappingEntity> getConfigGroupConfigMappingEntities() {
return configGroupConfigMappingEntities;
}
public void setConfigGroupConfigMappingEntities(Collection<ConfigGroupConfigMappingEntity> configGroupConfigMappingEntities) {
this.configGroupConfigMappingEntities = configGroupConfigMappingEntities;
}
public Collection<ServiceConfigEntity> getServiceConfigEntities() {
return serviceConfigEntities;
}
public void setServiceConfigEntities(Collection<ServiceConfigEntity> serviceConfigEntities) {
this.serviceConfigEntities = serviceConfigEntities;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("clusterId", clusterId)
.add("type", type)
.add("version", version)
.add("tag", tag)
.add("selected", selected == 1)
.add("selectedTimeStamp", selectedTimestamp)
.add("created", timestamp)
.toString();
}
public boolean isSelected() {
return selected == 1;
}
public void setSelected(boolean selected) {
this.selected = selected ? 1 : 0;
// if this config is being selected, then also update the selected timestamp
if (selected) {
selectedTimestamp = System.currentTimeMillis();
}
}
}