package org.erlide.tracing.core.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Collections; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Plugin; import org.erlide.tracing.core.Activator; import org.erlide.tracing.core.TraceBackend; import org.erlide.tracing.core.mvc.model.TracePattern; import org.erlide.tracing.core.mvc.model.TracedNode; import org.erlide.util.ErlLogger; /** * Class containing helper methods for managing nodes and trace patterns * configurations. It loads loads and saves data in plugins directory (path to * this directory is obtained using {@link Plugin#getStateLocation()}). * * @author Piotr Dorobisz * */ public final class ConfigurationManager { private static String TP_DIR = "trace_patterns"; private static String NODES_DIR = "nodes"; private ConfigurationManager() { } /** * Loads trace patterns configuration. * * @param configName * configuration name * @return loaded trace patterns */ public static TracePattern[] loadTPConfig(final String configName) { final ArrayList<TracePattern> patterns = new ArrayList<>(); final Object[] objects = loadConfiguration(configName, TP_DIR); if (objects != null) { for (final Object object : objects) { patterns.add((TracePattern) object); } } return patterns.toArray(new TracePattern[patterns.size()]); } /** * Loads nodes configuration. * * @param configName * configuration name * @return loaded nodes */ public static TracedNode[] loadNodesConfig(final String configName) { final ArrayList<TracedNode> nodes = new ArrayList<>(); final Object[] objects = loadConfiguration(configName, NODES_DIR); if (objects != null) { for (final Object object : objects) { nodes.add((TracedNode) object); } } return nodes.toArray(new TracedNode[nodes.size()]); } /** * Saves trace patterns configuration under given name. If configuration * with this name does not exist it will be created. Otherwise it will be * overwritten. * * @param configName * @return <code>true</code> if configuration was saved, <code>false</code> * otherwise */ public static boolean saveTPConfig(final String configName) { return saveConfiguration(configName, TP_DIR, TraceBackend.getInstance().getTracePatternsArray()); } /** * Saves nodes configuration under given name. If configuration with this * name does not exist it will be created. Otherwise it will be overwritten. * * @param configName * @return <code>true</code> if configuration was saved, <code>false</code> * otherwise */ public static boolean saveNodesConfig(final String configName) { return saveConfiguration(configName, NODES_DIR, TraceBackend.getInstance().getTracedNodesArray()); } /** * Deletes trace pattern configuration. * * @param configName * configuration name * @return <code>true</code> if configuration was deleted, * <code>false</code> otherwise */ public static boolean removeTPConfig(final String configName) { return removeConfiguration(configName, TP_DIR); } /** * Deletes nodes configuration. * * @param configName * configuration name * @return <code>true</code> if configuration was deleted, * <code>false</code> otherwise */ public static boolean removeNodesConfig(final String configName) { return removeConfiguration(configName, NODES_DIR); } /** * Returns list of all available trace patterns configurations. * * @return list of trace pattern configuration names */ public static String[] getTPConfigs() { return getConfigurationsList(TP_DIR); } /** * Returns list of all available nodes configurations. * * @return list of trace pattern configuration names */ public static String[] getNodesConfig() { return getConfigurationsList(NODES_DIR); } private static Object[] loadConfiguration(final String configName, final String dirName) { final IPath location = Activator.getDefault().getStateLocation().append(dirName) .append(configName); final File file = location.toFile(); if (file.exists() && file.isFile()) { try (final FileInputStream inputStream = new FileInputStream(file); final ObjectInputStream objectInputStream = new ObjectInputStream( inputStream)) { return (Object[]) objectInputStream.readObject(); } catch (final Exception e) { ErlLogger.error(e); } } return null; } private static boolean saveConfiguration(final String configName, final String dirName, final Object configuration) { final IPath location = Activator.getDefault().getStateLocation().append(dirName); final File dir = location.toFile(); if (!dir.exists() && !dir.mkdir()) { return false; } try (final FileOutputStream out = new FileOutputStream( location.append(configName).toFile()); ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);) { objectOutputStream.writeObject(configuration); return true; } catch (final Exception e) { ErlLogger.error(e); } return false; } private static boolean removeConfiguration(final String configName, final String dirName) { final IPath location = Activator.getDefault().getStateLocation().append(dirName) .append(configName); final File file = location.toFile(); if (file.exists() && file.isFile()) { return file.delete(); } return false; } private static String[] getConfigurationsList(final String dirName) { final ArrayList<String> configNames = new ArrayList<>(); final IPath location = Activator.getDefault().getStateLocation().append(dirName); final File dir = location.toFile(); if (dir.exists()) { for (final File file : dir.listFiles()) { if (file.isFile()) { configNames.add(file.getName()); } } } Collections.sort(configNames); return configNames.toArray(new String[configNames.size()]); } }