tmf.core/ui: Move some logic of the symbol provider to core
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / symbols / SymbolProviderManager.java
CommitLineData
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
11package org.eclipse.tracecompass.tmf.ui.symbols;
12
13import java.lang.ref.WeakReference;
14import java.util.ArrayList;
15import java.util.Comparator;
16import java.util.List;
17import java.util.Map;
18import java.util.WeakHashMap;
19
20import org.eclipse.core.runtime.CoreException;
21import org.eclipse.core.runtime.IConfigurationElement;
22import org.eclipse.core.runtime.Platform;
23import org.eclipse.jdt.annotation.NonNull;
24import org.eclipse.tracecompass.internal.tmf.ui.Activator;
25import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
26
a54f9c9d
MK
27import 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
40public 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}
This page took 0.049279 seconds and 5 git commands to generate.