/*
* #%L
* model
* %%
* Copyright (C) 2012 - 2015 valdasraps
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/lgpl-3.0.html>.
* #L%
*/
package lt.emasina.resthub.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@XmlRootElement
@Entity
@Getter @Setter @ToString
@EqualsAndHashCode(callSuper = true, of = { "namespace", "name" })
@Table(name = "HUB_TABLE", uniqueConstraints = {
@UniqueConstraint(columnNames = {"NAMESPACE", "NAME"})})
public class MdTable extends MdEntity {
public static final int ETERNAL_CACHE_TIME = -1;
public static final int SKIP_CACHE_TIME = 0;
public static final int DEFAULT_CACHE_TIME = 120;
public static final int DEFAULT_HIT_COUNT = 1;
public static final int DEFAULT_TIME_OUT = 30;
public static final int MAX_ROWS_LIMIT = 10000;
public static final int DEFAULT_ROWS_LIMIT = MAX_ROWS_LIMIT;
@Basic
@Column(name = "NAMESPACE", nullable = false, length = 30)
@XmlElement(name = "NAMESPACE", required = true)
private String namespace;
@Basic
@Column(name = "NAME", nullable = false, length = 30)
@XmlElement(name = "NAME", required = true)
private String name;
@Basic
@Lob
@Column(name = "SQL_VALUE", nullable = false)
@XmlElement(name = "SQL", required = true)
private String sql;
@Basic
@Column(name = "CACHE_TIME", nullable = false)
@XmlAttribute(name = "CACHE_TIME")
private Integer cacheTime = DEFAULT_CACHE_TIME;
@Basic
@Column(name = "HIT_COUNT", nullable = false)
@XmlAttribute(name = "HIT_COUNT")
private Integer hitCount = DEFAULT_HIT_COUNT;
@Basic
@Column(name = "TIME_OUT", nullable = false)
@XmlAttribute(name = "TIME_OUT")
private Integer timeout = DEFAULT_TIME_OUT;
@Basic
@Column(name = "ROWS_LIMIT", nullable = false)
@XmlAttribute(name = "ROWS_LIMIT")
private Integer rowsLimit = DEFAULT_ROWS_LIMIT;
@Basic
@Column(name = "CONNECTION_NAME", nullable = false, length = 30)
@XmlAttribute(name = "CONNECTION_NAME", required = true)
private String connectionName;
@OneToMany(mappedBy = "table", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@OrderBy("number ASC")
@XmlElementWrapper(name = "COLUMNS")
@XmlElement(name = "COLUMN")
private List<MdColumn> columns = new ArrayList<>();
@OneToMany(mappedBy = "table", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@OrderBy("name ASC")
@XmlElementWrapper(name = "PARAMETERS")
@XmlElement(name = "PARAMETER")
private List<MdParameter> parameters = new ArrayList<>();
public String getNamespace() {
return normalizeName(namespace);
}
public String getName() {
return normalizeName(name);
}
private String normalizeName(String nameCandidate) {
if (nameCandidate != null) {
StringBuilder sb = new StringBuilder();
for (char c: nameCandidate.toLowerCase().toCharArray()) {
if (Character.isJavaIdentifierPart(c)) {
sb.append(c);
}
}
return sb.toString();
}
return null;
}
}