tmf: Fix TmfSignalManager leaking listeners
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / project / model / TmfProjectRegistry.java
CommitLineData
12c155f5 1/*******************************************************************************
ded2b27f 2 * Copyright (c) 2011, 2016 Ericsson
889da47d 3 *
12c155f5
FC
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
889da47d 8 *
12c155f5
FC
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
889da47d 11 * Bernd Hufmann - Added project creation utility
f537c959 12 * Patrick Tasse - Refactor resource change listener
12c155f5
FC
13 *******************************************************************************/
14
2bdf0193 15package org.eclipse.tracecompass.tmf.ui.project.model;
12c155f5 16
f537c959 17import java.lang.reflect.InvocationTargetException;
889da47d 18import java.net.URI;
12c155f5 19import java.util.HashMap;
0a8ee32e 20import java.util.List;
12c155f5
FC
21import java.util.Map;
22
889da47d 23import org.eclipse.core.resources.IFolder;
12c155f5 24import org.eclipse.core.resources.IProject;
889da47d 25import org.eclipse.core.resources.IProjectDescription;
f537c959
PT
26import org.eclipse.core.resources.IResourceChangeEvent;
27import org.eclipse.core.resources.IResourceChangeListener;
28import org.eclipse.core.resources.IResourceDelta;
889da47d
BH
29import org.eclipse.core.resources.IWorkspace;
30import org.eclipse.core.resources.IWorkspaceRoot;
31import org.eclipse.core.resources.ResourcesPlugin;
32import org.eclipse.core.runtime.CoreException;
33import org.eclipse.core.runtime.IProgressMonitor;
0a8ee32e 34import org.eclipse.swt.widgets.Display;
2bdf0193
AM
35import org.eclipse.tracecompass.internal.tmf.ui.Activator;
36import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
37import org.eclipse.tracecompass.tmf.core.TmfProjectNature;
f537c959
PT
38import org.eclipse.ui.PlatformUI;
39import org.eclipse.ui.actions.WorkspaceModifyOperation;
12c155f5
FC
40
41/**
b544077e 42 * Factory class storing TMF tracing projects and creating TMF project model elements.
12c155f5 43 * <p>
b544077e
BH
44 * @version 1.0
45 * @author Francois Chouinard
12c155f5 46 */
f537c959
PT
47public class TmfProjectRegistry implements IResourceChangeListener {
48
49 // Create the singleton instance
ded2b27f 50 private static final TmfProjectRegistry INSTANCE = new TmfProjectRegistry();
12c155f5 51
828e5592 52 // The map of project resource to project model elements
507b1336 53 private static Map<IProject, TmfProjectElement> registry = new HashMap<>();
12c155f5 54
f537c959
PT
55 private TmfProjectRegistry() {
56 ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
57 }
58
ded2b27f
PT
59 /**
60 * Disposes the project registry
61 *
62 * @since 2.2
63 */
64 public static void dispose() {
65 ResourcesPlugin.getWorkspace().removeResourceChangeListener(INSTANCE);
66 registry.values().forEach(projectElement -> projectElement.dispose());
67 }
68
828e5592
PT
69 /**
70 * Get the project model element for a project resource
71 * @param project the project resource
72 * @return the project model element or null if it does not exist
73 */
12c155f5 74 public static synchronized TmfProjectElement getProject(IProject project) {
828e5592
PT
75 return getProject(project, false);
76 }
77
78 /**
79 * Get the project model element for a project resource
80 * @param project the project resource
81 * @param force a flag controlling whether a new project should be created if it doesn't exist
82 * @return the project model element
83 */
84 public static synchronized TmfProjectElement getProject(IProject project, boolean force) {
12c155f5 85 TmfProjectElement element = registry.get(project);
828e5592 86 if (element == null && force) {
202956f1
AM
87 element = new TmfProjectElement(project.getName(), project, null);
88 registry.put(project, element);
f537c959
PT
89 // force the model to be populated
90 element.refreshChildren();
12c155f5
FC
91 }
92 return element;
93 }
94
889da47d
BH
95 /**
96 * Utility method to create a tracing project.
97 *
98 * @param projectName
99 * - A project name
100 * @param projectLocation
101 * - A project location URI. Use null for default location (which is workspace).
102 * @param monitor
103 * - A progress monitor
104 * @return the IProject object or null
889da47d 105 */
f537c959 106 public static IProject createProject(String projectName, final URI projectLocation, IProgressMonitor monitor) {
889da47d 107
f537c959 108 final IWorkspace workspace = ResourcesPlugin.getWorkspace();
889da47d 109 IWorkspaceRoot root = workspace.getRoot();
f537c959
PT
110 final IProject project = root.getProject(projectName);
111 WorkspaceModifyOperation action = new WorkspaceModifyOperation() {
112 @Override
113 protected void execute(IProgressMonitor progressMonitor) throws CoreException, InvocationTargetException, InterruptedException {
114 if (!project.exists()) {
115 IProjectDescription description = workspace.newProjectDescription(project.getName());
116 if (projectLocation != null) {
117 description.setLocationURI(projectLocation);
118 }
119 project.create(description, progressMonitor);
889da47d 120 }
889da47d 121
f537c959
PT
122 if (!project.isOpen()) {
123 project.open(progressMonitor);
124 }
889da47d 125
f537c959
PT
126 IProjectDescription description = project.getDescription();
127 description.setNatureIds(new String[] { TmfProjectNature.ID });
128 project.setDescription(description, null);
889da47d 129
339d539c 130 IFolder folder = project.getFolder(TmfTracesFolder.TRACES_FOLDER_NAME);
f537c959
PT
131 if (!folder.exists()) {
132 folder.create(true, true, null);
133 }
889da47d 134
f537c959
PT
135 folder = project.getFolder(TmfExperimentFolder.EXPER_FOLDER_NAME);
136 if (!folder.exists()) {
137 folder.create(true, true, null);
138 }
889da47d 139
f537c959 140 // create folder for supplementary tracing files
b5e8ee95 141 folder = project.getFolder(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER_NAME);
889da47d 142
f537c959
PT
143 if (!folder.exists()) {
144 folder.create(true, true, null);
145 }
889da47d 146 }
f537c959
PT
147 };
148 try {
149 PlatformUI.getWorkbench().getProgressService().run(false, false, action);
150 } catch (InvocationTargetException e) {
889da47d 151 Activator.getDefault().logError("Error creating TMF project " + project.getName(), e); //$NON-NLS-1$
f537c959
PT
152 } catch (InterruptedException e) {
153 }
154 return project;
155 }
156
157 // ------------------------------------------------------------------------
158 // IResourceChangeListener
159 // ------------------------------------------------------------------------
160
f537c959
PT
161 @Override
162 public void resourceChanged(IResourceChangeEvent event) {
0a8ee32e
MAL
163 if (event.getType() == IResourceChangeEvent.PRE_DELETE || event.getType() == IResourceChangeEvent.PRE_CLOSE) {
164 if (event.getResource() instanceof IProject) {
165 IProject project = (IProject) event.getResource();
166 try {
63618c49 167 if (project.isAccessible() && project.hasNature(TmfProjectNature.ID)) {
0a8ee32e 168 TmfProjectElement tmfProjectElement = registry.get(project);
63618c49
PT
169 if (tmfProjectElement == null) {
170 return;
171 }
0a8ee32e
MAL
172 final List<TmfTraceElement> traces = tmfProjectElement.getTracesFolder().getTraces();
173 if (!traces.isEmpty()) {
174 // Close editors in UI Thread
175 Display.getDefault().syncExec(new Runnable() {
176 @Override
177 public void run() {
178 for (TmfTraceElement traceElement : traces) {
179 traceElement.closeEditors();
180 }
181 }
182 });
183 }
184 }
185 } catch (CoreException e) {
186 Activator.getDefault().logError("Error handling resource change event for " + project.getName(), e); //$NON-NLS-1$
187 }
188 }
189 } else if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
f537c959
PT
190 for (IResourceDelta delta : event.getDelta().getAffectedChildren()) {
191 if (delta.getResource() instanceof IProject) {
192 IProject project = (IProject) delta.getResource();
193 try {
194 if (delta.getKind() == IResourceDelta.CHANGED &&
195 project.isOpen() && project.hasNature(TmfProjectNature.ID)) {
196 TmfProjectElement projectElement = getProject(project, true);
197 projectElement.refresh();
198 } else if (delta.getKind() == IResourceDelta.REMOVED) {
ded2b27f
PT
199 TmfProjectElement projectElement = registry.remove(project);
200 if (projectElement != null) {
201 projectElement.dispose();
202 }
f537c959
PT
203 }
204 } catch (CoreException e) {
205 Activator.getDefault().logError("Error handling resource change event for " + project.getName(), e); //$NON-NLS-1$
206 }
207 }
208 }
889da47d 209 }
889da47d
BH
210 }
211
12c155f5 212}
This page took 0.18375 seconds and 5 git commands to generate.