
net.anotheria.moskito.webui.producers.api.ProducerAPIImpl Maven / Gradle / Ivy
package net.anotheria.moskito.webui.producers.api;
import net.anotheria.anoplass.api.APIException;
import net.anotheria.anoplass.api.APIInitException;
import net.anotheria.moskito.core.decorators.DecoratorRegistryFactory;
import net.anotheria.moskito.core.decorators.IDecorator;
import net.anotheria.moskito.core.decorators.IDecoratorRegistry;
import net.anotheria.moskito.core.inspection.Inspectable;
import net.anotheria.moskito.core.producers.IStats;
import net.anotheria.moskito.core.producers.IStatsProducer;
import net.anotheria.moskito.core.registry.IProducerFilter;
import net.anotheria.moskito.core.registry.IProducerRegistryAPI;
import net.anotheria.moskito.core.registry.ProducerRegistryAPIFactory;
import net.anotheria.moskito.core.stats.TimeUnit;
import net.anotheria.moskito.core.tracer.TracerRepository;
import net.anotheria.moskito.core.tracer.TracingAwareProducer;
import net.anotheria.moskito.webui.Features;
import net.anotheria.moskito.webui.producers.api.filters.ProducerFilter;
import net.anotheria.moskito.webui.shared.api.AbstractMoskitoAPIImpl;
import net.anotheria.moskito.webui.util.DecoratorConfig;
import net.anotheria.moskito.webui.util.ProducerFilterConfig;
import net.anotheria.moskito.webui.util.WebUIConfig;
import org.configureme.ConfigurationManager;
import org.configureme.annotations.AfterConfiguration;
import org.configureme.annotations.ConfigureMe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* Implementation of the producer api.
*
* @author lrosenberg
* @since 14.02.13 11:49
*/
public class ProducerAPIImpl extends AbstractMoskitoAPIImpl implements ProducerAPI{
private IProducerRegistryAPI producerRegistryAPI;
private IDecoratorRegistry decoratorRegistry = DecoratorRegistryFactory.getDecoratorRegistry();
private volatile List producerFilters;
/**
* Logger.
*/
private static Logger log = LoggerFactory.getLogger(ProducerAPIImpl.class);
/**
* Called after the configuration has been read.
*/
private void apiAfterConfiguration(){
ProducerFilterConfig filterConfig[] = WebUIConfig.getInstance().getFilters();
if (filterConfig==null || filterConfig.length==0)
return;
List newProducerFilters = new ArrayList<>(filterConfig.length);
for (ProducerFilterConfig pfc : filterConfig){
try {
ProducerFilter filter = (ProducerFilter)Class.forName(pfc.getClazzName()).newInstance();
filter.customize(pfc.getParameter());
newProducerFilters.add(filter);
} catch (InstantiationException e) {
log.warn("Can't initialize filter of class "+pfc.getClazzName());
} catch (IllegalAccessException e) {
log.warn("Can't initialize filter of class " + pfc.getClazzName());
} catch (ClassNotFoundException e) {
log.warn("Can't initialize filter of class " + pfc.getClazzName());
}
}
DecoratorConfig[] decoratorConfigs = WebUIConfig.getInstance().getDecorators();
if (decoratorConfigs != null){
log.debug("Configuring decorator configs "+ Arrays.toString(decoratorConfigs));
for (DecoratorConfig config : decoratorConfigs){
try{
Class decoratorClass = Class.forName(config.getDecoratorClazzName());
IDecorator decorator = (IDecorator) decoratorClass.newInstance();
DecoratorRegistryFactory.getDecoratorRegistry().addDecorator(config.getStatClazzName(), decorator);
}catch (ClassNotFoundException e){
log.warn("can't configure decorator "+config+" due ", e);
} catch (InstantiationException e) {
log.warn("can't configure decorator " + config + " due ", e);
} catch (IllegalAccessException e) {
log.warn("can't configure decorator "+config+" due ", e);
}
}
}
producerFilters = newProducerFilters;
}
@ConfigureMe(name="moskito-inspect")
public class ConfigurationHook{
@AfterConfiguration public void afterConfiguration(){
apiAfterConfiguration();
}
}
@Override
public void init() throws APIInitException {
super.init();
producerRegistryAPI = new ProducerRegistryAPIFactory().createProducerRegistryAPI();
//force load of configuration.
WebUIConfig.getInstance();
ConfigurationHook configurationHook = new ConfigurationHook();
try{
ConfigurationManager.INSTANCE.configure(configurationHook);
}catch(IllegalArgumentException e){
log.warn("Can't register configuration hook for moskito-inspect.json, re-configuration will not be supported");
}
}
@Override
public List getCategories() {
List categories = producerRegistryAPI.getCategories();
List categoriesAO = new ArrayList(categories.size());
for (String catName : categories){
categoriesAO.add(new UnitCountAO(catName, producerRegistryAPI.getAllProducersByCategory(catName).size()));
}
return categoriesAO;
}
@Override
public List getSubsystems() {
List subsystems = producerRegistryAPI.getSubsystems();
List subsystemsAO = new ArrayList(subsystems.size());
for (String subName : subsystems){
subsystemsAO.add(new UnitCountAO(subName, producerRegistryAPI.getAllProducersBySubsystem(subName).size()));
}
return subsystemsAO;
}
private List convertStatsProducerListToAO(List producers, String intervalName, TimeUnit timeUnit){
LinkedList ret = new LinkedList<>();
for (IStatsProducer p : producers){
ret.add(convertStatsProducerToAO(p, intervalName, timeUnit));
}
return ret;
}
private ProducerAO convertStatsProducerToAO(IStatsProducer extends IStats> p, String intervalName, TimeUnit timeUnit){
return convertStatsProducerToAO(p, intervalName, timeUnit, false);
}
private ProducerAO convertStatsProducerToAO(IStatsProducer extends IStats> p, String intervalName, TimeUnit timeUnit, boolean createAllStats){
ProducerAO ao = new ProducerAO();
ao.setProducerId(p.getProducerId());
ao.setCategory(p.getCategory());
ao.setSubsystem(p.getSubsystem());
ao.setProducerClassName(p.getClass().getSimpleName());
ao.setFullProducerClassName(p.getClass().getName());
if (p instanceof Inspectable)
ao.setCreationInfo(((Inspectable)p).getCreationInfo());
boolean traceable = false;
if (p instanceof TracingAwareProducer){
traceable = ((TracingAwareProducer)p).tracingSupported();
}
ao.setTraceable(traceable);
if (traceable){
ao.setTraced(TracerRepository.getInstance().isTracingEnabledForProducer(p.getProducerId()));
}
IStats firstStats = p.getStats().get(0);
ao.setStatsClazzName(firstStats.getClass().getName());
//ao.setStats(p.getStats());
IDecorator decorator = decoratorRegistry.getDecorator(ao.getStatsClazzName());
ao.setFirstStatsValues(decorator.getValues(firstStats, intervalName, timeUnit));
if (createAllStats){
//if create all stats are set, we have to create all stats, not just the first stat.
List extends IStats> allStats = p.getStats();
for (IStats statObject : allStats){
//lets assume that all stats of the same producer are of the same type.
StatLineAO line = new StatLineAO();
line.setStatName(statObject.getName());
line.setValues(decorator.getValues(statObject, intervalName, timeUnit));
ao.addStatLine(line);
}
}
return ao;
}
private List filterProducersAndConvertToAO(List producers, String intervalName, TimeUnit timeUnit){
List ret = new ArrayList<>();
for (IStatsProducer> p : producers){
boolean mayPass = true;
for (ProducerFilter filter : producerFilters){
if (!filter.mayPass(p)){
mayPass = false;
break;
}
}
if (mayPass)
ret.add(convertStatsProducerToAO(p, intervalName, timeUnit));
}
return ret;
}
@Override
public List getAllProducers(String intervalName, TimeUnit timeUnit) {
if (producerFilters==null || producerFilters.size()==0 || !Features.PRODUCER_FILTERING.isEnabled())
return convertStatsProducerListToAO(producerRegistryAPI.getAllProducers(), intervalName, timeUnit);
List allProducers = producerRegistryAPI.getAllProducers();
return filterProducersAndConvertToAO(allProducers, intervalName, timeUnit);
}
@Override
public List getAllProducersByCategory(String currentCategory, String intervalName, TimeUnit timeUnit) {
if (producerFilters==null || producerFilters.size()==0 || !Features.PRODUCER_FILTERING.isEnabled())
return convertStatsProducerListToAO(producerRegistryAPI.getAllProducersByCategory(currentCategory), intervalName, timeUnit);
return filterProducersAndConvertToAO(producerRegistryAPI.getAllProducersByCategory(currentCategory), intervalName, timeUnit);
}
@Override
public List getAllProducersBySubsystem(String currentSubsystem, String intervalName, TimeUnit timeUnit) {
return convertStatsProducerListToAO(producerRegistryAPI.getAllProducersBySubsystem(currentSubsystem), intervalName, timeUnit);
}
@Override
public List getProducers(IProducerFilter[] iProducerFilters, String intervalName, TimeUnit timeUnit) {
throw new RuntimeException("Not yet implemented");
}
@Override
public ProducerAO getProducer(String producerId, String intervalName, TimeUnit timeUnit) throws APIException {
IStatsProducer producer = producerRegistryAPI.getProducer(producerId);
return convertStatsProducerToAO(producer, intervalName, timeUnit, true);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy