package com.intrbiz.bergamot.model; import java.io.Serializable; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.UUID; import com.intrbiz.Util; import com.intrbiz.bergamot.config.model.NamedObjectCfg; import com.intrbiz.bergamot.config.model.TemplatedObjectCfg; import com.intrbiz.bergamot.data.BergamotDB; import com.intrbiz.bergamot.model.adapter.BergamotCfgAdapter; import com.intrbiz.configuration.Configuration; import com.intrbiz.data.db.compiler.meta.Action; import com.intrbiz.data.db.compiler.meta.SQLColumn; import com.intrbiz.data.db.compiler.meta.SQLForeignKey; import com.intrbiz.data.db.compiler.meta.SQLPrimaryKey; import com.intrbiz.data.db.compiler.meta.SQLTable; import com.intrbiz.data.db.compiler.meta.SQLVersion; /** * An alert which was raised against a check */ @SQLTable(schema = BergamotDB.class, name = "config", since = @SQLVersion({ 1, 0, 0 })) public class Config implements Serializable { private static final long serialVersionUID = 1L; @SQLColumn(index = 1, name = "id", since = @SQLVersion({ 1, 0, 0 })) @SQLPrimaryKey() protected UUID id; @SQLColumn(index = 2, name = "site_id", since = @SQLVersion({ 1, 0, 0 })) @SQLForeignKey(references = Site.class, on = "id", onDelete = Action.CASCADE, onUpdate = Action.RESTRICT, since = @SQLVersion({ 1, 0, 0 })) protected UUID siteId; @SQLColumn(index = 3, name = "type", since = @SQLVersion({ 1, 0, 0 })) protected String type; @SQLColumn(index = 4, name = "name", since = @SQLVersion({ 1, 0, 0 })) protected String name; @SQLColumn(index = 5, name = "template", since = @SQLVersion({ 1, 0, 0 })) protected boolean template; @SQLColumn(index = 6, name = "inherits", type = "TEXT[]", since = @SQLVersion({ 1, 0, 0 })) protected List<String> inherits = new LinkedList<String>(); @SQLColumn(index = 7, name = "summary", since = @SQLVersion({ 1, 0, 0 })) protected String summary; @SQLColumn(index = 8, name = "description", since = @SQLVersion({ 1, 0, 0 })) protected String description; @SQLColumn(index = 9, name = "configuration", type = "TEXT", adapter = BergamotCfgAdapter.class, since = @SQLVersion({ 1, 0, 0 })) protected Configuration configuration; @SQLColumn(index = 10, name = "required_templates", type = "TEXT[]", since = @SQLVersion({ 1, 0, 0 })) protected List<String> requiredTemplates = new LinkedList<String>(); public Config() { super(); } public Config(UUID id, UUID siteId, NamedObjectCfg<?> configuration) { super(); this.id = id; this.siteId = siteId; this.fromConfiguration(configuration); } public Config fromConfiguration(NamedObjectCfg<?> configuration) { this.type = Configuration.getRootElement(configuration.getClass()); this.name = configuration.getName(); this.template = configuration.getTemplateBooleanValue(); this.inherits = new LinkedList<String>(configuration.getInheritedTemplates()); this.summary = Util.coalesceEmpty(configuration.getSummary(), Util.ucFirst(this.name)); this.description = configuration.getDescription(); this.configuration = configuration; // compute the templates used by this configuration Set<String> requireTemplateSet = new HashSet<String>(); for (String inherit : this.inherits) { requireTemplateSet.add(getObjectQualifiedName(this.type, inherit)); } for (TemplatedObjectCfg<?> child : configuration.getTemplatedChildObjects()) { for (String inherit : child.getInheritedTemplates()) { requireTemplateSet.add(getObjectQualifiedName(Configuration.getRootElement(child.getClass()), inherit)); } } this.requiredTemplates = new LinkedList<String>(requireTemplateSet); return this; } public UUID getSiteId() { return siteId; } public void setSiteId(UUID siteId) { this.siteId = siteId; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getQualifiedName() { return this.getType() + ":" + this.getName(); } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Configuration getConfiguration() { return configuration; } public void setConfiguration(Configuration configuration) { this.configuration = configuration; } @SuppressWarnings({ "unchecked", "rawtypes" }) public Configuration getResolvedConfiguration() { if (this.configuration != null) { try (BergamotDB db = BergamotDB.connect()) { db.getConfigResolver(this.siteId).computeInheritenance((TemplatedObjectCfg) this.configuration); } } return configuration; } public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } public boolean isTemplate() { return template; } public void setTemplate(boolean template) { this.template = template; } public List<String> getInherits() { return inherits; } public void setInherits(List<String> inherits) { this.inherits = inherits; } public List<String> getRequiredTemplates() { return requiredTemplates; } public void setRequiredTemplates(List<String> requiredTemplates) { this.requiredTemplates = requiredTemplates; } public List<Config> listDependents() { try (BergamotDB db = BergamotDB.connect()) { return db.listDependentConfig(this.getSiteId(), getObjectQualifiedName(this.getType(), this.getName())); } } public List<Config> listAllDependentsObjects() { try (BergamotDB db = BergamotDB.connect()) { return db.listAllDependentConfigObjects(this.getSiteId(), getObjectQualifiedName(this.getType(), this.getName())); } } public static final String getObjectQualifiedName(NamedObjectCfg<?> object) { if (object == null || object.getName() == null) throw new NullPointerException("Object is null or has no name!"); return Configuration.getRootElement(object.getClass()) + ":" + object.getName(); } public static final String getObjectQualifiedName(String type, String name) { return type + ":" + name; } }