package com.tesora.dve.sql.schema;
/*
* #%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.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import com.tesora.dve.common.catalog.CatalogEntity;
import com.tesora.dve.common.catalog.DynamicGroupClass;
import com.tesora.dve.common.catalog.DynamicPolicy;
import com.tesora.dve.common.catalog.IDynamicPolicy;
import com.tesora.dve.exceptions.PEException;
import com.tesora.dve.sql.schema.cache.SchemaCacheKey;
public class PEPolicy extends Persistable<PEPolicy, DynamicPolicy> implements IDynamicPolicy {
private boolean strict;
private LinkedHashMap<PolicyClass,PEPolicyClassConfig> classes;
public PEPolicy(SchemaContext pc, Name name, boolean strict, List<PEPolicyClassConfig> givenClasses) {
super(getPolicyKey(name.getUnquotedName().get()));
this.strict = strict;
this.classes = new LinkedHashMap<PolicyClass, PEPolicyClassConfig>();
if (givenClasses != null) {
for(PEPolicyClassConfig pepcc : givenClasses) {
classes.put(pepcc.getPolicyClass(), pepcc);
}
}
setName(name);
}
public boolean isStrict() {
return strict;
}
public void setStrict(boolean v) {
strict = v;
}
public Collection<PEPolicyClassConfig> getPolicyClasses() {
return classes.values();
}
public PEPolicyClassConfig getConfig(PolicyClass pc) {
return classes.get(pc);
}
public void replacePolicy(PEPolicyClassConfig newConfig) {
PEPolicyClassConfig existing = classes.get(newConfig.getPolicyClass());
if (existing != null)
newConfig.mergeDefaultsFrom(existing);
classes.put(newConfig.getPolicyClass(),newConfig);
}
public void replacePolicy(List<PEPolicyClassConfig> ncs) {
for(PEPolicyClassConfig p : ncs)
replacePolicy(p);
}
public static PEPolicy load(DynamicPolicy dp, SchemaContext sc) {
PEPolicy pep = (PEPolicy)sc.getLoaded(dp,getPolicyKey(dp.getName()));
if (pep == null)
pep= new PEPolicy(dp, sc);
return pep;
}
private PEPolicy(DynamicPolicy pers, SchemaContext sc) {
super(getPolicyKey(pers.getName()));
sc.startLoading(this,pers);
setName(new UnqualifiedName(pers.getName()));
classes = new LinkedHashMap<PolicyClass, PEPolicyClassConfig>();
if (pers.getAggregationClass() != null)
classes.put(PolicyClass.AGGREGATE,new PEPolicyClassConfig(PolicyClass.AGGREGATE, pers.getAggregationClass()));
if (pers.getSmallClass() != null)
classes.put(PolicyClass.SMALL,new PEPolicyClassConfig(PolicyClass.SMALL, pers.getSmallClass()));
if (pers.getMediumClass() != null)
classes.put(PolicyClass.MEDIUM, new PEPolicyClassConfig(PolicyClass.MEDIUM, pers.getMediumClass()));
if (pers.getLargeClass() != null)
classes.put(PolicyClass.LARGE,new PEPolicyClassConfig(PolicyClass.LARGE, pers.getLargeClass()));
strict = pers.getStrict();
setPersistent(sc, pers, pers.getId());
sc.finishedLoading(this, pers);
}
@Override
protected Class<? extends CatalogEntity> getPersistentClass() {
return DynamicPolicy.class;
}
@Override
protected DynamicPolicy lookup(SchemaContext sc) throws PEException {
return sc.getCatalog().findPolicy(getName().get());
}
@Override
protected DynamicPolicy createEmptyNew(SchemaContext sc) throws PEException {
return new DynamicPolicy();
}
@Override
protected void populateNew(SchemaContext sc, DynamicPolicy p) throws PEException {
updateExisting(sc,p);
}
@Override
protected void updateExisting(SchemaContext sc, DynamicPolicy p) throws PEException {
p.setName(getName().get());
p.setStrict(isStrict());
for(PEPolicyClassConfig c : classes.values()) {
if (c.getPolicyClass() == PolicyClass.AGGREGATE) {
p.setAggregationClass(c.update(p.getAggregationClass()));
} else if (c.getPolicyClass() == PolicyClass.SMALL) {
p.setSmallClass(c.update(p.getSmallClass()));
} else if (c.getPolicyClass() == PolicyClass.MEDIUM) {
p.setMediumClass(c.update(p.getMediumClass()));
} else if (c.getPolicyClass() == PolicyClass.LARGE) {
p.setLargeClass(c.update(p.getLargeClass()));
}
}
}
@Override
protected Persistable<PEPolicy, DynamicPolicy> load(SchemaContext sc, DynamicPolicy p)
throws PEException {
return null;
}
@Override
protected int getID(DynamicPolicy p) {
return p.getId();
}
@Override
protected String getDiffTag() {
return "POLICY";
}
public static SchemaCacheKey<?> getPolicyKey(String n) {
return new PolicyCacheKey(n);
}
private static class PolicyCacheKey extends SchemaCacheKey<PEPolicy> {
/**
*
*/
private static final long serialVersionUID = 1L;
// uniquely identified by name
private final String name;
public PolicyCacheKey(String n) {
super();
name = n;
}
@Override
public int hashCode() {
return initHash(PolicyCacheKey.class,name.hashCode());
}
@Override
public boolean equals(Object o) {
if (o instanceof PolicyCacheKey) {
PolicyCacheKey ock = (PolicyCacheKey) o;
return name.equals(ock.name);
}
return false;
}
@Override
public PEPolicy load(SchemaContext sc) {
DynamicPolicy dp = sc.getCatalog().findPolicy(name);
if (dp == null) return null;
return PEPolicy.load(dp, sc);
}
@Override
public String toString() {
return "PEPolicy:" + name;
}
}
@Override
public DynamicGroupClass getAggregationClass() {
return getGroupClass(PolicyClass.AGGREGATE);
}
@Override
public DynamicGroupClass getSmallClass() {
return getGroupClass(PolicyClass.SMALL);
}
@Override
public DynamicGroupClass getMediumClass() {
return getGroupClass(PolicyClass.MEDIUM);
}
@Override
public DynamicGroupClass getLargeClass() {
return getGroupClass(PolicyClass.LARGE);
}
private DynamicGroupClass getGroupClass(PolicyClass pc) {
PEPolicyClassConfig configured = classes.get(pc);
if (configured == null) return null;
return configured.getDynamicClass();
}
@Override
public boolean getStrict() {
return strict;
}
}