1 /**********************************************************************
2 * Copyright (c) 2005, 2014 IBM Corporation, Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM - Initial API and implementation
10 * Bernd Hufmann - Updated for TMF
11 **********************************************************************/
13 package org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.load
;
15 import java
.util
.ArrayList
;
16 import java
.util
.HashMap
;
17 import java
.util
.Iterator
;
18 import java
.util
.List
;
21 import org
.eclipse
.core
.runtime
.CoreException
;
22 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
23 import org
.eclipse
.core
.runtime
.IExtension
;
24 import org
.eclipse
.core
.runtime
.IExtensionPoint
;
25 import org
.eclipse
.core
.runtime
.Platform
;
26 import org
.eclipse
.jface
.preference
.IPreferenceStore
;
27 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.Activator
;
28 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.SDView
;
29 import org
.eclipse
.ui
.IViewReference
;
30 import org
.eclipse
.ui
.IWorkbenchPage
;
31 import org
.eclipse
.ui
.IWorkbenchWindow
;
32 import org
.eclipse
.ui
.PlatformUI
;
35 * Manager class for the UML2SD extension point.
39 * @author Bernd Hufmann
41 public class LoadersManager
{
43 // ------------------------------------------------------------------------
45 // ------------------------------------------------------------------------
47 /** Namespace of the extension point */
48 private static final String EXT_NAMESPACE
= "org.eclipse.linuxtools.tmf.ui"; //$NON-NLS-1$
50 /** The loader tag for the extension point */
51 private static final String LOADER_TAG
= "uml2SDLoader"; //$NON-NLS-1$
53 /** The loader prefix */
54 private static final String LOADER_PREFIX
= LOADER_TAG
+ "."; //$NON-NLS-1$
56 // ------------------------------------------------------------------------
58 // ------------------------------------------------------------------------
61 * The LoadersManager singleton instance.
63 private static LoadersManager fLoadersManager
;
66 * Map for caching information (view ID to loader class)
68 private Map
<String
, IUml2SDLoader
> fViewLoaderMap
= new HashMap
<>();
70 * Map for caching information (view ID to list of configuration elements)
72 private Map
<String
, ArrayList
<IConfigurationElement
>> fViewLoadersList
= new HashMap
<>();
74 // ------------------------------------------------------------------------
76 // ------------------------------------------------------------------------
78 * This should not be used by the clients
80 protected LoadersManager() {
83 // ------------------------------------------------------------------------
85 // ------------------------------------------------------------------------
87 * A static method to get the manager instance.
89 * @return the manager instance
91 public static synchronized LoadersManager
getInstance() {
92 if (fLoadersManager
== null) {
93 fLoadersManager
= new LoadersManager();
95 return fLoadersManager
;
99 * Creates a loader instance and associate it to the view. It requires
100 * that the loader-view-association was created by an eclipse extension.
102 * @param className The name of the class to create an instance from
103 * @param view The UML2 Sequence Diagram view instance
104 * @return The created loader
106 public IUml2SDLoader
createLoader(String className
, SDView view
) {
113 String viewId
= view
.getViewSite().getId();
115 // Get loaders from all extensions for given view
116 List
<IConfigurationElement
> loaderElements
= getLoaderConfigurationElements(viewId
);
117 IConfigurationElement ce
= getLoaderConfigurationElement(className
, loaderElements
);
120 // Assign a loader instance to this view
121 createLoaderForView(viewId
, ce
);
122 IUml2SDLoader loader
= fViewLoaderMap
.get(viewId
);
123 if (loader
!= null) {
124 loader
.setViewer(view
);
132 * Sets the loader to null for this view, a kind of clean-up while disposing.
134 * @param viewId the id of the view
136 public void resetLoader(String viewId
) {
137 IUml2SDLoader loader
= fViewLoaderMap
.get(viewId
);
138 if (loader
!= null) {
141 fViewLoaderMap
.put(viewId
, null);
145 * Returns the loader in use in given Sequence Diagram View
147 * @param viewId The Sequence Diagram viewId.
148 * @return the current loader if any - null otherwise
150 public IUml2SDLoader
getCurrentLoader(String viewId
) {
151 return getCurrentLoader(viewId
, null);
155 * Returns the loader in use in this Sequence Diagram View
157 * @param viewId The Sequence Diagram viewId
158 * @param view The Sequence Diagram view (if known). Use null to reference the primary SD View.
159 * @return the current loader if any - null otherwise
161 public IUml2SDLoader
getCurrentLoader(String viewId
, SDView view
) {
162 if (viewId
== null) {
166 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
167 // During Eclipse shutdown the active workbench window is null
168 if (window
== null) {
172 IWorkbenchPage persp
= window
.getActivePage();
174 SDView sdView
= view
;
177 // Search the view corresponding to the viewId
178 if (sdView
== null) {
179 IViewReference viewref
= persp
.findViewReference(viewId
);
180 if (viewref
!= null) {
181 sdView
= (SDView
) viewref
.getView(false);
184 if (sdView
== null) {
185 // no corresponding view exists -> return null for the loader
190 // Return the loader corresponding to that view (if any)
191 IUml2SDLoader loader
= fViewLoaderMap
.get(viewId
);
192 if (loader
== null) {
193 createLastLoaderIfAny(viewId
);
194 loader
= fViewLoaderMap
.get(viewId
);
198 } catch (Exception e
) {
199 Activator
.getDefault().logError("Error getting loader class", e
); //$NON-NLS-1$
205 * Returns the loader class name that have been saved last time.
207 * @param viewId The view this loader belongs to
208 * @return the class name of the saved loader
210 public String
getSavedLoader(String viewId
) {
211 IPreferenceStore p
= Activator
.getDefault().getPreferenceStore();
212 return p
.getString(LOADER_PREFIX
+ viewId
);
216 * Saves the last loader in order to reload it on next session.
219 * Standalone ID of the loader
221 * Suffix ID of the loader
223 public void saveLastLoader(String id
, String id2
) {
224 IPreferenceStore p
= Activator
.getDefault().getPreferenceStore();
225 p
.setValue(LOADER_PREFIX
+ id2
, id
);
229 * Changes the current unique loader to the given secondary viewId.
231 * @param loader The current loader
232 * @param id the view secondary id or null
234 private void setCurrentLoader(IUml2SDLoader loader
, String id
) {
239 // Get the loader in use
240 IUml2SDLoader currentLoader
= fViewLoaderMap
.get(id
);
242 if ((currentLoader
!= null) && (currentLoader
!= loader
)) {
243 if (loader
!= null) {
244 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
245 // During Eclipse shutdown the active workbench window is null
246 if (window
== null) {
249 IWorkbenchPage persp
= window
.getActivePage();
251 // Search view corresponding to the viewId
252 SDView sdview
= null;
253 IViewReference viewref
= persp
.findViewReference(id
);
254 if (viewref
!= null) {
255 sdview
= (SDView
) viewref
.getView(false);
258 // Make everything clean for the new loader
259 if (sdview
!= null) {
260 sdview
.resetProviders();
263 } catch (Exception e
) {
264 Activator
.getDefault().logError("Error setting current loader class", e
); //$NON-NLS-1$
267 // The old loader is going to be kicked
268 currentLoader
.dispose();
271 // Replace the current loader by the new one in the map
272 fViewLoaderMap
.put(id
, loader
);
274 // Store this loader in the preferences to be able to restore it when the workbench will be re-launched
275 if (loader
!= null) {
276 saveLastLoader(loader
.getClass().getName(), id
);
281 * Creates the last loader and saves it. If not last is not available, it creates
282 * and saves the default loader, else no loader is created.
284 * @param viewId The view ID.
286 private void createLastLoaderIfAny(String viewId
) {
287 // Get saved loader from preferences
288 String loaderName
= getSavedLoader(viewId
);
290 // Get loaders from all extensions for given view
291 List
<IConfigurationElement
> loaderElements
= getLoaderConfigurationElements(viewId
);
292 IConfigurationElement ce
= getLoaderConfigurationElement(loaderName
, loaderElements
);
295 ce
= getDefaultLoader(loaderElements
);
299 createLoaderForView(viewId
, ce
);
304 * Gets a list of loader configuration elements from the extension point registry for a given view.
305 * @param viewId The view ID
306 * @return List of extension point configuration elements.
308 private List
<IConfigurationElement
> getLoaderConfigurationElements(String viewId
) {
309 List
<IConfigurationElement
> list
= fViewLoadersList
.get(viewId
);
314 ArrayList
<IConfigurationElement
> ret
= new ArrayList
<>();
315 IExtensionPoint iep
= Platform
.getExtensionRegistry().getExtensionPoint(EXT_NAMESPACE
, LOADER_TAG
);
320 IExtension
[] ie
= iep
.getExtensions();
325 for (int i
= 0; i
< ie
.length
; i
++) {
326 IConfigurationElement c
[] = ie
[i
].getConfigurationElements();
327 for (int j
= 0; j
< c
.length
; j
++) {
328 if (viewId
.equals(c
[j
].getAttribute("view"))) { //$NON-NLS-1$
333 fViewLoadersList
.put(viewId
, ret
);
338 * Returns the loader configuration element for given loader class name and for the given
339 * list of configuration elements, if available else null.
341 * @param loaderClassName The loader class name.
342 * @param loaderElements The list of loader configuration elements
343 * @return Extension point configuration element
345 private static IConfigurationElement
getLoaderConfigurationElement(
346 String loaderClassName
, List
<IConfigurationElement
> loaderElements
) {
347 if (loaderClassName
!= null && loaderClassName
.length() > 0) {
348 // Find configuration element corresponding to the saved loader
349 for (Iterator
<IConfigurationElement
> i
= loaderElements
.iterator(); i
.hasNext();) {
350 IConfigurationElement ce
= i
.next();
351 if (ce
.getAttribute("class").equals(loaderClassName
)) { //$NON-NLS-1$
360 * Returns the loader configuration element for the given list of configuration elements, if available else null.
361 * Note that if multiple default loaders are defined it selects the first one
363 * @param loaderElements The list of loader configuration elements
364 * @return The default extension point configuration element.
366 private static IConfigurationElement
getDefaultLoader(
367 List
<IConfigurationElement
> loaderElements
) {
368 // Look for a default loader
369 for (Iterator
<IConfigurationElement
> i
= loaderElements
.iterator(); i
.hasNext();) {
370 IConfigurationElement ce
= i
.next();
371 if (Boolean
.valueOf(ce
.getAttribute("default")).booleanValue()) { //$NON-NLS-1$
379 * Creates an instance of the loader class for a given extension point configuration element and
380 * also sets it as current loader for the given view.
382 * @param viewId The view ID.
383 * @param ce The extension point configuration element
385 private void createLoaderForView(String viewId
, IConfigurationElement ce
) {
387 Object obj
= ce
.createExecutableExtension("class"); //$NON-NLS-1$
388 IUml2SDLoader l
= (IUml2SDLoader
) obj
;
389 if (viewId
!= null) {
390 setCurrentLoader(l
, viewId
);
392 } catch (CoreException e4
) {
393 Activator
.getDefault().logError("Error 'uml2SDLoader' Extension point", e4
); //$NON-NLS-1$
394 } catch (Exception e5
) {
395 Activator
.getDefault().logError("Error 'uml2SDLoader' Extension point", e5
); //$NON-NLS-1$