package com.intrbiz.bergamot.model;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
import com.intrbiz.Util;
import com.intrbiz.bergamot.config.model.ClusterCfg;
import com.intrbiz.bergamot.data.BergamotDB;
import com.intrbiz.bergamot.model.message.ClusterMO;
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 cluster of resources spanning many hosts
*/
@SQLTable(schema = BergamotDB.class, name = "cluster", since = @SQLVersion({ 1, 0, 0 }))
@SQLUnique(name = "name_unq", columns = { "site_id", "name" })
public class Cluster extends VirtualCheck<ClusterMO, ClusterCfg>
{
private static final long serialVersionUID = 1L;
public Cluster()
{
super();
}
@Override
public void configure(ClusterCfg configuration, ClusterCfg resolvedConfiguration)
{
super.configure(configuration, resolvedConfiguration);
}
@Override
public String getType()
{
return "cluster";
}
public List<Resource> getResources()
{
try (BergamotDB db = BergamotDB.connect())
{
return db.getResourcesOnCluster(getId());
}
}
public List<Resource> getResourcesForContact(Contact contact)
{
try (BergamotDB db = BergamotDB.connect())
{
return contact.hasPermission("read", db.getResourcesOnCluster(getId()));
}
}
public void addResource(Resource resource)
{
try (BergamotDB db = BergamotDB.connect())
{
db.addResourceToCluster(this, resource);
}
}
public void removeResource(Resource resource)
{
try (BergamotDB db = BergamotDB.connect())
{
db.removeResourceFromCluster(this, resource);
}
}
public Resource getResource(String name)
{
try (BergamotDB db = BergamotDB.connect())
{
return db.getResourceOnCluster(this.getId(), name);
}
}
public Collection<Category<Resource>> getCategorisedResources()
{
Map<String, Category<Resource>> categories = new TreeMap<String, Category<Resource>>();
for (Resource resource : this.getResources())
{
// get the category for this service
String categoryTag = Util.coalesceEmpty(resource.resolveCategory(), "default");
Category<Resource> category = categories.get(categoryTag.toLowerCase());
if (category == null)
{
category = new Category<Resource>(categoryTag);
categories.put(categoryTag.toLowerCase(), category);
}
// by application too?
String applicationTag = resource.resolveApplication();
if (applicationTag == null) category.addCheck(resource);
else category.getOrAddApplication(applicationTag).addCheck(resource);
}
return categories.values();
}
public Collection<Category<Resource>> getCategorisedResourcesForContact(Contact contact)
{
Map<String, Category<Resource>> categories = new TreeMap<String, Category<Resource>>();
for (Resource resource : this.getResourcesForContact(contact))
{
// get the category for this service
String categoryTag = Util.coalesceEmpty(resource.resolveCategory(), "default");
Category<Resource> category = categories.get(categoryTag.toLowerCase());
if (category == null)
{
category = new Category<Resource>(categoryTag);
categories.put(categoryTag.toLowerCase(), category);
}
// by application too?
String applicationTag = resource.resolveApplication();
if (applicationTag == null) category.addCheck(resource);
else category.getOrAddApplication(applicationTag).addCheck(resource);
}
return categories.values();
}
@Override
public ClusterMO toMO(Contact contact, EnumSet<MOFlag> options)
{
ClusterMO mo = new ClusterMO();
super.toMO(mo, contact, options);
if (options.contains(MOFlag.RESOURCES)) mo.setResources(this.getResources().stream().filter((x) -> contact == null || contact.hasPermission("read", x)).map((x) -> x.toStubMO(contact)).collect(Collectors.toList()));
return mo;
}
public String toString()
{
return "Cluster (" + this.id + ") " + this.name;
}
}