Commit | Line | Data |
---|---|---|
d90ae2a5 RK |
1 | /******************************************************************************* |
2 | * Copyright (c) 2016 Movidius Inc. and others | |
3 | * | |
4 | * All rights reserved. This program and the accompanying materials | |
5 | * are made available under the terms of the Eclipse Public License v1.0 | |
6 | * which accompanies this distribution, and is available at | |
7 | * http://www.eclipse.org/legal/epl-v10.html | |
8 | * | |
9 | *******************************************************************************/ | |
10 | ||
11 | package org.eclipse.tracecompass.tmf.ui.symbols; | |
12 | ||
13 | import java.lang.ref.WeakReference; | |
14 | import java.util.ArrayList; | |
15 | import java.util.Comparator; | |
16 | import java.util.List; | |
17 | import java.util.Map; | |
18 | import java.util.WeakHashMap; | |
19 | ||
20 | import org.eclipse.core.runtime.CoreException; | |
21 | import org.eclipse.core.runtime.IConfigurationElement; | |
22 | import org.eclipse.core.runtime.Platform; | |
23 | import org.eclipse.jdt.annotation.NonNull; | |
24 | import org.eclipse.tracecompass.internal.tmf.ui.Activator; | |
25 | import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; | |
26 | ||
a54f9c9d MK |
27 | import com.google.common.collect.ImmutableList; |
28 | ||
d90ae2a5 RK |
29 | /** |
30 | * This class offer services around the | |
31 | * <code>org.eclipse.tracecompass.tmf.ui.symbolProvider</code> extension point. | |
32 | * | |
33 | * @author Robert Kiss | |
34 | * @since 2.0 | |
37c87032 MK |
35 | * @deprecated use |
36 | * {@link org.eclipse.tracecompass.tmf.core.symbols.SymbolProviderManager} | |
37 | * instead | |
d90ae2a5 | 38 | */ |
37c87032 | 39 | @Deprecated |
d90ae2a5 RK |
40 | public final class SymbolProviderManager { |
41 | ||
42 | /** | |
43 | * The singleton instance of this manager | |
44 | */ | |
45 | private static SymbolProviderManager INSTANCE; | |
46 | ||
47 | private static final String EXTENSION_POINT_ID = "org.eclipse.tracecompass.tmf.ui.symbolProvider"; //$NON-NLS-1$ | |
48 | private static final String ELEM_NAME_PROVIDER = "providerFactory"; //$NON-NLS-1$ | |
49 | private static final String ATTR_CLASS = "class"; //$NON-NLS-1$ | |
50 | private static final String ATTR_PRIORITY = "priority"; //$NON-NLS-1$ | |
51 | ||
52 | private final List<SymbolProviderFactoryWrapper> fProviders; | |
53 | ||
54 | private final Map<ITmfTrace, WeakReference<ISymbolProvider>> fInstances = new WeakHashMap<>(); | |
55 | ||
56 | /** | |
57 | * Internal class used to store extension point information | |
58 | * | |
59 | */ | |
60 | private static class SymbolProviderFactoryWrapper { | |
61 | ||
62 | public final ISymbolProviderFactory factory; | |
63 | public final int priority; | |
64 | ||
65 | private SymbolProviderFactoryWrapper(ISymbolProviderFactory factory, int priority) { | |
66 | this.factory = factory; | |
67 | this.priority = priority; | |
68 | ||
69 | } | |
70 | ||
71 | } | |
72 | ||
73 | /** | |
a54f9c9d | 74 | * Get the instance of the {@link SymbolProviderManager} |
37c87032 | 75 | * |
d90ae2a5 RK |
76 | * @return the singleton instance of this class |
77 | */ | |
78 | @SuppressWarnings("null") | |
79 | public static synchronized @NonNull SymbolProviderManager getInstance() { | |
80 | if (INSTANCE == null) { | |
a54f9c9d MK |
81 | List<@NonNull SymbolProviderFactoryWrapper> providers = new ArrayList<>(); |
82 | IConfigurationElement[] configElements = Platform.getExtensionRegistry().getConfigurationElementsFor(EXTENSION_POINT_ID); | |
83 | for (IConfigurationElement element : configElements) { | |
84 | if (ELEM_NAME_PROVIDER.equals(element.getName())) { | |
85 | try { | |
86 | Object extension = element.createExecutableExtension(ATTR_CLASS); | |
87 | int priority = 0; | |
88 | try { | |
89 | priority = Integer.parseInt(element.getAttribute(ATTR_PRIORITY)); | |
90 | } catch (NumberFormatException e) { | |
91 | // safe to ignore | |
92 | } | |
93 | providers.add(new SymbolProviderFactoryWrapper((ISymbolProviderFactory) extension, priority)); | |
94 | } catch (CoreException | ClassCastException e) { | |
95 | Activator.getDefault().logError("Exception while loading extensions", e); //$NON-NLS-1$ | |
96 | } | |
97 | } | |
98 | } | |
99 | /* | |
100 | * Those with a higher priority need to be on top | |
101 | * | |
102 | * Note: we cannot simply sort by negative priority because | |
4c089034 | 103 | * (-Integer.MIN_VAL) == Integer.MIN_VAL |
a54f9c9d | 104 | */ |
4c089034 | 105 | providers.sort(Comparator.<SymbolProviderFactoryWrapper> comparingInt(o -> o.priority).reversed()); |
a54f9c9d | 106 | INSTANCE = new SymbolProviderManager(providers); |
d90ae2a5 RK |
107 | } |
108 | return INSTANCE; | |
109 | } | |
110 | ||
111 | /** | |
112 | * The private constructor of this manager | |
113 | */ | |
a54f9c9d MK |
114 | private SymbolProviderManager(@NonNull List<@NonNull SymbolProviderFactoryWrapper> providers) { |
115 | fProviders = ImmutableList.copyOf(providers); | |
d90ae2a5 RK |
116 | } |
117 | ||
118 | /** | |
119 | * Locate an {@link ISymbolProvider} capable to resolve symbols from the | |
120 | * given trace. If no such provider is defined an instance of | |
121 | * {@link DefaultSymbolProvider} will be returned | |
122 | * | |
123 | * @param trace | |
124 | * The trace to create a provider for | |
125 | * @return a valid {@link ISymbolProvider}, never null | |
126 | */ | |
127 | public @NonNull ISymbolProvider getSymbolProvider(@NonNull ITmfTrace trace) { | |
128 | // Check to see if we already have a provider for this trace | |
129 | synchronized (fInstances) { | |
130 | WeakReference<ISymbolProvider> reference = fInstances.get(trace); | |
131 | if (reference != null) { | |
132 | ISymbolProvider provider = reference.get(); | |
133 | if (provider != null) { | |
134 | return provider; | |
135 | } | |
136 | } | |
137 | // we don't have yet an instance, build one | |
138 | for (SymbolProviderFactoryWrapper wrapper : fProviders) { | |
139 | ISymbolProviderFactory factory = wrapper.factory; | |
140 | ISymbolProvider provider = factory.createProvider(trace); | |
141 | if (provider != null) { | |
142 | fInstances.put(trace, new WeakReference<>(provider)); | |
143 | return provider; | |
144 | } | |
145 | } | |
146 | } | |
147 | // No provider found, return the default one | |
148 | return new DefaultSymbolProvider(trace); | |
149 | } | |
150 | ||
151 | } |