tmf: Provide a static method to retrieve state systems
authorAlexandre Montplaisir <alexmonthy@voxpopuli.im>
Tue, 13 May 2014 21:55:21 +0000 (17:55 -0400)
committerAlexandre Montplaisir <alexmonthy@voxpopuli.im>
Mon, 14 Jul 2014 21:55:02 +0000 (17:55 -0400)
This new method in TmfStateSystemAnalysisModule will:

- Null check the analysis module, so callers don't all have to do it.
- Start the execution of the module, if required (calling schedule()
  after it has already been started is a no-op).
- Avoid exposing a ITmfAnalysisModule object, which is Closeable
  because it holds disposable resources.

This fixes a bunch of the new potential leaks warnings (actually, it
isolates them in one place). Eventually the analysis module API might
have to be reworked, to either never expose the analysis module objects
publicly, or to separate the "accessor" objects from the ones holding
the resources.

Change-Id: I693d233f02a8f53c49c5dc429a84c098bd35f004
Signed-off-by: Alexandre Montplaisir <alexmonthy@voxpopuli.im>
Reviewed-on: https://git.eclipse.org/r/26487
Reviewed-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Tested-by: Hudson CI
org.eclipse.linuxtools.lttng2.kernel.core/src/org/eclipse/linuxtools/lttng2/kernel/core/analysis/LttngKernelAnalysisModule.java
org.eclipse.linuxtools.lttng2.kernel.core/src/org/eclipse/linuxtools/lttng2/kernel/core/cpuusage/LttngKernelCpuUsageAnalysis.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowEntry.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowPresentationProvider.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowView.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/cpuusage/CpuUsageComposite.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesEntry.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesPresentationProvider.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/statesystem/TmfStateSystemAnalysisModule.java

index bb93ae1e85aaa7f13b8bf855b998bf8b5c7d3e5f..3d27e7931fd5df6864c6d0fb154e9913b12af845 100644 (file)
@@ -35,11 +35,10 @@ public class LttngKernelAnalysisModule extends TmfStateSystemAnalysisModule {
     /**
      * The file name of the History Tree
      */
-    @NonNull
-    public static final String HISTORY_TREE_FILE_NAME = "stateHistory.ht"; //$NON-NLS-1$
+    public static final @NonNull String HISTORY_TREE_FILE_NAME = "stateHistory.ht"; //$NON-NLS-1$
 
     /** The ID of this analysis module */
-    public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.analysis"; //$NON-NLS-1$
+    public static final @NonNull String ID = "org.eclipse.linuxtools.lttng2.kernel.analysis"; //$NON-NLS-1$
 
     /*
      * TODO: Decide which events should be mandatory for the analysis, once the
index 0021d70819731d70c2e74c6f5a69218bc00700df..eb6da69f05380663c9d57b598aa6122ebc2eb055 100644 (file)
@@ -29,6 +29,7 @@ import org.eclipse.linuxtools.statesystem.core.exceptions.TimeRangeException;
 import org.eclipse.linuxtools.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateProvider;
 import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 
 /**
  * This analysis module computes the CPU usage of a system from a kernel trace.
@@ -85,17 +86,12 @@ public class LttngKernelCpuUsageAnalysis extends TmfStateSystemAnalysisModule {
         Map<String, Long> map = new HashMap<>();
         Map<String, Long> totalMap = new HashMap<>();
 
+        ITmfTrace trace = getTrace();
         ITmfStateSystem cpuSs = getStateSystem();
-        if (cpuSs == null) {
+        if (trace == null || cpuSs == null) {
             return map;
         }
-        TmfStateSystemAnalysisModule module = getTrace().getAnalysisModuleOfClass(TmfStateSystemAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
-            return map;
-        }
-        module.schedule();
-        module.waitForInitialization();
-        ITmfStateSystem kernelSs = module.getStateSystem();
+        ITmfStateSystem kernelSs = TmfStateSystemAnalysisModule.getStateSystem(trace, LttngKernelAnalysisModule.ID);
         if (kernelSs == null) {
             return map;
         }
index 598deee1c145dcbb75b4fec8f1962dcc8f791b68..01145fd372b42572afa7c87d5354f323107e3ebb 100644 (file)
@@ -13,6 +13,7 @@
 
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
 
@@ -21,7 +22,7 @@ import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
  */
 public class ControlFlowEntry extends TimeGraphEntry {
 
-    private final ITmfTrace fTrace;
+    private final @NonNull ITmfTrace fTrace;
     private final int fThreadId;
     private final int fParentThreadId;
     private final int fThreadQuark;
@@ -44,7 +45,7 @@ public class ControlFlowEntry extends TimeGraphEntry {
      * @param endTime
      *            The end time of this process
      */
-    public ControlFlowEntry(int quark, ITmfTrace trace, String execName, int threadId, int parentThreadId, long startTime, long endTime) {
+    public ControlFlowEntry(int quark, @NonNull ITmfTrace trace, String execName, int threadId, int parentThreadId, long startTime, long endTime) {
         super(execName, startTime, endTime);
         fTrace = trace;
         fThreadId = threadId;
@@ -66,7 +67,7 @@ public class ControlFlowEntry extends TimeGraphEntry {
      *
      * @return the entry's trace
      */
-    public ITmfTrace getTrace() {
+    public @NonNull ITmfTrace getTrace() {
         return fTrace;
     }
 
index e554e0d93831c91902bbeca12da0453ac8cd88ff..22fa932dc0321a5f3cf459009f671bbc47b1bbcf 100644 (file)
@@ -29,6 +29,7 @@ import org.eclipse.linuxtools.statesystem.core.exceptions.StateValueTypeExceptio
 import org.eclipse.linuxtools.statesystem.core.exceptions.TimeRangeException;
 import org.eclipse.linuxtools.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.statesystem.core.statevalue.ITmfStateValue;
+import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
@@ -127,11 +128,7 @@ public class ControlFlowPresentationProvider extends TimeGraphPresentationProvid
             return retMap;
         }
         ControlFlowEntry entry = (ControlFlowEntry) event.getEntry();
-        LttngKernelAnalysisModule module = entry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
-            return retMap;
-        }
-        ITmfStateSystem ssq = module.getStateSystem();
+        ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(entry.getTrace(), LttngKernelAnalysisModule.ID);
         if (ssq == null) {
             return retMap;
         }
@@ -188,11 +185,7 @@ public class ControlFlowPresentationProvider extends TimeGraphPresentationProvid
             return;
         }
         ControlFlowEntry entry = (ControlFlowEntry) event.getEntry();
-        LttngKernelAnalysisModule module = entry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
-            return;
-        }
-        ITmfStateSystem ss = module.getStateSystem();
+        ITmfStateSystem ss = TmfStateSystemAnalysisModule.getStateSystem(entry.getTrace(), LttngKernelAnalysisModule.ID);
         if (ss == null) {
             return;
         }
index 3bbd30ca991056ff451469aa084464ad561daa1b..ae93cb99910d9f7b89aba86eba5c5480740cc01d 100644 (file)
@@ -35,6 +35,7 @@ import org.eclipse.linuxtools.statesystem.core.exceptions.StateValueTypeExceptio
 import org.eclipse.linuxtools.statesystem.core.exceptions.TimeRangeException;
 import org.eclipse.linuxtools.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.statesystem.core.statevalue.ITmfStateValue;
+import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.core.trace.TmfTraceManager;
 import org.eclipse.linuxtools.tmf.ui.views.timegraph.AbstractTimeGraphView;
@@ -221,13 +222,10 @@ public class ControlFlowView extends AbstractTimeGraphView {
 
     @Override
     protected void buildEventList(final ITmfTrace trace, ITmfTrace parentTrace, IProgressMonitor monitor) {
-        LttngKernelAnalysisModule module = trace.getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
+        if (trace == null) {
             return;
         }
-        module.schedule();
-        module.waitForInitialization();
-        ITmfStateSystem ssq = module.getStateSystem();
+        ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(trace, LttngKernelAnalysisModule.ID);
         if (ssq == null) {
             return;
         }
@@ -370,11 +368,7 @@ public class ControlFlowView extends AbstractTimeGraphView {
 
     private void buildStatusEvents(ITmfTrace trace, ControlFlowEntry entry, IProgressMonitor monitor, long start, long end) {
         if (start < entry.getEndTime() && end > entry.getStartTime()) {
-            LttngKernelAnalysisModule module = entry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-            if (module == null) {
-                return;
-            }
-            ITmfStateSystem ssq = module.getStateSystem();
+            ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(entry.getTrace(), LttngKernelAnalysisModule.ID);
             if (ssq == null) {
                 return;
             }
@@ -413,11 +407,7 @@ public class ControlFlowView extends AbstractTimeGraphView {
         if (realEnd <= realStart) {
             return null;
         }
-        LttngKernelAnalysisModule module = entry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
-            return null;
-        }
-        ITmfStateSystem ssq = module.getStateSystem();
+        ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(entry.getTrace(), LttngKernelAnalysisModule.ID);
         if (ssq == null) {
             return null;
         }
@@ -472,11 +462,10 @@ public class ControlFlowView extends AbstractTimeGraphView {
             if (thread > 0) {
                 break;
             }
-            LttngKernelAnalysisModule module = trace.getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-            if (module == null) {
+            if (trace == null) {
                 continue;
             }
-            ITmfStateSystem ssq = module.getStateSystem();
+            ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(trace, LttngKernelAnalysisModule.ID);
             if (ssq == null) {
                 continue;
             }
@@ -530,11 +519,10 @@ public class ControlFlowView extends AbstractTimeGraphView {
             return list;
         }
         for (ITmfTrace trace : traces) {
-            LttngKernelAnalysisModule module = trace.getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-            if (module == null) {
+            if (trace == null) {
                 continue;
             }
-            ITmfStateSystem ssq = module.getStateSystem();
+            ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(trace, LttngKernelAnalysisModule.ID);
             if (ssq == null) {
                 continue;
             }
index 8a5c5de5aef91030dc23bc3986853fa916e65f59..a56b3f3e83d49e4ad7464eb77b2cf0b2fe64dae2 100644 (file)
@@ -31,6 +31,7 @@ import org.eclipse.linuxtools.statesystem.core.exceptions.StateSystemDisposedExc
 import org.eclipse.linuxtools.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.statesystem.core.statevalue.ITmfStateValue;
 import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.ui.viewers.tree.AbstractTmfTreeViewer;
 import org.eclipse.linuxtools.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider;
 import org.eclipse.linuxtools.tmf.ui.viewers.tree.ITmfTreeViewerEntry;
@@ -260,16 +261,11 @@ public class CpuUsageComposite extends AbstractTmfTreeViewer {
         if (execName != null) {
             return execName;
         }
-        TmfStateSystemAnalysisModule module = getTrace().getAnalysisModuleOfClass(TmfStateSystemAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
+        ITmfTrace trace = getTrace();
+        if (trace == null) {
             return tid;
         }
-        /*
-         * Do not schedule the analysis here. It should have been executed when
-         * the CPU usage analysis was executed. If it's not available, there
-         * might be a good reason (disk space?) so don't force it.
-         */
-        ITmfStateSystem kernelSs = module.getStateSystem();
+        ITmfStateSystem kernelSs = TmfStateSystemAnalysisModule.getStateSystem(trace, LttngKernelAnalysisModule.ID);
         if (kernelSs == null) {
             return tid;
         }
index a4769b801ebbe04e95b49c6df3867adda8578a45..c7a8aee7e7af617af202af868d9b8e386eeb542a 100644 (file)
@@ -13,6 +13,7 @@
 
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources;
 
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
@@ -37,7 +38,7 @@ public class ResourcesEntry extends TimeGraphEntry implements Comparable<ITimeGr
     }
 
     private final int fId;
-    private final ITmfTrace fTrace;
+    private final @NonNull ITmfTrace fTrace;
     private final Type fType;
     private final int fQuark;
 
@@ -59,7 +60,8 @@ public class ResourcesEntry extends TimeGraphEntry implements Comparable<ITimeGr
      * @param id
      *            The id of this entry
      */
-    public ResourcesEntry(int quark, ITmfTrace trace, String name, long startTime, long endTime, Type type, int id) {
+    public ResourcesEntry(int quark, @NonNull ITmfTrace trace, String name,
+            long startTime, long endTime, Type type, int id) {
         super(name, startTime, endTime);
         fId = id;
         fTrace = trace;
@@ -81,7 +83,8 @@ public class ResourcesEntry extends TimeGraphEntry implements Comparable<ITimeGr
      * @param id
      *            The id of this entry
      */
-    public ResourcesEntry(ITmfTrace trace, String name, long startTime, long endTime, int id) {
+    public ResourcesEntry(@NonNull ITmfTrace trace, String name,
+            long startTime, long endTime, int id) {
         this(-1, trace, name, startTime, endTime, Type.NULL, id);
     }
 
@@ -101,7 +104,8 @@ public class ResourcesEntry extends TimeGraphEntry implements Comparable<ITimeGr
      * @param id
      *            The id of this entry
      */
-    public ResourcesEntry(int quark, ITmfTrace trace, long startTime, long endTime, Type type, int id) {
+    public ResourcesEntry(int quark, @NonNull ITmfTrace trace,
+            long startTime, long endTime, Type type, int id) {
         this(quark, trace, type.toString() + " " + id, startTime, endTime, type, id); //$NON-NLS-1$
     }
 
@@ -119,7 +123,7 @@ public class ResourcesEntry extends TimeGraphEntry implements Comparable<ITimeGr
      *
      * @return the entry's trace
      */
-    public ITmfTrace getTrace() {
+    public @NonNull ITmfTrace getTrace() {
         return fTrace;
     }
 
index 43956d184985051bbdf72f7b76afd88b5562bc51..8d9cd995eebd18ce75b9989b362f1c6e3caae052 100644 (file)
@@ -30,6 +30,7 @@ import org.eclipse.linuxtools.statesystem.core.exceptions.StateValueTypeExceptio
 import org.eclipse.linuxtools.statesystem.core.exceptions.TimeRangeException;
 import org.eclipse.linuxtools.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.statesystem.core.statevalue.ITmfStateValue;
+import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
@@ -157,11 +158,7 @@ public class ResourcesPresentationProvider extends TimeGraphPresentationProvider
             ResourcesEntry entry = (ResourcesEntry) event.getEntry();
 
             if (tcEvent.hasValue()) {
-                LttngKernelAnalysisModule module = entry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-                if (module == null) {
-                    return retMap;
-                }
-                ITmfStateSystem ss = module.getStateSystem();
+                ITmfStateSystem ss = TmfStateSystemAnalysisModule.getStateSystem(entry.getTrace(), LttngKernelAnalysisModule.ID);
                 if (ss == null) {
                     return retMap;
                 }
@@ -290,11 +287,7 @@ public class ResourcesPresentationProvider extends TimeGraphPresentationProvider
             return;
         }
 
-        LttngKernelAnalysisModule module = entry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
-            return;
-        }
-        ITmfStateSystem ss = module.getStateSystem();
+        ITmfStateSystem ss = TmfStateSystemAnalysisModule.getStateSystem(entry.getTrace(), LttngKernelAnalysisModule.ID);
         if (ss == null) {
             return;
         }
index 5a4ac5e04a9a8d4b4cde3bb2b6b3e7c0d920d984..1d4df72dd24e8700b0b8d768bbb4a8f3a3d9896b 100644 (file)
@@ -31,6 +31,7 @@ import org.eclipse.linuxtools.statesystem.core.exceptions.StateSystemDisposedExc
 import org.eclipse.linuxtools.statesystem.core.exceptions.StateValueTypeException;
 import org.eclipse.linuxtools.statesystem.core.exceptions.TimeRangeException;
 import org.eclipse.linuxtools.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.linuxtools.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 import org.eclipse.linuxtools.tmf.ui.views.timegraph.AbstractTimeGraphView;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
@@ -93,13 +94,10 @@ public class ResourcesView extends AbstractTimeGraphView {
 
     @Override
     protected void buildEventList(ITmfTrace trace, ITmfTrace parentTrace, IProgressMonitor monitor) {
-        LttngKernelAnalysisModule module = trace.getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
+        if (trace == null) {
             return;
         }
-        module.schedule();
-        module.waitForInitialization();
-        ITmfStateSystem ssq = module.getStateSystem();
+        ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(trace, LttngKernelAnalysisModule.ID);
         if (ssq == null) {
             return;
         }
@@ -197,11 +195,7 @@ public class ResourcesView extends AbstractTimeGraphView {
             long startTime, long endTime, long resolution,
             IProgressMonitor monitor) {
         ResourcesEntry resourcesEntry = (ResourcesEntry) entry;
-        LttngKernelAnalysisModule module = resourcesEntry.getTrace().getAnalysisModuleOfClass(LttngKernelAnalysisModule.class, LttngKernelAnalysisModule.ID);
-        if (module == null) {
-            return null;
-        }
-        ITmfStateSystem ssq = module.getStateSystem();
+        ITmfStateSystem ssq = TmfStateSystemAnalysisModule.getStateSystem(resourcesEntry.getTrace(), LttngKernelAnalysisModule.ID);
         if (ssq == null) {
             return null;
         }
index 516fb134b139bb5bda01d6bd59cdce2050efa7df..17f8fa57b64440fa7bbc9286cb29c4bebd6db3f7 100644 (file)
@@ -84,6 +84,37 @@ public abstract class TmfStateSystemAnalysisModule extends TmfAbstractAnalysisMo
         PARTIAL
     }
 
+
+    /**
+     * Retrieve a state system belonging to trace, by passing the ID of the
+     * relevant analysis module.
+     *
+     * This will start the execution of the analysis module, and start the
+     * construction of the state system, if needed.
+     *
+     * @param trace
+     *            The trace for which you want the state system
+     * @param moduleId
+     *            The ID of the state system analysis module
+     * @return The state system, or null if there was no match
+     * @since 3.1
+     */
+    public static @Nullable ITmfStateSystem getStateSystem(ITmfTrace trace, String moduleId) {
+        TmfStateSystemAnalysisModule module =
+                trace.getAnalysisModuleOfClass(TmfStateSystemAnalysisModule.class, moduleId);
+        if (module != null) {
+            module.schedule();
+            module.waitForInitialization();
+            /*
+             * FIXME If we keep a reference to "module", the compiler expects us to
+             * close it. The Analysis Module's API should be reworked to not expose
+             * these objects directly (utility classes instead?)
+             */
+            return module.getStateSystem();
+        }
+        return null;
+    }
+
     /**
      * Get the state provider for this analysis module
      *
This page took 0.043752 seconds and 5 git commands to generate.