/*
* Copyright 2014-2016 CyberVision, Inc.
*
* Licensed 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.kaaproject.kaa.server.common.dao.model.sql;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_BODY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_CREATED_TIME;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_CREATED_USERNAME;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_DEFAULT_RECORD;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_JOIN_TABLE_CHILD_FK;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_JOIN_TABLE_CHILD_ID;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_JOIN_TABLE_NAME;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_JOIN_TABLE_PARENT_FK;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_JOIN_TABLE_PARENT_ID;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_FK;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_ID;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_TABLE_NAME;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_UNIQUE_CONSTRAINT;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_VERSION;
import static org.kaaproject.kaa.server.common.dao.model.sql.ModelUtils.getLongId;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaDto;
import org.kaaproject.kaa.server.common.dao.impl.DaoUtil;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = CTL_SCHEMA_TABLE_NAME,
uniqueConstraints =
@UniqueConstraint(columnNames = {CTL_SCHEMA_META_INFO_ID, CTL_SCHEMA_VERSION},
name = CTL_SCHEMA_UNIQUE_CONSTRAINT))
public class CtlSchema extends GenericModel<CTLSchemaDto> implements Serializable {
private static final long serialVersionUID = -1179381742235545494L;
@ManyToOne(optional = true, fetch = FetchType.EAGER)
@JoinColumn(nullable = false, name = CTL_SCHEMA_META_INFO_ID,
foreignKey = @ForeignKey(name = CTL_SCHEMA_META_INFO_FK))
private CtlSchemaMetaInfo metaInfo;
@Column(name = CTL_SCHEMA_VERSION)
private Integer version;
@Lob
@Column(name = CTL_SCHEMA_BODY)
private String body;
@Lob
@Column(name = CTL_SCHEMA_DEFAULT_RECORD)
private String defaultRecord;
@Column(name = CTL_SCHEMA_CREATED_USERNAME)
private String createdUsername;
@Column(name = CTL_SCHEMA_CREATED_TIME)
private long createdTime;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = CTL_SCHEMA_JOIN_TABLE_NAME,
joinColumns = {@JoinColumn(name = CTL_SCHEMA_JOIN_TABLE_PARENT_ID)},
foreignKey = @ForeignKey(name = CTL_SCHEMA_JOIN_TABLE_PARENT_FK),
inverseJoinColumns = {@JoinColumn(name = CTL_SCHEMA_JOIN_TABLE_CHILD_ID)},
inverseForeignKey = @ForeignKey(name = CTL_SCHEMA_JOIN_TABLE_CHILD_FK))
private Set<CtlSchema> dependencySet = new HashSet<>();
public CtlSchema() {
}
public CtlSchema(Long id) {
this.id = id;
}
/**
* Create instance of <code>CtlSchema</code>.
*
* @param dto data transfer object
*/
public CtlSchema(CTLSchemaDto dto) {
this.id = getLongId(dto.getId());
this.metaInfo = new CtlSchemaMetaInfo(dto.getMetaInfo());
this.version = dto.getVersion();
this.createdUsername = dto.getCreatedUsername();
this.createdTime = dto.getCreatedTime();
update(dto);
}
/**
* Update <code>CtlSchema</code> instance, get data from dto.
*
* @param dto data transfer object
*/
public void update(CTLSchemaDto dto) {
this.body = dto.getBody();
this.defaultRecord = dto.getDefaultRecord();
Set<CTLSchemaDto> dependencies = dto.getDependencySet();
if (dependencies != null && !dependencies.isEmpty()) {
for (CTLSchemaDto dependency : dependencies) {
dependencySet.add(new CtlSchema(dependency));
}
}
}
public CtlSchemaMetaInfo getMetaInfo() {
return metaInfo;
}
public void setMetaInfo(CtlSchemaMetaInfo metaInfo) {
this.metaInfo = metaInfo;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getDefaultRecord() {
return defaultRecord;
}
public void setDefaultRecord(String defaultRecord) {
this.defaultRecord = defaultRecord;
}
public Set<CtlSchema> getDependencySet() {
return dependencySet;
}
public void setDependencySet(Set<CtlSchema> dependencySet) {
this.dependencySet = dependencySet;
}
public String getCreatedUsername() {
return createdUsername;
}
public void setCreatedUsername(String createdUsername) {
this.createdUsername = createdUsername;
}
public long getCreatedTime() {
return createdTime;
}
public void setCreatedTime(long createdTime) {
this.createdTime = createdTime;
}
@Override
protected CTLSchemaDto createDto() {
return new CTLSchemaDto();
}
@Override
protected GenericModel<CTLSchemaDto> newInstance(Long id) {
return new CtlSchema(id);
}
@Override
public CTLSchemaDto toDto() {
CTLSchemaDto ctlSchemaDto = createDto();
ctlSchemaDto.setId(getStringId());
ctlSchemaDto.setMetaInfo(metaInfo.toDto());
ctlSchemaDto.setVersion(version);
ctlSchemaDto.setCreatedTime(createdTime);
ctlSchemaDto.setCreatedUsername(createdUsername);
ctlSchemaDto.setBody(body);
ctlSchemaDto.setDefaultRecord(defaultRecord);
ctlSchemaDto.setDependencySet(DaoUtil.convertDtoSet(dependencySet));
return ctlSchemaDto;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((body == null) ? 0 : body.hashCode());
result = prime * result + (int) (createdTime ^ (createdTime >>> 32));
result = prime * result + ((createdUsername == null) ? 0 : createdUsername.hashCode());
result = prime * result + ((defaultRecord == null) ? 0 : defaultRecord.hashCode());
result = prime * result + ((dependencySet == null) ? 0 : dependencySet.hashCode());
result = prime * result + ((metaInfo == null) ? 0 : metaInfo.hashCode());
result = prime * result + ((version == null) ? 0 : version.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
CtlSchema other = (CtlSchema) obj;
if (body == null) {
if (other.body != null) {
return false;
}
} else if (!body.equals(other.body)) {
return false;
}
if (createdTime != other.createdTime) {
return false;
}
if (createdUsername == null) {
if (other.createdUsername != null) {
return false;
}
} else if (!createdUsername.equals(other.createdUsername)) {
return false;
}
if (defaultRecord == null) {
if (other.defaultRecord != null) {
return false;
}
} else if (!defaultRecord.equals(other.defaultRecord)) {
return false;
}
if (dependencySet == null) {
if (other.dependencySet != null) {
return false;
}
} else if (!dependencySet.equals(other.dependencySet)) {
return false;
}
if (metaInfo == null) {
if (other.metaInfo != null) {
return false;
}
} else if (!metaInfo.equals(other.metaInfo)) {
return false;
}
if (version == null) {
if (other.version != null) {
return false;
}
} else if (!version.equals(other.version)) {
return false;
}
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("CtlSchema [metaInfo=");
builder.append(metaInfo);
builder.append(", version=");
builder.append(version);
builder.append(", body=");
builder.append(body);
builder.append(", defaultRecord=");
builder.append(defaultRecord);
builder.append(", createdUsername=");
builder.append(createdUsername);
builder.append(", createdTime=");
builder.append(createdTime);
builder.append(", dependencySet=");
builder.append(dependencySet);
builder.append("]");
return builder.toString();
}
}