1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
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
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.handlers
;
16 import java
.lang
.reflect
.InvocationTargetException
;
17 import java
.util
.LinkedList
;
18 import java
.util
.List
;
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
.tmf
.core
.trace
.TmfTrace
;
36 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.ITmfProjectModelElement
;
37 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfExperimentElement
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfProjectElement
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfProjectRegistry
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceFolder
;
42 import org
.eclipse
.swt
.dnd
.DND
;
43 import org
.eclipse
.swt
.dnd
.DropTargetEvent
;
44 import org
.eclipse
.swt
.dnd
.FileTransfer
;
45 import org
.eclipse
.swt
.dnd
.TransferData
;
46 import org
.eclipse
.swt
.widgets
.MessageBox
;
47 import org
.eclipse
.ui
.PlatformUI
;
48 import org
.eclipse
.ui
.dialogs
.IOverwriteQuery
;
49 import org
.eclipse
.ui
.navigator
.CommonDropAdapter
;
50 import org
.eclipse
.ui
.navigator
.CommonDropAdapterAssistant
;
51 import org
.eclipse
.ui
.wizards
.datatransfer
.FileSystemStructureProvider
;
52 import org
.eclipse
.ui
.wizards
.datatransfer
.ImportOperation
;
55 * Drop adapter assistant for project explorer
57 public class DropAdapterAssistant
extends CommonDropAdapterAssistant
{
62 public DropAdapterAssistant() {
66 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#isSupportedType(org.eclipse.swt.dnd.TransferData)
69 public boolean isSupportedType(TransferData aTransferType
) {
70 return super.isSupportedType(aTransferType
) || FileTransfer
.getInstance().isSupportedType(aTransferType
);
74 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
77 public IStatus
validateDrop(Object target
, int operation
, TransferData transferType
) {
78 if (target
instanceof TmfTraceFolder
) {
79 getCommonDropAdapter().overrideOperation(DND
.DROP_COPY
);
80 return Status
.OK_STATUS
;
82 if (target
instanceof TmfExperimentElement
) {
83 getCommonDropAdapter().overrideOperation(DND
.DROP_LINK
);
84 return Status
.OK_STATUS
;
86 if (target
instanceof TmfTraceElement
) {
87 ITmfProjectModelElement parent
= ((TmfTraceElement
) target
).getParent();
88 if (parent
instanceof TmfTraceFolder
) {
89 getCommonDropAdapter().overrideOperation(DND
.DROP_COPY
);
90 return Status
.OK_STATUS
;
92 if (parent
instanceof TmfExperimentElement
) {
93 getCommonDropAdapter().overrideOperation(DND
.DROP_LINK
);
94 return Status
.OK_STATUS
;
97 if (target
instanceof IProject
) {
98 getCommonDropAdapter().overrideOperation(DND
.DROP_COPY
);
99 return Status
.OK_STATUS
;
101 return Status
.CANCEL_STATUS
;
105 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
108 public IStatus
handleDrop(CommonDropAdapter aDropAdapter
, DropTargetEvent aDropTargetEvent
, Object aTarget
) {
111 // If target is a trace, use its parent (either trace folder or experiment)
112 if (aTarget
instanceof TmfTraceElement
) {
113 aTarget
= ((TmfTraceElement
) aTarget
).getParent();
116 // If target is a project, use its trace folder
117 if (aTarget
instanceof IProject
) {
118 TmfProjectElement projectElement
= TmfProjectRegistry
.getProject((IProject
) aTarget
);
119 if (projectElement
!= null) {
120 aTarget
= projectElement
.getTracesFolder();
124 if (aDropTargetEvent
.data
instanceof IStructuredSelection
) {
125 IStructuredSelection selection
= (IStructuredSelection
) aDropTargetEvent
.data
;
126 for (Object source
: selection
.toArray()) {
127 if (source
instanceof IResource
) {
128 // If source resource is a trace, use the trace element
129 IResource sourceResource
= (IResource
) source
;
130 TmfProjectElement projectElement
= TmfProjectRegistry
.getProject(sourceResource
.getProject());
131 if (projectElement
!= null && projectElement
.getTracesFolder() != null) {
132 for (TmfTraceElement trace
: projectElement
.getTracesFolder().getTraces()) {
133 if (trace
.getResource().equals(sourceResource
)) {
140 if (source
instanceof TmfTraceElement
) {
141 TmfTraceElement sourceTrace
= (TmfTraceElement
) source
;
142 // If source trace is under an experiment, use the original trace from the traces folder
143 if (sourceTrace
.getParent() instanceof TmfExperimentElement
) {
144 for (TmfTraceElement trace
: sourceTrace
.getProject().getTracesFolder().getTraces()) {
145 if (trace
.getName().equals(sourceTrace
.getName())) {
151 IResource sourceResource
= sourceTrace
.getResource();
152 if (aTarget
instanceof TmfExperimentElement
) {
153 TmfExperimentElement targetExperiment
= (TmfExperimentElement
) aTarget
;
154 ok
|= drop(sourceResource
, targetExperiment
);
155 } else if (aTarget
instanceof TmfTraceFolder
) {
156 TmfTraceFolder traceFolder
= (TmfTraceFolder
) aTarget
;
157 ok
|= drop(sourceResource
, traceFolder
);
159 } else if (source
instanceof IResource
) {
160 IResource sourceResource
= (IResource
) source
;
161 if (sourceResource
.getType() != IResource
.FILE
&& sourceResource
.getType() != IResource
.FOLDER
) {
164 if (aTarget
instanceof TmfExperimentElement
) {
165 TmfExperimentElement targetExperiment
= (TmfExperimentElement
) aTarget
;
166 ok
|= drop(sourceResource
, targetExperiment
);
167 } else if (aTarget
instanceof TmfTraceFolder
) {
168 TmfTraceFolder traceFolder
= (TmfTraceFolder
) aTarget
;
169 ok
|= drop(sourceResource
, traceFolder
);
173 } else if (aDropTargetEvent
.data
instanceof String
[]) {
174 String
[] sources
= (String
[]) aDropTargetEvent
.data
;
175 for (String source
: sources
) {
176 Path path
= new Path(source
);
177 if (aTarget
instanceof TmfExperimentElement
) {
178 TmfExperimentElement targetExperiment
= (TmfExperimentElement
) aTarget
;
179 ok
|= drop(path
, targetExperiment
);
180 } else if (aTarget
instanceof TmfTraceFolder
) {
181 TmfTraceFolder traceFolder
= (TmfTraceFolder
) aTarget
;
182 ok
|= drop(path
, traceFolder
);
186 return (ok ? Status
.OK_STATUS
: Status
.CANCEL_STATUS
);
190 * Drop a trace by copying a resource in a target experiment
192 * @param sourceResource the source resource
193 * @param targetExperiment the target experiment
194 * @return true if successful
196 private boolean drop(IResource sourceResource
, TmfExperimentElement targetExperiment
) {
198 TmfProjectElement projectElement
= TmfProjectRegistry
.getProject(sourceResource
.getProject());
199 for (TmfTraceElement trace
: targetExperiment
.getTraces()) {
200 if (trace
.getName().equals(sourceResource
.getName())) {
205 if (doit
&& !targetExperiment
.getProject().equals(projectElement
)) {
206 for (TmfTraceElement trace
: targetExperiment
.getProject().getTracesFolder().getTraces()) {
207 if (trace
.getName().equals(sourceResource
.getName())) {
214 IPath destination
= targetExperiment
.getProject().getTracesFolder().getResource().getFullPath().addTrailingSeparator().append(sourceResource
.getName());
215 sourceResource
.copy(destination
, false, null);
216 cleanupBookmarks(destination
);
217 // use the copied resource for the experiment
218 if (sourceResource
.getType() == IResource
.FILE
) {
219 sourceResource
= targetExperiment
.getProject().getTracesFolder().getResource().getFile(sourceResource
.getName());
220 } else if (sourceResource
.getType() == IResource
.FOLDER
) {
221 sourceResource
= targetExperiment
.getProject().getTracesFolder().getResource().getFolder(sourceResource
.getName());
223 } catch (CoreException e
) {
230 if (sourceResource
!= null && sourceResource
.exists()) {
231 createLink(targetExperiment
.getResource(), sourceResource
);
239 * Drop a trace by copying a resource in a trace folder
241 * @param sourceResource the source resource
242 * @param traceFolder the target trace folder
243 * @return true if successful
245 private boolean drop(IResource sourceResource
, TmfTraceFolder traceFolder
) {
247 for (TmfTraceElement trace
: traceFolder
.getTraces()) {
248 if (trace
.getName().equals(sourceResource
.getName())) {
255 IPath destination
= traceFolder
.getResource().getFullPath().addTrailingSeparator().append(sourceResource
.getName());
256 sourceResource
.copy(destination
, false, null);
257 cleanupBookmarks(destination
);
259 } catch (CoreException e
) {
267 * Drop a trace by importing a path in a target experiment
269 * @param path the source path
270 * @param targetExperiment the target experiment
271 * @return true if successful
273 private boolean drop(Path path
, TmfExperimentElement targetExperiment
) {
275 for (TmfTraceElement trace
: targetExperiment
.getTraces()) {
276 if (trace
.getName().equals(path
.lastSegment())) {
281 if (doit
&& !path
.toString().startsWith(targetExperiment
.getProject().getResource().getLocation().toString())) {
282 for (TmfTraceElement trace
: targetExperiment
.getProject().getTracesFolder().getTraces()) {
283 if (trace
.getName().equals(path
.lastSegment())) {
289 importTrace(targetExperiment
.getProject().getTracesFolder().getResource(), path
);
290 // use the imported trace for the experiment
291 path
= new Path(targetExperiment
.getProject().getTracesFolder().getResource().getFile(path
.lastSegment()).getLocation().toString());
295 IResource resource
= null;
296 File file
= new File(path
.toString());
297 if (file
.exists() && file
.isFile()) {
298 resource
= targetExperiment
.getProject().getTracesFolder().getResource().getFile(path
.lastSegment());
299 } else if (file
.exists() && file
.isDirectory()) {
300 resource
= targetExperiment
.getProject().getTracesFolder().getResource().getFolder(path
.lastSegment());
302 if (resource
!= null && resource
.exists()) {
303 createLink(targetExperiment
.getResource(), resource
);
311 * Drop a trace by importing a path in a trace folder
313 * @param path the source path
314 * @param traceFolder the target trace folder
315 * @return true if successful
317 private boolean drop(Path path
, TmfTraceFolder traceFolder
) {
319 for (TmfTraceElement trace
: traceFolder
.getTraces()) {
320 if (trace
.getName().equals(path
.lastSegment())) {
326 importTrace(traceFolder
.getResource(), path
);
333 * Import a trace to the trace folder
335 * @param resource the trace folder resource
336 * @param path the path to the trace to import
338 private void importTrace(IFolder resource
, Path path
) {
339 IPath containerPath
= resource
.getFullPath();
340 File file
= new File(path
.toString());
341 File source
= file
.getParentFile();
342 IOverwriteQuery overwriteImplementor
= new IOverwriteQuery() {
344 public String
queryOverwrite(String pathString
) {
345 return IOverwriteQuery
.NO_ALL
;
348 List
<File
> filesToImport
= new LinkedList
<File
>();
349 filesToImport
.add(file
);
350 ImportOperation operation
= new ImportOperation(
353 FileSystemStructureProvider
.INSTANCE
,
354 overwriteImplementor
,
356 operation
.setCreateContainerStructure(false);
358 operation
.run(new NullProgressMonitor());
359 } catch (InvocationTargetException e
) {
361 } catch (InterruptedException e
) {
367 * Create a link to the actual trace and set the trace type
369 * @param parentFolder the parent folder
370 * @param resource the resource
372 private void createLink(IFolder parentFolder
, IResource resource
) {
373 IPath location
= resource
.getLocation();
374 IWorkspace workspace
= ResourcesPlugin
.getWorkspace();
376 Map
<QualifiedName
, String
> properties
= resource
.getPersistentProperties();
377 String bundleName
= properties
.get(TmfTraceElement
.TRACEBUNDLE
);
378 String traceType
= properties
.get(TmfTraceElement
.TRACETYPE
);
379 String iconUrl
= properties
.get(TmfTraceElement
.TRACEICON
);
381 if (resource
instanceof IFolder
) {
382 IFolder folder
= parentFolder
.getFolder(resource
.getName());
383 if (workspace
.validateLinkLocation(folder
, location
).isOK()) {
384 folder
.createLink(location
, IResource
.REPLACE
, null);
385 setProperties(folder
, bundleName
, traceType
, iconUrl
);
388 System
.out
.println("Invalid Trace Location"); //$NON-NLS-1$
391 IFile file
= parentFolder
.getFile(resource
.getName());
392 if (workspace
.validateLinkLocation(file
, location
).isOK()) {
393 file
.createLink(location
, IResource
.REPLACE
, null);
394 setProperties(file
, bundleName
, traceType
, iconUrl
);
396 System
.out
.println("Invalid Trace Location"); //$NON-NLS-1$
399 } catch (CoreException e
) {
405 * Cleanup bookmarks file in copied trace
407 private void cleanupBookmarks(IPath path
) {
408 IFolder folder
= ResourcesPlugin
.getWorkspace().getRoot().getFolder(path
);
409 if (folder
.exists()) {
411 for (IResource member
: folder
.members()) {
412 if (TmfTrace
.class.getCanonicalName().equals(member
.getPersistentProperty(TmfTraceElement
.TRACETYPE
))) {
413 member
.delete(true, null);
416 } catch (CoreException e
) {
423 * Set the trace persistent properties
425 * @param resource the trace resource
426 * @param bundleName the bundle name
427 * @param traceType the trace type
428 * @param iconUrl the icon URL
429 * @throws CoreException
431 private void setProperties(IResource resource
, String bundleName
, String traceType
, String iconUrl
) throws CoreException
{
432 resource
.setPersistentProperty(TmfTraceElement
.TRACEBUNDLE
, bundleName
);
433 resource
.setPersistentProperty(TmfTraceElement
.TRACETYPE
, traceType
);
434 resource
.setPersistentProperty(TmfTraceElement
.TRACEICON
, iconUrl
);
438 * Display an exception in a message box
440 * @param e the exception
442 private void displayException(Exception e
) {
443 MessageBox mb
= new MessageBox(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell());
444 mb
.setText(e
.getClass().getName());
445 mb
.setMessage(e
.getMessage());