TimePlugin.java

package progen.output.plugins;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import progen.context.ProGenContext;

/**
 * Plugin que calcula la diferencia entre tiempos determinados.
 * 
 * @author jirsis
 * @since 2.0
 * 
 */
public class TimePlugin implements MacroPlugin {

  /** Colección de plugins que componen el macro plugin de cáculo de tiempo. */
  private List<Plugin> plugins;

  /** Representación del nombre del plugin. */
  private String name;

  /**
   * Constructor que recibe como parámetro el nombre del tiempo que calculará.
   * 
   * @param name
   *          El nombre del tiempo que calculará.
   */
  public TimePlugin(String name) {
    this.name = name;
    plugins = new ArrayList<Plugin>();
  }

  @Override
  @SuppressWarnings("rawtypes")
  public void addValue(Comparable value) {
    for (Plugin plugin : plugins) {
      plugin.addValue(value);
    }
  }

  @Override
  public HashMap<String, Object> getValue() {
    final HashMap<String, Object> values = new HashMap<String, Object>();
    for (Plugin plugin : plugins) {
      values.put(plugin.getName(), plugin.getValue());
    }
    return values;
  }

  @Override
  public void initialValue() {
    for (Plugin plugin : plugins) {
      plugin.initialValue();
    }
  }

  @Override
  public String getName() {
    return name;
  }

  @Override
  public int getPriority() {
    int priority = 0;
    for (Plugin plugin : plugins) {
      priority = Math.max(0, plugin.getPriority());
    }
    return priority;
  }

  @Override
  public void initPlugin(String propertyFamily) {
    final String [] pluginsName = ProGenContext.getOptionalProperty(propertyFamily + "." + getName() + ".enable", "Mean, Total").trim().split(",[ ]*");
    Plugin plugin;
    for (int i = 0; i < pluginsName.length; i++) {
      try {
        plugin = (Plugin) Class.forName("progen.output.plugins." + pluginsName[i]).newInstance();
        this.addPlugin(plugins, plugin);
      } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
        throw new UnknownPluginException(getName() + ": " + pluginsName[i], e);
      }
    }
  }

  @Override
  public Plugin getPlugin(String name) {
    Plugin plugin = null;
    if (getName().compareTo(name) == 0) {
      plugin = this;
    } else {
      for (Plugin pluginFound : plugins) {
        if (pluginFound.getName().compareTo(name) == 0) {
          plugin = pluginFound;
        }
      }
    }
    if (plugin == null) {
      plugin = new NullPlugin();
    }

    return plugin;
  }

  @Override
  public void checkDependeces(List<Plugin> pluginCollection) {
    // do nothing
  }

  /**
   * Es una operación idempotente, es decir, si se añaden <i>n</i> veces el mismo
   * plugin, sólo se añadirá una única vez.
   */
  @Override
  public void addPlugin(List<Plugin> pluginsCollection, Plugin plugin) {
    Plugin alreadyDefined = null;
    for (Plugin pluginDefined : plugins) {
      if (pluginDefined.getName().compareTo(plugin.getName()) == 0) {
        alreadyDefined = pluginDefined;
      }
    }

    if (alreadyDefined == null) {
      plugins.add(plugin);
    }
  }

  @Override
  public List<Plugin> getPlugins() {
    return plugins;
  }

}