/******************************************************************************* * Copyright (c) 2016 EfficiOS Inc., Philippe Proulx * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.tracecompass.internal.lttng2.kernel.core; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.Lttng27EventLayout; import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module.LamiAnalysis; import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module.LamiAnalysisFactoryException; import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module.LamiAnalysisFactoryFromConfigFile; import org.eclipse.tracecompass.lttng2.kernel.core.trace.LttngKernelTrace; import org.eclipse.tracecompass.tmf.core.analysis.ondemand.OnDemandAnalysisManager; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; /** * Loader of LTTng analyses. * * @author Philippe Proulx */ final class LttngAnalysesLoader { private static final String CONFIG_DIR_NAME = "lttng-analyses-configs"; //$NON-NLS-1$ private LttngAnalysesLoader() { } private static boolean appliesTo(ITmfTrace trace) { /* LTTng-Analysis is supported only on LTTng >= 2.7 kernel traces */ if (trace instanceof LttngKernelTrace) { final LttngKernelTrace kernelTrace = (LttngKernelTrace) trace; final IKernelAnalysisEventLayout layout = kernelTrace.getKernelEventLayout(); if (layout instanceof Lttng27EventLayout) { return true; } } return false; } private static String[] getAnalysisNames() throws IOException { final ClassLoader loader = LttngAnalysesLoader.class.getClassLoader(); final String path = "/" + CONFIG_DIR_NAME + "/index.properties"; //$NON-NLS-1$ //$NON-NLS-2$ final String[] names = new String[0]; final Properties indexProps = new Properties(); try (final InputStream in = loader.getResourceAsStream(path)) { if (in == null) { return names; } indexProps.load(in); } String analyses = indexProps.getProperty("analyses"); //$NON-NLS-1$ if (analyses == null) { return names; } analyses = analyses.trim(); return analyses.split("\\s+"); //$NON-NLS-1$ } public static void load() throws LamiAnalysisFactoryException, IOException { final String[] names = getAnalysisNames(); final ClassLoader loader = LttngAnalysesLoader.class.getClassLoader(); for (final String name : names) { final String path = String.format("/%s/%s.properties", CONFIG_DIR_NAME, name); //$NON-NLS-1$ try (final InputStream in = loader.getResourceAsStream(path)) { if (in == null) { continue; } final LamiAnalysis analysis = LamiAnalysisFactoryFromConfigFile.buildFromInputStream(in, false, LttngAnalysesLoader::appliesTo); OnDemandAnalysisManager.getInstance().registerAnalysis(analysis); } } } }