Fix ResourceException on drop trace to experiment.
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / internal / tmf / ui / project / handlers / DropAdapterAssistant.java
index 8139af18a0322ff338041c594d7ffbaeba8f0c5f..9c107950334866f33f339a23585703cc877be805 100644 (file)
@@ -32,6 +32,8 @@ import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.linuxtools.internal.tmf.ui.TmfUiPlugin;
+import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
 import org.eclipse.linuxtools.tmf.ui.project.model.ITmfProjectModelElement;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
@@ -108,16 +110,19 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
     public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
         boolean ok = false;
 
+        // Use local variable to avoid parameter assignment
+        Object targetToUse = aTarget;
+
         // If target is a trace, use its parent (either trace folder or experiment)
-        if (aTarget instanceof TmfTraceElement) {
-            aTarget = ((TmfTraceElement) aTarget).getParent();
+        if (targetToUse instanceof TmfTraceElement) {
+            targetToUse = ((TmfTraceElement) targetToUse).getParent();
         }
 
         // If target is a project, use its trace folder
-        if (aTarget instanceof IProject) {
-            TmfProjectElement projectElement = TmfProjectRegistry.getProject((IProject) aTarget);
+        if (targetToUse instanceof IProject) {
+            TmfProjectElement projectElement = TmfProjectRegistry.getProject((IProject) targetToUse);
             if (projectElement != null) {
-                aTarget = projectElement.getTracesFolder();
+                targetToUse = projectElement.getTracesFolder();
             }
         }
 
@@ -148,24 +153,23 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
                             }
                         }
                     }
-                    IResource sourceResource = sourceTrace.getResource();
-                    if (aTarget instanceof TmfExperimentElement) {
-                        TmfExperimentElement targetExperiment = (TmfExperimentElement) aTarget;
-                        ok |= drop(sourceResource, targetExperiment);
-                    } else if (aTarget instanceof TmfTraceFolder) {
-                        TmfTraceFolder traceFolder = (TmfTraceFolder) aTarget;
-                        ok |= drop(sourceResource, traceFolder);
+                    if (targetToUse instanceof TmfExperimentElement) {
+                        TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
+                        ok |= drop(sourceTrace, targetExperiment);
+                    } else if (targetToUse instanceof TmfTraceFolder) {
+                        TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
+                        ok |= drop(sourceTrace, traceFolder);
                     }
                 } else if (source instanceof IResource) {
                     IResource sourceResource = (IResource) source;
                     if (sourceResource.getType() != IResource.FILE && sourceResource.getType() != IResource.FOLDER) {
                         continue;
                     }
-                    if (aTarget instanceof TmfExperimentElement) {
-                        TmfExperimentElement targetExperiment = (TmfExperimentElement) aTarget;
+                    if (targetToUse instanceof TmfExperimentElement) {
+                        TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
                         ok |= drop(sourceResource, targetExperiment);
-                    } else if (aTarget instanceof TmfTraceFolder) {
-                        TmfTraceFolder traceFolder = (TmfTraceFolder) aTarget;
+                    } else if (targetToUse instanceof TmfTraceFolder) {
+                        TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
                         ok |= drop(sourceResource, traceFolder);
                     }
                 }
@@ -174,11 +178,11 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
             String[] sources = (String[]) aDropTargetEvent.data;
             for (String source : sources) {
                 Path path = new Path(source);
-                if (aTarget instanceof TmfExperimentElement) {
-                    TmfExperimentElement targetExperiment = (TmfExperimentElement) aTarget;
+                if (targetToUse instanceof TmfExperimentElement) {
+                    TmfExperimentElement targetExperiment = (TmfExperimentElement) targetToUse;
                     ok |= drop(path, targetExperiment);
-                } else if (aTarget instanceof TmfTraceFolder) {
-                    TmfTraceFolder traceFolder = (TmfTraceFolder) aTarget;
+                } else if (targetToUse instanceof TmfTraceFolder) {
+                    TmfTraceFolder traceFolder = (TmfTraceFolder) targetToUse;
                     ok |= drop(path, traceFolder);
                 }
             }
@@ -186,6 +190,28 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
         return (ok ? Status.OK_STATUS : Status.CANCEL_STATUS);
     }
 
+    
+    /**
+     * Drop a trace by copying a resource in a target experiment
+     * 
+     * @param sourceTrace the source trace element to copy
+     * @param targetExperiment the target experiment
+     * @return true if successful
+     */
+    private boolean drop(TmfTraceElement sourceTrace, TmfExperimentElement targetExperiment) {
+        
+        IResource sourceResource = sourceTrace.getResource();
+        
+        if (drop(sourceResource, targetExperiment)) {
+            IFolder destinationSupplementaryFolder = targetExperiment.getTraceSupplementaryFolder(sourceResource.getName());
+            if (!destinationSupplementaryFolder.exists()) {
+                sourceTrace.copySupplementaryFolder(destinationSupplementaryFolder);
+            }
+            return true;
+        }
+        return false;
+    }
+    
     /**
      * Drop a trace by copying a resource in a target experiment
      * 
@@ -195,30 +221,34 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
      */
     private boolean drop(IResource sourceResource, TmfExperimentElement targetExperiment) {
         boolean doit = true;
-        TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResource.getProject());
+
+        //Use local variable to avoid parameter assignment
+        IResource sourceResourceToUse = sourceResource;
+
+        TmfProjectElement projectElement = TmfProjectRegistry.getProject(sourceResourceToUse.getProject());
         for (TmfTraceElement trace : targetExperiment.getTraces()) {
-            if (trace.getName().equals(sourceResource.getName())) {
+            if (trace.getName().equals(sourceResourceToUse.getName())) {
                 doit = false;
                 break;
             }
         }
         if (doit && !targetExperiment.getProject().equals(projectElement)) {
             for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
-                if (trace.getName().equals(sourceResource.getName())) {
+                if (trace.getName().equals(sourceResourceToUse.getName())) {
                     doit = false;
                     break;
                 }
             }
             if (doit) {
                 try {
-                    IPath destination = targetExperiment.getProject().getTracesFolder().getResource().getFullPath().addTrailingSeparator().append(sourceResource.getName());
-                    sourceResource.copy(destination, false, null);
+                    IPath destination = targetExperiment.getProject().getTracesFolder().getResource().getFullPath().addTrailingSeparator().append(sourceResourceToUse.getName());
+                    sourceResourceToUse.copy(destination, false, null);
                     cleanupBookmarks(destination);
                     // use the copied resource for the experiment
-                    if (sourceResource.getType() == IResource.FILE) {
-                        sourceResource = targetExperiment.getProject().getTracesFolder().getResource().getFile(sourceResource.getName());
-                    } else if (sourceResource.getType() == IResource.FOLDER) {
-                        sourceResource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(sourceResource.getName());
+                    if (sourceResourceToUse.getType() == IResource.FILE) {
+                        sourceResourceToUse = targetExperiment.getProject().getTracesFolder().getResource().getFile(sourceResourceToUse.getName());
+                    } else if (sourceResourceToUse.getType() == IResource.FOLDER) {
+                        sourceResourceToUse = targetExperiment.getProject().getTracesFolder().getResource().getFolder(sourceResourceToUse.getName());
                     }
                 } catch (CoreException e) {
                     doit = false;
@@ -227,14 +257,31 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
             }
         }
         if (doit) {
-            if (sourceResource != null && sourceResource.exists()) {
-                createLink(targetExperiment.getResource(), sourceResource);
+            if (sourceResourceToUse != null && sourceResourceToUse.exists()) {
+                createLink(targetExperiment.getResource(), sourceResourceToUse);
                 return true;
             }
         }
         return false;
     }
 
+    /**
+     * Drop a trace by copying it's a trace element in a trace folder
+     * 
+     * @param sourceTrace the source trace
+     * @param traceFolder the target trace folder
+     * @return true if successful
+     */
+    private boolean drop(TmfTraceElement sourceTrace, TmfTraceFolder traceFolder) {
+        IResource sourceResource = sourceTrace.getResource();
+        if (drop(sourceResource, traceFolder)) {
+            IFolder destinationSupplementaryFolder = traceFolder.getTraceSupplementaryFolder(sourceResource.getName());
+            sourceTrace.copySupplementaryFolder(destinationSupplementaryFolder);
+            return true;
+        }
+        return false;
+    }
+
     /**
      * Drop a trace by copying a resource in a trace folder
      * 
@@ -244,6 +291,7 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
      */
     private boolean drop(IResource sourceResource, TmfTraceFolder traceFolder) {
         boolean doit = true;
+
         for (TmfTraceElement trace : traceFolder.getTraces()) {
             if (trace.getName().equals(sourceResource.getName())) {
                 doit = false;
@@ -254,6 +302,7 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
             try {
                 IPath destination = traceFolder.getResource().getFullPath().addTrailingSeparator().append(sourceResource.getName());
                 sourceResource.copy(destination, false, null);
+
                 cleanupBookmarks(destination);
                 return true;
             } catch (CoreException e) {
@@ -262,7 +311,7 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
         }
         return false;
     }
-
+    
     /**
      * Drop a trace by importing a path in a target experiment
      * 
@@ -272,32 +321,36 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
      */
     private boolean drop(Path path, TmfExperimentElement targetExperiment) {
         boolean doit = true;
+        
+        // Use local variable to avoid parameter assignment
+        Path pathToUse = path;
+
         for (TmfTraceElement trace : targetExperiment.getTraces()) {
-            if (trace.getName().equals(path.lastSegment())) {
+            if (trace.getName().equals(pathToUse.lastSegment())) {
                 doit = false;
                 break;
             }
         }
-        if (doit && !path.toString().startsWith(targetExperiment.getProject().getResource().getLocation().toString())) {
+        if (doit && !pathToUse.toString().startsWith(targetExperiment.getProject().getResource().getLocation().toString())) {
             for (TmfTraceElement trace : targetExperiment.getProject().getTracesFolder().getTraces()) {
-                if (trace.getName().equals(path.lastSegment())) {
+                if (trace.getName().equals(pathToUse.lastSegment())) {
                     doit = false;
                     break;
                 }
             }
             if (doit) {
-                importTrace(targetExperiment.getProject().getTracesFolder().getResource(), path);
+                importTrace(targetExperiment.getProject().getTracesFolder().getResource(), pathToUse);
                 // use the imported trace for the experiment
-                path = new Path(targetExperiment.getProject().getTracesFolder().getResource().getFile(path.lastSegment()).getLocation().toString());
+                pathToUse = new Path(targetExperiment.getProject().getTracesFolder().getResource().getFile(pathToUse.lastSegment()).getLocation().toString());
             }
         }
         if (doit) {
             IResource resource = null;
-            File file = new File(path.toString());
+            File file = new File(pathToUse.toString());
             if (file.exists() && file.isFile()) {
-                resource = targetExperiment.getProject().getTracesFolder().getResource().getFile(path.lastSegment());
+                resource = targetExperiment.getProject().getTracesFolder().getResource().getFile(pathToUse.lastSegment());
             } else if (file.exists() && file.isDirectory()) {
-                resource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(path.lastSegment());
+                resource = targetExperiment.getProject().getTracesFolder().getResource().getFolder(pathToUse.lastSegment());
             }
             if (resource != null && resource.exists()) {
                 createLink(targetExperiment.getResource(), resource);
@@ -374,26 +427,28 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
         IWorkspace workspace = ResourcesPlugin.getWorkspace();
         try {
             Map<QualifiedName, String> properties = resource.getPersistentProperties();
-            String bundleName = properties.get(TmfTraceElement.TRACEBUNDLE);
-            String traceType = properties.get(TmfTraceElement.TRACETYPE);
-            String iconUrl = properties.get(TmfTraceElement.TRACEICON);
-            
+            String bundleName = properties.get(TmfCommonConstants.TRACEBUNDLE);
+            String traceType = properties.get(TmfCommonConstants.TRACETYPE);
+            String iconUrl = properties.get(TmfCommonConstants.TRACEICON);
+            String supplFolder = properties.get(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER);
+
             if (resource instanceof IFolder) {
                 IFolder folder = parentFolder.getFolder(resource.getName());
                 if (workspace.validateLinkLocation(folder, location).isOK()) {
                     folder.createLink(location, IResource.REPLACE, null);
-                    setProperties(folder, bundleName, traceType, iconUrl);
+                    setProperties(folder, bundleName, traceType, iconUrl, supplFolder);
 
                 } else {
-                    System.out.println("Invalid Trace Location"); //$NON-NLS-1$
+                    TmfUiPlugin.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
                 }
             } else {
                 IFile file = parentFolder.getFile(resource.getName());
+                
                 if (workspace.validateLinkLocation(file, location).isOK()) {
                     file.createLink(location, IResource.REPLACE, null);
-                    setProperties(file, bundleName, traceType, iconUrl);
+                    setProperties(file, bundleName, traceType, iconUrl, supplFolder);
                 } else {
-                    System.out.println("Invalid Trace Location"); //$NON-NLS-1$
+                    TmfUiPlugin.getDefault().logError("Invalid Trace Location"); //$NON-NLS-1$
                 }
             }
         } catch (CoreException e) {
@@ -409,7 +464,7 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
         if (folder.exists()) {
             try {
                 for (IResource member : folder.members()) {
-                    if (TmfTrace.class.getCanonicalName().equals(member.getPersistentProperty(TmfTraceElement.TRACETYPE))) {
+                    if (TmfTrace.class.getCanonicalName().equals(member.getPersistentProperty(TmfCommonConstants.TRACETYPE))) {
                         member.delete(true, null);
                     }
                 }
@@ -426,12 +481,14 @@ public class DropAdapterAssistant extends CommonDropAdapterAssistant {
      * @param bundleName the bundle name
      * @param traceType the trace type
      * @param iconUrl the icon URL
+     * @param supplFolder the directory of the directory for supplementary information or null to ignore the property 
      * @throws CoreException
      */
-    private void setProperties(IResource resource, String bundleName, String traceType, String iconUrl) throws CoreException {
-        resource.setPersistentProperty(TmfTraceElement.TRACEBUNDLE, bundleName);
-        resource.setPersistentProperty(TmfTraceElement.TRACETYPE, traceType);
-        resource.setPersistentProperty(TmfTraceElement.TRACEICON, iconUrl);
+    private void setProperties(IResource resource, String bundleName, String traceType, String iconUrl, String supplFolder) throws CoreException {
+        resource.setPersistentProperty(TmfCommonConstants.TRACEBUNDLE, bundleName);
+        resource.setPersistentProperty(TmfCommonConstants.TRACETYPE, traceType);
+        resource.setPersistentProperty(TmfCommonConstants.TRACEICON, iconUrl);
+        resource.setPersistentProperty(TmfCommonConstants.TRACE_SUPPLEMENTARY_FOLDER, supplFolder);
     }
 
     /**
This page took 0.029794 seconds and 5 git commands to generate.