package com.intrbiz.bergamot.model; import java.util.EnumSet; import java.util.UUID; import com.intrbiz.Util; import com.intrbiz.bergamot.config.model.ResourceCfg; import com.intrbiz.bergamot.data.BergamotDB; import com.intrbiz.bergamot.model.message.ResourceMO; import com.intrbiz.data.db.compiler.meta.SQLColumn; import com.intrbiz.data.db.compiler.meta.SQLTable; import com.intrbiz.data.db.compiler.meta.SQLUnique; import com.intrbiz.data.db.compiler.meta.SQLVersion; /** * A resource of a cluster, which is provided by multiple services */ @SQLTable(schema = BergamotDB.class, name = "resource", since = @SQLVersion({ 1, 0, 0 })) @SQLUnique(name = "host_name_unq", columns = {"cluster_id", "name"}) public class Resource extends VirtualCheck<ResourceMO, ResourceCfg> { private static final long serialVersionUID = 1L; @SQLColumn(index = 1, name = "cluster_id", since = @SQLVersion({ 1, 0, 0 })) private UUID clusterId; @SQLColumn(index = 2, name = "category", since = @SQLVersion({ 2, 5, 0 })) private String category; @SQLColumn(index = 3, name = "application", since = @SQLVersion({ 2, 5, 0 })) private String application; public Resource() { super(); } @Override public void configure(ResourceCfg configuration, ResourceCfg resolvedConfiguration) { super.configure(configuration, resolvedConfiguration); this.category = resolvedConfiguration.getCategory(); this.application = resolvedConfiguration.getApplication(); } @Override public String getType() { return "resource"; } public UUID getClusterId() { return this.clusterId; } public void setClusterId(UUID clusterId) { this.clusterId = clusterId; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getApplication() { return application; } public void setApplication(String application) { this.application = application; } /** * Resolve the category tag for this Resource * @return the category tag or null is not specified */ public String resolveCategory() { if (! Util.isEmpty(this.getCategory())) return this.getCategory(); return null; } /** * Resolve the application tag for this Resource * @return the application tag or null is not specified */ public String resolveApplication() { if (! Util.isEmpty(this.getApplication())) return this.getApplication(); return null; } public Cluster getCluster() { try (BergamotDB db = BergamotDB.connect()) { return db.getCluster(this.getClusterId()); } } public String toString() { return "Resource (" + this.id + ") " + this.name + " on cluster " + (this.getCluster() == null ? "null" : this.getCluster().getName()); } @Override public ResourceMO toMO(Contact contact, EnumSet<MOFlag> options) { ResourceMO mo = new ResourceMO(); super.toMO(mo, contact, options); mo.setCategory(this.resolveCategory()); mo.setApplication(this.resolveApplication()); if (options.contains(MOFlag.CLUSTER)) { Cluster cluster = this.getCluster(); if (cluster != null && (contact == null || contact.hasPermission("read", cluster))) mo.setCluster(cluster.toStubMO(contact)); } return mo; } }