package io.ebeaninternal.server.deploy.parse;
import io.ebeaninternal.server.deploy.InheritInfo;
import java.lang.reflect.Modifier;
import javax.persistence.DiscriminatorType;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
public class DeployInheritInfo {
private static final String DEFAULT_COLUMN_NAME = "dtype";
private String discriminatorStringValue;
private Object discriminatorObjectValue;
private int columnType;
private String columnName;
private int columnLength;
private String columnDefn;
private final Class<?> type;
private Class<?> parent;
private final ArrayList<DeployInheritInfo> children = new ArrayList<>();
DeployInheritInfo(Class<?> type) {
this.type = type;
}
public Class<?> getType() {
return type;
}
public Class<?> getParent() {
return parent;
}
public void setParent(Class<?> parent) {
this.parent = parent;
}
public boolean isAbstract() {
return Modifier.isAbstract(type.getModifiers());
}
public boolean isRoot() {
return parent == null;
}
public List<DeployInheritInfo> children() {
return children;
}
public void addChild(DeployInheritInfo childInfo) {
children.add(childInfo);
}
public String getColumnName(InheritInfo parent) {
if (columnName == null) {
if (parent == null) {
columnName = DEFAULT_COLUMN_NAME;
} else {
columnName = parent.getDiscriminatorColumn();
}
}
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public int getColumnLength(InheritInfo parent) {
if (columnLength == 0) {
if (parent == null) {
columnLength = 31;
} else {
columnLength = parent.getColumnLength();
}
}
return columnLength;
}
public int getDiscriminatorType(InheritInfo parent) {
if (columnType == 0) {
if (parent == null) {
columnType = Types.VARCHAR;
} else {
columnType = parent.getDiscriminatorType();
}
}
return columnType;
}
void setColumnType(DiscriminatorType type) {
if (type == DiscriminatorType.INTEGER) {
this.columnType = Types.INTEGER;
} else {
this.columnType = Types.VARCHAR;
}
}
void setColumnDefn(String columnDefn) {
this.columnDefn = columnDefn;
}
public String getColumnDefn() {
return columnDefn;
}
void setColumnLength(int columnLength) {
this.columnLength = columnLength;
}
public Object getDiscriminatorObjectValue() {
return discriminatorObjectValue;
}
public String getDiscriminatorStringValue() {
return discriminatorStringValue;
}
public void setDiscriminatorDefaultValue(Class<?> cls) {
if (columnType == Types.INTEGER) {
discriminatorStringValue = "0";
discriminatorObjectValue = 0;
} else {
discriminatorStringValue = cls.getSimpleName();
discriminatorObjectValue = discriminatorStringValue;
}
}
void setDiscriminatorValue(String value) {
if (value != null) {
value = value.trim();
if (!value.isEmpty()) {
discriminatorStringValue = value;
if (columnType == Types.INTEGER) {
this.discriminatorObjectValue = Integer.valueOf(value);
} else {
this.discriminatorObjectValue = value;
}
}
}
}
public String getWhere() {
List<Object> discList = new ArrayList<>();
appendDiscriminator(discList);
return buildWhereLiteral(discList);
}
private void appendDiscriminator(List<Object> list) {
if (!isAbstract()) {
list.add(discriminatorObjectValue);
}
for (DeployInheritInfo child : children) {
child.appendDiscriminator(list);
}
}
private String buildWhereLiteral(List<Object> discList) {
int size = discList.size();
if (size == 0) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(columnName);
if (size == 1) {
sb.append(" = ");
} else {
sb.append(" in (");
}
for (int i = 0; i < discList.size(); i++) {
appendSqlLiteralValue(i, discList.get(i), sb);
}
if (size > 1) {
sb.append(")");
}
return sb.toString();
}
private void appendSqlLiteralValue(int count, Object value, StringBuilder sb) {
if (count > 0) {
sb.append(",");
}
if (value instanceof String) {
sb.append("'").append(value).append("'");
} else {
sb.append(value);
}
}
@Override
public String toString() {
return "InheritInfo[" + type.getName() + "]" + " root[" + parent.getName() + "]" + " disValue[" + discriminatorStringValue + "]";
}
}