tmf: Update drag and drop to support trace folders
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / internal / tmf / ui / project / handlers / DropAdapterAssistant.java
CommitLineData
828e5592 1/*******************************************************************************
60ae41e1 2* Copyright (c) 2012, 2014 Ericsson
abbdd66a 3 *
828e5592
PT
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
abbdd66a 8 *
828e5592
PT
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
ab37ff41 11 * Patrick Tasse - Add support for DROP_LINK and rename prompt on name clash
828e5592
PT
12 *******************************************************************************/
13
d34665f9 14package org.eclipse.linuxtools.internal.tmf.ui.project.handlers;
828e5592
PT
15
16import java.io.File;
ab37ff41
PT
17import java.io.FileInputStream;
18import java.io.FileNotFoundException;
19import java.io.InputStream;
828e5592 20import java.lang.reflect.InvocationTargetException;
ab37ff41 21import java.util.Arrays;
828e5592
PT
22import java.util.List;
23import java.util.Map;
24
c2f1c5b6 25import org.eclipse.core.resources.IContainer;
828e5592
PT
26import org.eclipse.core.resources.IFile;
27import org.eclipse.core.resources.IFolder;
28import org.eclipse.core.resources.IProject;
29import org.eclipse.core.resources.IResource;
30import org.eclipse.core.resources.IWorkspace;
31import org.eclipse.core.resources.ResourcesPlugin;
32import org.eclipse.core.runtime.CoreException;
33import org.eclipse.core.runtime.IPath;
ab37ff41 34import org.eclipse.core.runtime.IProgressMonitor;
828e5592
PT
35import org.eclipse.core.runtime.IStatus;
36import org.eclipse.core.runtime.NullProgressMonitor;
37import org.eclipse.core.runtime.Path;
38import org.eclipse.core.runtime.QualifiedName;
39import org.eclipse.core.runtime.Status;
89730b51 40import org.eclipse.core.runtime.URIUtil;
ab37ff41 41import org.eclipse.jface.operation.IRunnableWithProgress;
828e5592 42import org.eclipse.jface.viewers.IStructuredSelection;
8fd82db5 43import org.eclipse.linuxtools.internal.tmf.ui.Activator;
e12ecd30 44import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
c3d27e8f 45import org.eclipse.linuxtools.tmf.core.project.model.TmfTraceImportException;
a6e37e4c 46import org.eclipse.linuxtools.tmf.core.project.model.TmfTraceType;
c3d27e8f 47import org.eclipse.linuxtools.tmf.core.project.model.TraceTypeHelper;
fedfc72a 48import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
828e5592
PT
49import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
50import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
51import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement;
52import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectRegistry;
53import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
54import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder;
c3d27e8f 55import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceTypeUIUtils;
ab37ff41
PT
56import org.eclipse.osgi.util.NLS;
57import org.eclipse.swt.SWT;
828e5592
PT
58import org.eclipse.swt.dnd.DND;
59import org.eclipse.swt.dnd.DropTargetEvent;
60import org.eclipse.swt.dnd.FileTransfer;
61import org.eclipse.swt.dnd.TransferData;
62import org.eclipse.swt.widgets.MessageBox;
63import org.eclipse.ui.PlatformUI;
ab37ff41 64import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
828e5592
PT
65import org.eclipse.ui.dialogs.IOverwriteQuery;
66import org.eclipse.ui.navigator.CommonDropAdapter;
67import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
68import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
69import org.eclipse.ui.wizards.datatransfer.ImportOperation;
70
71/**
72 * Drop adapter assistant for project explorer
73 */
74public class DropAdapterAssistant extends CommonDropAdapterAssistant {
75
76 /**
77 * Default constructor
78 */
79 public DropAdapterAssistant() {
80 }
81
828e5592
PT
82 @Override
83 public boolean isSupportedType(TransferData aTransferType) {
84 return super.isSupportedType(aTransferType) || FileTransfer.getInstance().isSupportedType(aTransferType);
85 }
86
828e5592
PT
87 @Override
88 public IStatus validateDrop(Object target, int operation, TransferData transferType) {
89 if (target instanceof TmfTraceFolder) {
828e5592
PT
90 return Status.OK_STATUS;
91 }
92 if (target instanceof TmfExperimentElement) {
828e5592
PT
93 return Status.OK_STATUS;
94 }
95 if (target instanceof TmfTraceElement) {
96 ITmfProjectModelElement parent = ((TmfTraceElement) target).getParent();
97 if (parent instanceof TmfTraceFolder) {
828e5592
PT
98 return Status.OK_STATUS;
99 }
100 if (parent instanceof TmfExperimentElement) {
828e5592
PT
101 return Status.OK_STATUS;
102 }
103 }
104 if (target instanceof IProject) {
828e5592
PT
105 return Status.OK_STATUS;
106 }
107 return Status.CANCEL_STATUS;
108 }
109
828e5592
PT
110 @Override
111 public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
112 boolean ok = false;
113
9fa32496
BH
114 // Use local variable to avoid parameter assignment
115 Object targetToUse = aTarget;
116
ab37ff41
PT
117 int operation = aDropTargetEvent.detail;
118 if (operation != DND.DROP_LINK) {
119 operation = DND.DROP_COPY;
120 }
121
828e5592 122 // If target is a trace, use its parent (either trace folder or experiment)
9fa32496
BH
123 if (targetToUse instanceof TmfTraceElement) {
124 targetToUse = ((TmfTraceElement) targetToUse).getParent();
828e5592
PT
125 }
126
127 // If target is a project, use its trace folder
9fa32496 128 if (targetToUse instanceof IProject) {
f537c959 129 TmfProjectElement projectElement = TmfProjectRegistry.getProject((IProject) targetToUse, true);
828e5592 130 if (projectElement != null) {
9fa32496 131 targetToUse = projectElement.getTracesFolder();
828e5592
PT
132 }
133 }
134
135 if (aDropTargetEvent.data instanceof IStructuredSelection) {
136 IStructuredSelection selection = (IStructuredSelection) aDropTargetEvent.data;
137 for (Object source : selection.toArray()) {
138 if (source instanceof IResource) {
139 // If source resource is a trace, use the trace element
140 IResource sourceResource = (IResource) source;
141 TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResource.getProject());
142 if (projectElement != null && projectElement.getTracesFolder() != null) {
143 for (TmfTraceElement trace : projectElement.getTracesFolder().getTraces()) {
144 if (trace.getResource().equals(sourceResource)) {
145 source = trace;
146 break;
147 }
148 }
149 }
150 }
151 if (source instanceof TmfTraceElement) {
152 TmfTraceElement sourceTrace = (TmfTraceElement) source;
153 // If source trace is under an experiment, use the original trace from the traces folder
ab37ff41 154 sourceTrace = sourceTrace.getElementUnderTraceFolder();
9fa32496
BH
155 if (targetToUse instanceof TmfExperimentElement) {
156 TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
ab37ff41 157 ok |= drop(sourceTrace, targetExperiment, operation);
9fa32496
BH
158 } else if (targetToUse instanceof TmfTraceFolder) {
159 TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
ab37ff41 160 ok |= drop(sourceTrace, traceFolder, operation);
828e5592
PT
161 }
162 } else if (source instanceof IResource) {
163 IResource sourceResource = (IResource) source;
164 if (sourceResource.getType() != IResource.FILE && sourceResource.getType() != IResource.FOLDER) {
165 continue;
166 }
9fa32496
BH
167 if (targetToUse instanceof TmfExperimentElement) {
168 TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
ab37ff41 169 ok |= (drop(sourceResource, targetExperiment, operation) != null);
9fa32496
BH
170 } else if (targetToUse instanceof TmfTraceFolder) {
171 TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
ab37ff41 172 ok |= (drop(sourceResource, traceFolder, operation) != null);
828e5592
PT
173 }
174 }
175 }
176 } else if (aDropTargetEvent.data instanceof String[]) {
177 String[] sources = (String[]) aDropTargetEvent.data;
178 for (String source : sources) {
179 Path path = new Path(source);
9fa32496
BH
180 if (targetToUse instanceof TmfExperimentElement) {
181 TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
ab37ff41 182 ok |= drop(path, targetExperiment, operation);
9fa32496
BH
183 } else if (targetToUse instanceof TmfTraceFolder) {
184 TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
ab37ff41 185 ok |= drop(path, traceFolder, operation);
828e5592
PT
186 }
187 }
188 }
189 return (ok ? Status.OK_STATUS : Status.CANCEL_STATUS);
190 }
191
abbdd66a 192
e12ecd30 193 /**
ab37ff41 194 * Drop a trace by copying/linking a trace element in a target experiment
abbdd66a 195 *
e12ecd30
BH
196 * @param sourceTrace the source trace element to copy
197 * @param targetExperiment the target experiment
ab37ff41 198 * @param operation the drop operation (DND.DROP_COPY | DND.DROP_LINK)
e12ecd30
BH
199 * @return true if successful
200 */
abbdd66a 201 private static boolean drop(TmfTraceElement sourceTrace,
ab37ff41
PT
202 TmfExperimentElement targetExperiment,
203 int operation) {
abbdd66a 204
e12ecd30 205 IResource sourceResource = sourceTrace.getResource();
ab37ff41 206 IResource targetResource = drop(sourceResource, targetExperiment, operation);
abbdd66a 207
ab37ff41 208 if (targetResource != null) {
c9378fe3 209 if (! sourceTrace.getProject().equals(targetExperiment.getProject())) {
c2f1c5b6 210 IFolder destinationSupplementaryFolder = targetExperiment.getTraceSupplementaryFolder(targetResource.getName());
c9378fe3
PT
211 sourceTrace.copySupplementaryFolder(destinationSupplementaryFolder);
212 }
e12ecd30
BH
213 return true;
214 }
215 return false;
216 }
abbdd66a 217
828e5592 218 /**
ab37ff41 219 * Drop a trace by copying/linking a resource in a target experiment
abbdd66a 220 *
828e5592
PT
221 * @param sourceResource the source resource
222 * @param targetExperiment the target experiment
ab37ff41
PT
223 * @param operation the drop operation (DND.DROP_COPY | DND.DROP_LINK)
224 * @return the target resource or null if unsuccessful
828e5592 225 */
ab37ff41
PT
226 private static IResource drop(IResource sourceResource,
227 TmfExperimentElement targetExperiment,
228 int operation) {
9fa32496 229
ab37ff41 230 IResource traceResource = sourceResource;
9fa32496 231
c2f1c5b6
PT
232 IPath tracesFolderPath = targetExperiment.getProject().getTracesFolder().getPath();
233 if (tracesFolderPath.isPrefixOf(sourceResource.getFullPath())) {
234 String elementPath = sourceResource.getFullPath().makeRelativeTo(tracesFolderPath).toString();
235 for (TmfTraceElement trace : targetExperiment.getTraces()) {
236 if (trace.getElementPath().equals(elementPath)) {
237 return null;
238 }
828e5592 239 }
c2f1c5b6 240 } else {
ab37ff41 241 String targetName = sourceResource.getName();
c2f1c5b6
PT
242 for (ITmfProjectModelElement element : targetExperiment.getProject().getTracesFolder().getChildren()) {
243 if (element.getName().equals(targetName)) {
244 targetName = promptRename(element);
ab37ff41
PT
245 if (targetName == null) {
246 return null;
247 }
828e5592
PT
248 break;
249 }
250 }
ab37ff41 251 try {
83a22a5c 252 if (operation == DND.DROP_COPY && !sourceResource.isLinked()) {
ab37ff41
PT
253 IPath destination = targetExperiment.getProject().getTracesFolder().getResource().getFullPath().addTrailingSeparator().append(targetName);
254 sourceResource.copy(destination, false, null);
fedfc72a 255 cleanupBookmarks(destination);
ab37ff41
PT
256 } else {
257 createLink(targetExperiment.getProject().getTracesFolder().getResource(), sourceResource, targetName);
258 }
259 // use the copied resource for the experiment
260 if (sourceResource.getType() == IResource.FILE) {
261 traceResource = targetExperiment.getProject().getTracesFolder().getResource().getFile(targetName);
262 } else if (sourceResource.getType() == IResource.FOLDER) {
263 traceResource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(targetName);
828e5592 264 }
89730b51
PT
265 String sourceLocation = sourceResource.getPersistentProperty(TmfCommonConstants.SOURCE_LOCATION);
266 if (sourceLocation == null) {
267 sourceLocation = URIUtil.toUnencodedString(new File(sourceResource.getLocationURI()).toURI());
268 }
269 traceResource.setPersistentProperty(TmfCommonConstants.SOURCE_LOCATION, sourceLocation);
ab37ff41
PT
270 } catch (CoreException e) {
271 displayException(e);
272 return null;
828e5592
PT
273 }
274 }
ab37ff41 275 if (traceResource != null && traceResource.exists()) {
c3d27e8f 276 setTraceType(traceResource);
c2f1c5b6
PT
277 for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
278 if (trace.getResource().equals(traceResource)) {
279 targetExperiment.addTrace(trace);
280 targetExperiment.closeEditors();
281 targetExperiment.deleteSupplementaryResources();
282 break;
283 }
284 }
ab37ff41 285 return traceResource;
828e5592 286 }
ab37ff41 287 return null;
828e5592
PT
288 }
289
e12ecd30 290 /**
ab37ff41 291 * Drop a trace by copying/linking a trace element in a trace folder
abbdd66a 292 *
e12ecd30
BH
293 * @param sourceTrace the source trace
294 * @param traceFolder the target trace folder
ab37ff41 295 * @param operation the drop operation (DND.DROP_COPY | DND.DROP_LINK)
e12ecd30
BH
296 * @return true if successful
297 */
ab37ff41
PT
298 private static boolean drop(TmfTraceElement sourceTrace,
299 TmfTraceFolder traceFolder,
300 int operation) {
301
e12ecd30 302 IResource sourceResource = sourceTrace.getResource();
ab37ff41
PT
303 IResource targetResource = drop(sourceResource, traceFolder, operation);
304
305 if (targetResource != null) {
c2f1c5b6
PT
306 String elementPath = targetResource.getFullPath().makeRelativeTo(traceFolder.getProject().getTracesFolder().getPath()).toString();
307 IFolder destinationSupplementaryFolder = traceFolder.getTraceSupplementaryFolder(elementPath);
e12ecd30
BH
308 sourceTrace.copySupplementaryFolder(destinationSupplementaryFolder);
309 return true;
310 }
311 return false;
312 }
313
828e5592 314 /**
ab37ff41 315 * Drop a trace by copying/linking a resource in a trace folder
abbdd66a 316 *
828e5592
PT
317 * @param sourceResource the source resource
318 * @param traceFolder the target trace folder
ab37ff41
PT
319 * @param operation the drop operation (DND.DROP_COPY | DND.DROP_LINK)
320 * @return the target resource or null if unsuccessful
828e5592 321 */
ab37ff41
PT
322 private static IResource drop(IResource sourceResource,
323 TmfTraceFolder traceFolder,
324 int operation) {
e12ecd30 325
83a22a5c 326 if (sourceResource.getParent().equals(traceFolder.getResource())) {
ab37ff41
PT
327 return null;
328 }
329 String targetName = sourceResource.getName();
c2f1c5b6
PT
330 for (ITmfProjectModelElement element : traceFolder.getChildren()) {
331 if (element.getName().equals(targetName)) {
332 targetName = promptRename(element);
ab37ff41
PT
333 if (targetName == null) {
334 return null;
335 }
828e5592
PT
336 break;
337 }
338 }
ab37ff41 339 try {
83a22a5c 340 if (operation == DND.DROP_COPY && !sourceResource.isLinked()) {
ab37ff41 341 IPath destination = traceFolder.getResource().getFullPath().addTrailingSeparator().append(targetName);
828e5592 342 sourceResource.copy(destination, false, null);
fedfc72a 343 cleanupBookmarks(destination);
ab37ff41
PT
344 } else {
345 createLink(traceFolder.getResource(), sourceResource, targetName);
828e5592 346 }
c3d27e8f 347 IResource traceResource = traceFolder.getResource().findMember(targetName);
83a22a5c
PT
348 if (traceResource != null && traceResource.exists()) {
349 String sourceLocation = sourceResource.getPersistentProperty(TmfCommonConstants.SOURCE_LOCATION);
350 if (sourceLocation == null) {
351 sourceLocation = URIUtil.toUnencodedString(new File(sourceResource.getLocationURI()).toURI());
352 }
353 traceResource.setPersistentProperty(TmfCommonConstants.SOURCE_LOCATION, sourceLocation);
354 setTraceType(traceResource);
89730b51 355 }
c3d27e8f 356 return traceResource;
ab37ff41
PT
357 } catch (CoreException e) {
358 displayException(e);
828e5592 359 }
ab37ff41 360 return null;
828e5592 361 }
abbdd66a 362
828e5592 363 /**
ab37ff41 364 * Drop a trace by importing/linking a path in a target experiment
abbdd66a 365 *
828e5592
PT
366 * @param path the source path
367 * @param targetExperiment the target experiment
ab37ff41 368 * @param operation the drop operation (DND.DROP_COPY | DND.DROP_LINK)
828e5592
PT
369 * @return true if successful
370 */
ab37ff41
PT
371 private static boolean drop(Path path,
372 TmfExperimentElement targetExperiment,
373 int operation) {
abbdd66a 374
c2f1c5b6
PT
375 IPath tracesFolderPath = targetExperiment.getProject().getTracesFolder().getResource().getLocation();
376 IResource traceResource = null;
377 if (tracesFolderPath.isPrefixOf(path)) {
378 String elementPath = path.makeRelativeTo(tracesFolderPath).toString();
379 for (TmfTraceElement trace : targetExperiment.getTraces()) {
380 if (trace.getElementPath().equals(elementPath)) {
381 return false;
382 }
828e5592 383 }
c2f1c5b6
PT
384 traceResource = targetExperiment.getProject().getTracesFolder().getResource().findMember(elementPath);
385 } else {
386 String targetName = path.lastSegment();
387 for (ITmfProjectModelElement element : targetExperiment.getProject().getTracesFolder().getChildren()) {
388 if (element.getName().equals(targetName)) {
389 targetName = promptRename(element);
ab37ff41
PT
390 if (targetName == null) {
391 return false;
392 }
828e5592
PT
393 break;
394 }
395 }
ab37ff41 396 if (operation == DND.DROP_COPY) {
c2f1c5b6 397 importTrace(targetExperiment.getProject().getTracesFolder().getResource(), path, targetName);
ab37ff41 398 } else {
c2f1c5b6 399 createLink(targetExperiment.getProject().getTracesFolder().getResource(), path, targetName);
828e5592 400 }
ab37ff41 401 // use the copied resource for the experiment
c2f1c5b6 402 File file = new File(path.toString());
828e5592 403 if (file.exists() && file.isFile()) {
c2f1c5b6 404 traceResource = targetExperiment.getProject().getTracesFolder().getResource().getFile(targetName);
828e5592 405 } else if (file.exists() && file.isDirectory()) {
c2f1c5b6
PT
406 traceResource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(targetName);
407 }
408 }
409 if (traceResource != null && traceResource.exists()) {
410 try {
411 String sourceLocation = URIUtil.toUnencodedString(path.toFile().toURI());
412 traceResource.setPersistentProperty(TmfCommonConstants.SOURCE_LOCATION, sourceLocation);
413 } catch (CoreException e) {
414 displayException(e);
828e5592 415 }
c2f1c5b6
PT
416 setTraceType(traceResource);
417 for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
418 if (trace.getResource().equals(traceResource)) {
419 targetExperiment.addTrace(trace);
420 targetExperiment.closeEditors();
421 targetExperiment.deleteSupplementaryResources();
422 break;
89730b51 423 }
828e5592 424 }
c2f1c5b6 425 return true;
828e5592
PT
426 }
427 return false;
428 }
429
430 /**
ab37ff41 431 * Drop a trace by importing/linking a path in a trace folder
abbdd66a 432 *
828e5592
PT
433 * @param path the source path
434 * @param traceFolder the target trace folder
ab37ff41 435 * @param operation the drop operation (DND.DROP_COPY | DND.DROP_LINK)
828e5592
PT
436 * @return true if successful
437 */
ab37ff41
PT
438 private static boolean drop(Path path,
439 TmfTraceFolder traceFolder,
440 int operation) {
441
442 String targetName = path.lastSegment();
c2f1c5b6
PT
443 for (ITmfProjectModelElement element : traceFolder.getChildren()) {
444 if (element.getName().equals(targetName)) {
445 targetName = promptRename(element);
ab37ff41
PT
446 if (targetName == null) {
447 return false;
448 }
828e5592
PT
449 break;
450 }
451 }
ab37ff41
PT
452 if (operation == DND.DROP_COPY) {
453 importTrace(traceFolder.getResource(), path, targetName);
454 } else {
455 createLink(traceFolder.getResource(), path, targetName);
828e5592 456 }
c3d27e8f 457 IResource traceResource = traceFolder.getResource().findMember(targetName);
83a22a5c
PT
458 if (traceResource != null && traceResource.exists()) {
459 try {
460 String sourceLocation = URIUtil.toUnencodedString(path.toFile().toURI());
461 traceResource.setPersistentProperty(TmfCommonConstants.SOURCE_LOCATION, sourceLocation);
462 } catch (CoreException e) {
463 displayException(e);
464 }
465 setTraceType(traceResource);
89730b51 466 }
ab37ff41 467 return true;
828e5592
PT
468 }
469
470 /**
471 * Import a trace to the trace folder
abbdd66a 472 *
ab37ff41 473 * @param folder the trace folder resource
828e5592 474 * @param path the path to the trace to import
ab37ff41 475 * @param targetName the target name
828e5592 476 */
ab37ff41
PT
477 private static void importTrace(final IFolder folder, final Path path, final String targetName) {
478 final File source = new File(path.toString());
479 if (source.isDirectory()) {
480 IPath containerPath = folder.getFullPath().addTrailingSeparator().append(targetName);
481 IOverwriteQuery overwriteImplementor = new IOverwriteQuery() {
482 @Override
483 public String queryOverwrite(String pathString) {
484 return IOverwriteQuery.NO_ALL;
485 }
486 };
487 List<File> filesToImport = Arrays.asList(source.listFiles());
488 ImportOperation operation = new ImportOperation(
489 containerPath,
490 source,
491 FileSystemStructureProvider.INSTANCE,
492 overwriteImplementor,
493 filesToImport);
494 operation.setCreateContainerStructure(false);
495 try {
496 operation.run(new NullProgressMonitor());
497 } catch (InvocationTargetException e) {
498 displayException(e);
499 } catch (InterruptedException e) {
500 displayException(e);
501 }
502 } else {
503 IRunnableWithProgress runnable = new IRunnableWithProgress() {
504 @Override
505 public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
506 try {
507 InputStream inputStream = new FileInputStream(source);
508 IFile targetFile = folder.getFile(targetName);
509 targetFile.create(inputStream, IResource.NONE, monitor);
510 } catch (CoreException e) {
511 displayException(e);
512 } catch (FileNotFoundException e) {
513 displayException(e);
514 }
515 }
516 };
517 WorkspaceModifyDelegatingOperation operation = new WorkspaceModifyDelegatingOperation(runnable);
518 try {
519 operation.run(new NullProgressMonitor());
520 } catch (InvocationTargetException e) {
521 displayException(e);
522 } catch (InterruptedException e) {
523 displayException(e);
828e5592 524 }
828e5592 525 }
abbdd66a 526 }
fedfc72a 527
828e5592
PT
528 /**
529 * Create a link to the actual trace and set the trace type
abbdd66a 530 *
828e5592
PT
531 * @param parentFolder the parent folder
532 * @param resource the resource
ab37ff41 533 * @param targetName the target name
828e5592 534 */
ab37ff41 535 private static void createLink(IFolder parentFolder, IResource resource, String targetName) {
828e5592
PT
536 IPath location = resource.getLocation();
537 IWorkspace workspace = ResourcesPlugin.getWorkspace();
538 try {
539 Map<QualifiedName, String> properties = resource.getPersistentProperties();
e12ecd30 540 String traceType = properties.get(TmfCommonConstants.TRACETYPE);
d1087bc2 541 TraceTypeHelper traceTypeHelper = TmfTraceType.getInstance().getTraceType(traceType);
e12ecd30 542
828e5592 543 if (resource instanceof IFolder) {
ab37ff41 544 IFolder folder = parentFolder.getFolder(targetName);
828e5592
PT
545 if (workspace.validateLinkLocation(folder, location).isOK()) {
546 folder.createLink(location, IResource.REPLACE, null);
d1087bc2
PT
547 if (traceTypeHelper != null) {
548 TmfTraceTypeUIUtils.setTraceType(folder, traceTypeHelper);
549 }
828e5592 550 } else {
8fd82db5 551 Activator.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
828e5592
PT
552 }
553 } else {
ab37ff41 554 IFile file = parentFolder.getFile(targetName);
828e5592
PT
555 if (workspace.validateLinkLocation(file, location).isOK()) {
556 file.createLink(location, IResource.REPLACE, null);
d1087bc2
PT
557 if (traceTypeHelper != null) {
558 TmfTraceTypeUIUtils.setTraceType(file, traceTypeHelper);
559 }
828e5592 560 } else {
8fd82db5 561 Activator.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
828e5592
PT
562 }
563 }
564 } catch (CoreException e) {
565 displayException(e);
566 }
567 }
568
ab37ff41
PT
569 /**
570 * Create a link to a file or folder
571 *
572 * @param parentFolder the parent folder
573 * @param source the file or folder
574 * @param targetName the target name
575 */
576 private static void createLink(IFolder parentFolder, IPath location, String targetName) {
577 File source = new File(location.toString());
578 IWorkspace workspace = ResourcesPlugin.getWorkspace();
579 try {
580
581 if (source.isDirectory()) {
582 IFolder folder = parentFolder.getFolder(targetName);
583 if (workspace.validateLinkLocation(folder, location).isOK()) {
584 folder.createLink(location, IResource.REPLACE, null);
585 } else {
586 Activator.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
587 }
588 } else {
589 IFile file = parentFolder.getFile(targetName);
590 if (workspace.validateLinkLocation(file, location).isOK()) {
591 file.createLink(location, IResource.REPLACE, null);
592 } else {
593 Activator.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
594 }
595 }
596 } catch (CoreException e) {
597 displayException(e);
598 }
599 }
600
601 /**
602 * Prompts the user to rename a trace
603 *
c2f1c5b6 604 * @param element the conflicting element
ab37ff41
PT
605 * @return the new name to use or null if rename is canceled
606 */
c2f1c5b6 607 private static String promptRename(ITmfProjectModelElement element) {
ab37ff41
PT
608 MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.ICON_QUESTION | SWT.CANCEL | SWT.OK);
609 mb.setText(Messages.DropAdapterAssistant_RenameTraceTitle);
c2f1c5b6 610 mb.setMessage(NLS.bind(Messages.DropAdapterAssistant_RenameTraceMessage, element.getName()));
ab37ff41
PT
611 if (mb.open() != SWT.OK) {
612 return null;
613 }
c2f1c5b6 614 IContainer folder = element.getResource().getParent();
ab37ff41
PT
615 int i = 2;
616 while (true) {
c2f1c5b6 617 String name = element.getName() + '(' + Integer.toString(i++) + ')';
ab37ff41
PT
618 IResource resource = folder.findMember(name);
619 if (resource == null) {
620 return name;
621 }
622 }
623 }
624
fedfc72a
PT
625 /**
626 * Cleanup bookmarks file in copied trace
627 */
abbdd66a 628 private static void cleanupBookmarks(IPath path) {
fedfc72a
PT
629 IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
630 if (folder.exists()) {
631 try {
632 for (IResource member : folder.members()) {
e12ecd30 633 if (TmfTrace.class.getCanonicalName().equals(member.getPersistentProperty(TmfCommonConstants.TRACETYPE))) {
fedfc72a
PT
634 member.delete(true, null);
635 }
636 }
637 } catch (CoreException e) {
638 displayException(e);
639 }
640 }
641 }
642
c3d27e8f
PT
643 private static void setTraceType(IResource traceResource) {
644 try {
7154851d
PT
645 String traceType = traceResource.getPersistentProperties().get(TmfCommonConstants.TRACETYPE);
646 TraceTypeHelper traceTypeHelper = TmfTraceType.getInstance().getTraceType(traceType);
647 if (traceTypeHelper == null) {
648 traceTypeHelper = TmfTraceTypeUIUtils.selectTraceType(traceResource.getLocationURI().getPath(), null, null);
649 }
c3d27e8f 650 if (traceTypeHelper != null) {
a6e37e4c 651 TmfTraceTypeUIUtils.setTraceType(traceResource, traceTypeHelper);
c3d27e8f
PT
652 }
653 } catch (TmfTraceImportException e) {
654 } catch (CoreException e) {
655 displayException(e);
656 }
657 }
658
828e5592
PT
659 /**
660 * Display an exception in a message box
abbdd66a 661 *
828e5592
PT
662 * @param e the exception
663 */
abbdd66a 664 private static void displayException(Exception e) {
828e5592
PT
665 MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
666 mb.setText(e.getClass().getName());
667 mb.setMessage(e.getMessage());
668 mb.open();
669 }
670
671}
This page took 0.08104 seconds and 5 git commands to generate.