package com.tesora.dve.common.catalog;
/*
* #%L
* Tesora Inc.
* Database Virtualization Engine
* %%
* Copyright (C) 2011 - 2014 Tesora Inc.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.sql.Types;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import com.tesora.dve.common.PEConstants;
import com.tesora.dve.exceptions.PEException;
import com.tesora.dve.resultset.ColumnSet;
import com.tesora.dve.resultset.ResultRow;
import com.tesora.dve.variables.VariableValueConverter;
@Entity
@Table(name="dynamic_policy")
public class DynamicPolicy implements CatalogEntity, IDynamicPolicy {
private static final long serialVersionUID = 1L;
public static final String AGGREGATION = PEConstants.AGGREGATION;
public static final String SMALL = PEConstants.SMALL;
public static final String MEDIUM = PEConstants.MEDIUM;
public static final String LARGE = PEConstants.LARGE;
public static final String STRICT = PEConstants.STRICT;
@Id
@GeneratedValue
@Column( name="policy_id" )
int id;
@Column(name="name",nullable=false)
String name;
@Column(name="strict", nullable=false)
boolean strict;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="provider",column=@Column(name="aggregate_provider")),
@AttributeOverride(name="className",column=@Column(name="aggregate_class")),
@AttributeOverride(name="count",column=@Column(name="aggregate_count"))
})
DynamicGroupClass aggregationClass;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="provider",column=@Column(name="small_provider")),
@AttributeOverride(name="className",column=@Column(name="small_class")),
@AttributeOverride(name="count",column=@Column(name="small_count"))
})
DynamicGroupClass smallClass;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="provider",column=@Column(name="medium_provider")),
@AttributeOverride(name="className",column=@Column(name="medium_class")),
@AttributeOverride(name="count",column=@Column(name="medium_count"))
})
DynamicGroupClass mediumClass;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="provider",column=@Column(name="large_provider")),
@AttributeOverride(name="className",column=@Column(name="large_class")),
@AttributeOverride(name="count",column=@Column(name="large_count"))
})
DynamicGroupClass largeClass;
private transient ColumnSet showColumnSet = null;
public DynamicPolicy() {
}
public DynamicPolicy(String name, boolean strict,
String aggProvider, String aggClass, int aggCount,
String smallProvider, String smallClass, int smallCount,
String mediumProvider, String mediumClass, int mediumCount,
String largeProvider, String largeClass, int largeCount) {
super();
this.name = name;
this.strict = strict;
this.smallClass = new DynamicGroupClass(SMALL, smallProvider, smallClass, smallCount);
this.aggregationClass = new DynamicGroupClass(AGGREGATION, aggProvider, aggClass, aggCount);
this.mediumClass = new DynamicGroupClass(MEDIUM, mediumProvider, mediumClass, mediumCount);
this.largeClass = new DynamicGroupClass(LARGE, largeProvider, largeClass, largeCount);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public ColumnSet getShowColumnSet(CatalogQueryOptions cqo)
throws PEException {
if (showColumnSet == null) {
showColumnSet = new ColumnSet();
showColumnSet.addColumn("Name", 255, "varchar", Types.VARCHAR);
showColumnSet.addColumn("Config", 255, "varchar", Types.VARCHAR);
}
return showColumnSet;
}
@Override
public ResultRow getShowResultRow(CatalogQueryOptions cqo)
throws PEException {
ResultRow rr = new ResultRow();
rr.addResultColumn(getName());
rr.addResultColumn(getConfigString());
return rr;
}
@Override
public void removeFromParent() throws Throwable {
}
@Override
public List<? extends CatalogEntity> getDependentEntities(CatalogDAO c)
throws Throwable {
return Collections.emptyList();
}
public DynamicGroupClass getAggregationClass() {
return aggregationClass;
}
public void setAggregationClass(DynamicGroupClass aggregationClass) {
this.aggregationClass = aggregationClass;
}
public DynamicGroupClass getSmallClass() {
return smallClass;
}
public void setSmallClass(DynamicGroupClass smallClass) {
this.smallClass = smallClass;
}
public DynamicGroupClass getMediumClass() {
return mediumClass;
}
public void setMediumClass(DynamicGroupClass mediumClass) {
this.mediumClass = mediumClass;
}
public DynamicGroupClass getLargeClass() {
return largeClass;
}
public void setLargeClass(DynamicGroupClass largeClass) {
this.largeClass = largeClass;
}
public boolean getStrict() {
return strict;
}
public void setStrict(boolean strict) {
this.strict = strict;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.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;
DynamicPolicy other = (DynamicPolicy) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int getId() {
return id;
}
public static DynamicPolicy parse(String name, Properties props) throws PEException {
DynamicPolicy ndp = new DynamicPolicy();
ndp.setName(name);
ndp.parse(props);
return ndp;
}
public static DynamicPolicy parse(String name, String configVal) throws PEException {
DynamicPolicy ndp = new DynamicPolicy();
ndp.setName(name);
ndp.parse(configVal);
return ndp;
}
public void parse(Properties props) throws PEException {
String val = props.getProperty(DynamicPolicy.AGGREGATION);
if (val == null)
throw new PEException("'" + DynamicPolicy.AGGREGATION + "' property not specified");
setAggregationClass(new DynamicGroupClass(DynamicPolicy.AGGREGATION, val));
val = props.getProperty(DynamicPolicy.SMALL);
if (val == null)
throw new PEException("'" + DynamicPolicy.SMALL + "' property not specified");
setSmallClass(new DynamicGroupClass(DynamicPolicy.SMALL, val));
val = props.getProperty(DynamicPolicy.MEDIUM);
if (val == null)
throw new PEException("'" + DynamicPolicy.MEDIUM + "' property not specified");
setMediumClass(new DynamicGroupClass(DynamicPolicy.MEDIUM, val));
val = props.getProperty(DynamicPolicy.LARGE);
if (val == null)
throw new PEException("'" + DynamicPolicy.LARGE + "' property not specified");
setLargeClass(new DynamicGroupClass(DynamicPolicy.LARGE, val));
val = props.getProperty(DynamicPolicy.STRICT);
boolean bVal = true;
if(val != null) {
bVal = VariableValueConverter.toInternalBoolean(val);
}
setStrict(bVal);
}
public void parse(String configVal) throws PEException {
StringReader reader = new StringReader(configVal);
Properties props = new Properties();
try {
props.load(reader);
} catch (IOException ioe) {
throw new PEException("Invalid format for configuration",ioe);
}
parse(props);
}
// undoes what the previous two methods do
public Properties toProperties() {
Properties props = new Properties();
props.setProperty(DynamicPolicy.AGGREGATION, getAggregationClass().buildConfigString());
props.setProperty(DynamicPolicy.SMALL, getSmallClass().buildConfigString());
props.setProperty(DynamicPolicy.MEDIUM, getMediumClass().buildConfigString());
props.setProperty(DynamicPolicy.LARGE, getLargeClass().buildConfigString());
props.setProperty(DynamicPolicy.STRICT, VariableValueConverter.toExternalString(getStrict()));
return props;
}
public String getConfigString() throws PEException {
// blech, can't use the store method on properties - always emits the date
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
try {
pw.println(DynamicPolicy.AGGREGATION + "=" + getAggregationClass().buildConfigString());
pw.println(DynamicPolicy.SMALL + "=" + getSmallClass().buildConfigString());
pw.println(DynamicPolicy.MEDIUM + "=" + getMediumClass().buildConfigString());
pw.println(DynamicPolicy.LARGE + "=" + getLargeClass().buildConfigString());
pw.println(DynamicPolicy.STRICT + "=" + getStrict());
pw.close();
sw.close();
} catch (IOException ioe) {
throw new PEException("Unable to build configuration format",ioe);
}
return sw.toString();
}
// used in alter support - just take the types
public void take(DynamicPolicy otherPolicy) throws PEException {
setAggregationClass(otherPolicy.getAggregationClass());
setSmallClass(otherPolicy.getSmallClass());
setMediumClass(otherPolicy.getMediumClass());
setLargeClass(otherPolicy.getLargeClass());
setStrict(otherPolicy.getStrict());
}
@Override
public void onUpdate() {
}
@Override
public void onDrop() {
}
}