Internalize some classes and fix a pile of warnings
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / internal / tmf / ui / project / handlers / DropAdapterAssistant.java
1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.linuxtools.internal.tmf.ui.project.handlers;
14
15 import java.io.File;
16 import java.lang.reflect.InvocationTargetException;
17 import java.util.LinkedList;
18 import java.util.List;
19 import java.util.Map;
20
21 import org.eclipse.core.resources.IFile;
22 import org.eclipse.core.resources.IFolder;
23 import org.eclipse.core.resources.IProject;
24 import org.eclipse.core.resources.IResource;
25 import org.eclipse.core.resources.IWorkspace;
26 import org.eclipse.core.resources.ResourcesPlugin;
27 import org.eclipse.core.runtime.CoreException;
28 import org.eclipse.core.runtime.IPath;
29 import org.eclipse.core.runtime.IStatus;
30 import org.eclipse.core.runtime.NullProgressMonitor;
31 import org.eclipse.core.runtime.Path;
32 import org.eclipse.core.runtime.QualifiedName;
33 import org.eclipse.core.runtime.Status;
34 import org.eclipse.jface.viewers.IStructuredSelection;
35 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
36 import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
37 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
38 import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
39 import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
40 import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement;
41 import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectRegistry;
42 import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
43 import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder;
44 import org.eclipse.swt.dnd.DND;
45 import org.eclipse.swt.dnd.DropTargetEvent;
46 import org.eclipse.swt.dnd.FileTransfer;
47 import org.eclipse.swt.dnd.TransferData;
48 import org.eclipse.swt.widgets.MessageBox;
49 import org.eclipse.ui.PlatformUI;
50 import org.eclipse.ui.dialogs.IOverwriteQuery;
51 import org.eclipse.ui.navigator.CommonDropAdapter;
52 import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
53 import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
54 import org.eclipse.ui.wizards.datatransfer.ImportOperation;
55
56 /**
57 * Drop adapter assistant for project explorer
58 */
59 public class DropAdapterAssistant extends CommonDropAdapterAssistant {
60
61 /**
62 * Default constructor
63 */
64 public DropAdapterAssistant() {
65 }
66
67 /* (non-Javadoc)
68 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#isSupportedType(org.eclipse.swt.dnd.TransferData)
69 */
70 @Override
71 public boolean isSupportedType(TransferData aTransferType) {
72 return super.isSupportedType(aTransferType) || FileTransfer.getInstance().isSupportedType(aTransferType);
73 }
74
75 /* (non-Javadoc)
76 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
77 */
78 @Override
79 public IStatus validateDrop(Object target, int operation, TransferData transferType) {
80 if (target instanceof TmfTraceFolder) {
81 getCommonDropAdapter().overrideOperation(DND.DROP_COPY);
82 return Status.OK_STATUS;
83 }
84 if (target instanceof TmfExperimentElement) {
85 getCommonDropAdapter().overrideOperation(DND.DROP_LINK);
86 return Status.OK_STATUS;
87 }
88 if (target instanceof TmfTraceElement) {
89 ITmfProjectModelElement parent = ((TmfTraceElement) target).getParent();
90 if (parent instanceof TmfTraceFolder) {
91 getCommonDropAdapter().overrideOperation(DND.DROP_COPY);
92 return Status.OK_STATUS;
93 }
94 if (parent instanceof TmfExperimentElement) {
95 getCommonDropAdapter().overrideOperation(DND.DROP_LINK);
96 return Status.OK_STATUS;
97 }
98 }
99 if (target instanceof IProject) {
100 getCommonDropAdapter().overrideOperation(DND.DROP_COPY);
101 return Status.OK_STATUS;
102 }
103 return Status.CANCEL_STATUS;
104 }
105
106 /* (non-Javadoc)
107 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
108 */
109 @Override
110 public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
111 boolean ok = false;
112
113 // Use local variable to avoid parameter assignment
114 Object targetToUse = aTarget;
115
116 // If target is a trace, use its parent (either trace folder or experiment)
117 if (targetToUse instanceof TmfTraceElement) {
118 targetToUse = ((TmfTraceElement) targetToUse).getParent();
119 }
120
121 // If target is a project, use its trace folder
122 if (targetToUse instanceof IProject) {
123 TmfProjectElement projectElement = TmfProjectRegistry.getProject((IProject) targetToUse);
124 if (projectElement != null) {
125 targetToUse = projectElement.getTracesFolder();
126 }
127 }
128
129 if (aDropTargetEvent.data instanceof IStructuredSelection) {
130 IStructuredSelection selection = (IStructuredSelection) aDropTargetEvent.data;
131 for (Object source : selection.toArray()) {
132 if (source instanceof IResource) {
133 // If source resource is a trace, use the trace element
134 IResource sourceResource = (IResource) source;
135 TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResource.getProject());
136 if (projectElement != null && projectElement.getTracesFolder() != null) {
137 for (TmfTraceElement trace : projectElement.getTracesFolder().getTraces()) {
138 if (trace.getResource().equals(sourceResource)) {
139 source = trace;
140 break;
141 }
142 }
143 }
144 }
145 if (source instanceof TmfTraceElement) {
146 TmfTraceElement sourceTrace = (TmfTraceElement) source;
147 // If source trace is under an experiment, use the original trace from the traces folder
148 if (sourceTrace.getParent() instanceof TmfExperimentElement) {
149 for (TmfTraceElement trace : sourceTrace.getProject().getTracesFolder().getTraces()) {
150 if (trace.getName().equals(sourceTrace.getName())) {
151 sourceTrace = trace;
152 break;
153 }
154 }
155 }
156 if (targetToUse instanceof TmfExperimentElement) {
157 TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
158 ok |= drop(sourceTrace, targetExperiment);
159 } else if (targetToUse instanceof TmfTraceFolder) {
160 TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
161 ok |= drop(sourceTrace, traceFolder);
162 }
163 } else if (source instanceof IResource) {
164 IResource sourceResource = (IResource) source;
165 if (sourceResource.getType() != IResource.FILE && sourceResource.getType() != IResource.FOLDER) {
166 continue;
167 }
168 if (targetToUse instanceof TmfExperimentElement) {
169 TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
170 ok |= drop(sourceResource, targetExperiment);
171 } else if (targetToUse instanceof TmfTraceFolder) {
172 TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
173 ok |= drop(sourceResource, traceFolder);
174 }
175 }
176 }
177 } else if (aDropTargetEvent.data instanceof String[]) {
178 String[] sources = (String[]) aDropTargetEvent.data;
179 for (String source : sources) {
180 Path path = new Path(source);
181 if (targetToUse instanceof TmfExperimentElement) {
182 TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
183 ok |= drop(path, targetExperiment);
184 } else if (targetToUse instanceof TmfTraceFolder) {
185 TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
186 ok |= drop(path, traceFolder);
187 }
188 }
189 }
190 return (ok ? Status.OK_STATUS : Status.CANCEL_STATUS);
191 }
192
193
194 /**
195 * Drop a trace by copying a resource in a target experiment
196 *
197 * @param sourceTrace the source trace element to copy
198 * @param targetExperiment the target experiment
199 * @return true if successful
200 */
201 private boolean drop(TmfTraceElement sourceTrace, TmfExperimentElement targetExperiment) {
202
203 IResource sourceResource = sourceTrace.getResource();
204
205 if (drop(sourceResource, targetExperiment)) {
206 IFolder destinationSupplementaryFolder = targetExperiment.getTraceSupplementaryFolder(sourceResource.getName());
207 if (!destinationSupplementaryFolder.exists()) {
208 sourceTrace.copySupplementaryFolder(destinationSupplementaryFolder);
209 }
210 return true;
211 }
212 return false;
213 }
214
215 /**
216 * Drop a trace by copying a resource in a target experiment
217 *
218 * @param sourceResource the source resource
219 * @param targetExperiment the target experiment
220 * @return true if successful
221 */
222 private boolean drop(IResource sourceResource, TmfExperimentElement targetExperiment) {
223 boolean doit = true;
224
225 //Use local variable to avoid parameter assignment
226 IResource sourceResourceToUse = sourceResource;
227
228 TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResourceToUse.getProject());
229 for (TmfTraceElement trace : targetExperiment.getTraces()) {
230 if (trace.getName().equals(sourceResourceToUse.getName())) {
231 doit = false;
232 break;
233 }
234 }
235 if (doit && !targetExperiment.getProject().equals(projectElement)) {
236 for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
237 if (trace.getName().equals(sourceResourceToUse.getName())) {
238 doit = false;
239 break;
240 }
241 }
242 if (doit) {
243 try {
244 IPath destination = targetExperiment.getProject().getTracesFolder().getResource().getFullPath().addTrailingSeparator().append(sourceResourceToUse.getName());
245 sourceResourceToUse.copy(destination, false, null);
246 cleanupBookmarks(destination);
247 // use the copied resource for the experiment
248 if (sourceResourceToUse.getType() == IResource.FILE) {
249 sourceResourceToUse = targetExperiment.getProject().getTracesFolder().getResource().getFile(sourceResourceToUse.getName());
250 } else if (sourceResourceToUse.getType() == IResource.FOLDER) {
251 sourceResourceToUse = targetExperiment.getProject().getTracesFolder().getResource().getFolder(sourceResourceToUse.getName());
252 }
253 } catch (CoreException e) {
254 doit = false;
255 displayException(e);
256 }
257 }
258 }
259 if (doit) {
260 if (sourceResourceToUse != null && sourceResourceToUse.exists()) {
261 createLink(targetExperiment.getResource(), sourceResourceToUse);
262 return true;
263 }
264 }
265 return false;
266 }
267
268 /**
269 * Drop a trace by copying it's a trace element in a trace folder
270 *
271 * @param sourceTrace the source trace
272 * @param traceFolder the target trace folder
273 * @return true if successful
274 */
275 private boolean drop(TmfTraceElement sourceTrace, TmfTraceFolder traceFolder) {
276 IResource sourceResource = sourceTrace.getResource();
277 if (drop(sourceResource, traceFolder)) {
278 IFolder destinationSupplementaryFolder = traceFolder.getTraceSupplementaryFolder(sourceResource.getName());
279 sourceTrace.copySupplementaryFolder(destinationSupplementaryFolder);
280 return true;
281 }
282 return false;
283 }
284
285 /**
286 * Drop a trace by copying a resource in a trace folder
287 *
288 * @param sourceResource the source resource
289 * @param traceFolder the target trace folder
290 * @return true if successful
291 */
292 private boolean drop(IResource sourceResource, TmfTraceFolder traceFolder) {
293 boolean doit = true;
294
295 for (TmfTraceElement trace : traceFolder.getTraces()) {
296 if (trace.getName().equals(sourceResource.getName())) {
297 doit = false;
298 break;
299 }
300 }
301 if (doit) {
302 try {
303 IPath destination = traceFolder.getResource().getFullPath().addTrailingSeparator().append(sourceResource.getName());
304 sourceResource.copy(destination, false, null);
305
306 cleanupBookmarks(destination);
307 return true;
308 } catch (CoreException e) {
309 displayException(e);
310 }
311 }
312 return false;
313 }
314
315 /**
316 * Drop a trace by importing a path in a target experiment
317 *
318 * @param path the source path
319 * @param targetExperiment the target experiment
320 * @return true if successful
321 */
322 private boolean drop(Path path, TmfExperimentElement targetExperiment) {
323 boolean doit = true;
324
325 // Use local variable to avoid parameter assignment
326 Path pathToUse = path;
327
328 for (TmfTraceElement trace : targetExperiment.getTraces()) {
329 if (trace.getName().equals(pathToUse.lastSegment())) {
330 doit = false;
331 break;
332 }
333 }
334 if (doit && !pathToUse.toString().startsWith(targetExperiment.getProject().getResource().getLocation().toString())) {
335 for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
336 if (trace.getName().equals(pathToUse.lastSegment())) {
337 doit = false;
338 break;
339 }
340 }
341 if (doit) {
342 importTrace(targetExperiment.getProject().getTracesFolder().getResource(), pathToUse);
343 // use the imported trace for the experiment
344 pathToUse = new Path(targetExperiment.getProject().getTracesFolder().getResource().getFile(pathToUse.lastSegment()).getLocation().toString());
345 }
346 }
347 if (doit) {
348 IResource resource = null;
349 File file = new File(pathToUse.toString());
350 if (file.exists() && file.isFile()) {
351 resource = targetExperiment.getProject().getTracesFolder().getResource().getFile(pathToUse.lastSegment());
352 } else if (file.exists() && file.isDirectory()) {
353 resource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(pathToUse.lastSegment());
354 }
355 if (resource != null && resource.exists()) {
356 createLink(targetExperiment.getResource(), resource);
357 return true;
358 }
359 }
360 return false;
361 }
362
363 /**
364 * Drop a trace by importing a path in a trace folder
365 *
366 * @param path the source path
367 * @param traceFolder the target trace folder
368 * @return true if successful
369 */
370 private boolean drop(Path path, TmfTraceFolder traceFolder) {
371 boolean doit = true;
372 for (TmfTraceElement trace : traceFolder.getTraces()) {
373 if (trace.getName().equals(path.lastSegment())) {
374 doit = false;
375 break;
376 }
377 }
378 if (doit) {
379 importTrace(traceFolder.getResource(), path);
380 return true;
381 }
382 return false;
383 }
384
385 /**
386 * Import a trace to the trace folder
387 *
388 * @param resource the trace folder resource
389 * @param path the path to the trace to import
390 */
391 private void importTrace(IFolder resource, Path path) {
392 IPath containerPath = resource.getFullPath();
393 File file = new File(path.toString());
394 File source = file.getParentFile();
395 IOverwriteQuery overwriteImplementor = new IOverwriteQuery() {
396 @Override
397 public String queryOverwrite(String pathString) {
398 return IOverwriteQuery.NO_ALL;
399 }
400 };
401 List<File> filesToImport = new LinkedList<File>();
402 filesToImport.add(file);
403 ImportOperation operation = new ImportOperation(
404 containerPath,
405 source,
406 FileSystemStructureProvider.INSTANCE,
407 overwriteImplementor,
408 filesToImport);
409 operation.setCreateContainerStructure(false);
410 try {
411 operation.run(new NullProgressMonitor());
412 } catch (InvocationTargetException e) {
413 displayException(e);
414 } catch (InterruptedException e) {
415 displayException(e);
416 }
417 }
418
419 /**
420 * Create a link to the actual trace and set the trace type
421 *
422 * @param parentFolder the parent folder
423 * @param resource the resource
424 */
425 private void createLink(IFolder parentFolder, IResource resource) {
426 IPath location = resource.getLocation();
427 IWorkspace workspace = ResourcesPlugin.getWorkspace();
428 try {
429 Map<QualifiedName, String> properties = resource.getPersistentProperties();
430 String bundleName = properties.get(TmfCommonConstants.TRACEBUNDLE);
431 String traceType = properties.get(TmfCommonConstants.TRACETYPE);
432 String iconUrl = properties.get(TmfCommonConstants.TRACEICON);
433 String supplFolder = properties.get(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER);
434
435 if (resource instanceof IFolder) {
436 IFolder folder = parentFolder.getFolder(resource.getName());
437 if (workspace.validateLinkLocation(folder, location).isOK()) {
438 folder.createLink(location, IResource.REPLACE, null);
439 setProperties(folder, bundleName, traceType, iconUrl, supplFolder);
440
441 } else {
442 Activator.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
443 }
444 } else {
445 IFile file = parentFolder.getFile(resource.getName());
446
447 if (workspace.validateLinkLocation(file, location).isOK()) {
448 file.createLink(location, IResource.REPLACE, null);
449 setProperties(file, bundleName, traceType, iconUrl, supplFolder);
450 } else {
451 Activator.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
452 }
453 }
454 } catch (CoreException e) {
455 displayException(e);
456 }
457 }
458
459 /**
460 * Cleanup bookmarks file in copied trace
461 */
462 private void cleanupBookmarks(IPath path) {
463 IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
464 if (folder.exists()) {
465 try {
466 for (IResource member : folder.members()) {
467 if (TmfTrace.class.getCanonicalName().equals(member.getPersistentProperty(TmfCommonConstants.TRACETYPE))) {
468 member.delete(true, null);
469 }
470 }
471 } catch (CoreException e) {
472 displayException(e);
473 }
474 }
475 }
476
477 /**
478 * Set the trace persistent properties
479 *
480 * @param resource the trace resource
481 * @param bundleName the bundle name
482 * @param traceType the trace type
483 * @param iconUrl the icon URL
484 * @param supplFolder the directory of the directory for supplementary information or null to ignore the property
485 * @throws CoreException
486 */
487 private void setProperties(IResource resource, String bundleName, String traceType, String iconUrl, String supplFolder) throws CoreException {
488 resource.setPersistentProperty(TmfCommonConstants.TRACEBUNDLE, bundleName);
489 resource.setPersistentProperty(TmfCommonConstants.TRACETYPE, traceType);
490 resource.setPersistentProperty(TmfCommonConstants.TRACEICON, iconUrl);
491 resource.setPersistentProperty(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER, supplFolder);
492 }
493
494 /**
495 * Display an exception in a message box
496 *
497 * @param e the exception
498 */
499 private void displayException(Exception e) {
500 MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
501 mb.setText(e.getClass().getName());
502 mb.setMessage(e.getMessage());
503 mb.open();
504 }
505
506 }
This page took 0.043069 seconds and 5 git commands to generate.