/* * Copyright (c) 2005-2010 KOM – Multimedia Communications Lab * * This file is part of PeerfactSim.KOM. * * PeerfactSim.KOM is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * PeerfactSim.KOM 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PeerfactSim.KOM. If not, see . * */ package de.tud.kom.p2psim.impl.analyzer.metric; import java.io.Writer; import java.util.LinkedList; import java.util.List; import de.tud.kom.p2psim.api.scenario.ConfigurationException; import de.tudarmstadt.maki.simonstrator.api.Host; import de.tudarmstadt.maki.simonstrator.api.Monitor; import de.tudarmstadt.maki.simonstrator.api.Oracle; import de.tudarmstadt.maki.simonstrator.api.Monitor.Level; import de.tudarmstadt.maki.simonstrator.api.common.metric.Metric; import de.tudarmstadt.maki.simonstrator.api.common.metric.MetricFilter; import de.tudarmstadt.maki.simonstrator.api.common.metric.MetricOutput; import de.tudarmstadt.maki.simonstrator.api.component.core.MonitorComponent.Analyzer; /** * The base analyzer that is to be configured in the Monitor-part if * {@link Metric}s are to be used. The Metrics themselves are configured as children via setMetric. * * @author Bjoern Richerzhagen * @version 1.0, 07.08.2012 */ public class MetricAnalyzer implements Analyzer { private static boolean initialized = false; private static final List> metrics = new LinkedList>(); private static final List outputs = new LinkedList(); private static final List filters = new LinkedList(); public MetricAnalyzer() { if (initialized) { throw new ConfigurationException( "Only one Metric-Analyzer is allowed!"); } initialized = true; } @Override public void start() { assert initialized; List hosts = Oracle.getAllHosts(); if (hosts.isEmpty()) { throw new ConfigurationException( "The MetricAnalyzer needs the GlobalOracle!"); } for (Metric metric : metrics) { metric.initialize(hosts); } for (MetricFilter filter : filters) { filter.initialize(metrics, hosts); metrics.addAll(filter.getOutputMetrics()); } for (MetricOutput output : outputs) { output.initialize(metrics); } } @Override public void stop(Writer output) { assert initialized; for (MetricFilter filter : filters) { filter.onStop(); } for (MetricOutput outputChannel : outputs) { outputChannel.onStop(); } } /** * True, if the analyzer is configured and ready * * @return */ public static boolean isInitialized() { return initialized; } /** * Adds a metric * * @param metric */ public static void setMetric(Metric metric) { if (!initialized) { throw new ConfigurationException("Analyzer not configured!"); } metrics.add(metric); } /** * Retrieve a metric, or null if the metric does not exist * * @param name * @return */ public static Metric getMetric(String name) { if (!initialized) { throw new ConfigurationException("Analyzer not configured!"); } for (Metric metric : metrics) { if (metric.getName().equals(name)) { return metric; } } // Print list of metrics to help the developer. Monitor.log(MetricAnalyzer.class, Level.WARN, "You requested metric '"+name+"', which was not found. Available metrics are: %s", metrics); return null; } /** * Retrieve all metrics * * @return */ public static List> getMetrics() { return metrics; } /** * Adds an ouput channel * * @param output */ public static void setOutput(MetricOutput output) { if (!initialized) { throw new ConfigurationException("Analyzer not configured!"); } outputs.add(output); } /** * Adds a filter * * @param filter */ public static void setFilter(MetricFilter filter) { if (!initialized) { throw new ConfigurationException("Analyzer not configured!"); } filters.add(filter); } }