1   package com.stateofflow.eclipse.metrics.export.wizard;
2   
3   import java.io.IOException;
4   import java.lang.reflect.InvocationTargetException;
5   
6   import org.eclipse.core.resources.IProject;
7   import org.eclipse.core.resources.IResource;
8   import org.eclipse.core.resources.IWorkspaceRoot;
9   import org.eclipse.core.resources.ResourcesPlugin;
10  import org.eclipse.core.runtime.CoreException;
11  import org.eclipse.core.runtime.IProgressMonitor;
12  import org.eclipse.core.runtime.IStatus;
13  import org.eclipse.core.runtime.Path;
14  import org.eclipse.core.runtime.Status;
15  import org.eclipse.jdt.core.IJavaElement;
16  import org.eclipse.jdt.core.IJavaProject;
17  import org.eclipse.jdt.core.JavaCore;
18  import org.eclipse.jface.operation.IRunnableWithProgress;
19  
20  import com.stateofflow.eclipse.metrics.MetricsBuilder;
21  import com.stateofflow.eclipse.metrics.MetricsPlugin;
22  import com.stateofflow.eclipse.metrics.export.Exporter;
23  
24  final class ExportRunnable implements IRunnableWithProgress {
25      private final Exporter[] exporters;
26      private final String project;
27  
28      public ExportRunnable(final Exporter[] exporters, final String project) {
29          this.exporters = exporters;
30          this.project = project;
31      }
32  
33      private void doFinish(final String projectName, final Exporter[] exporters, final IProgressMonitor monitor) throws Exception {
34          final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
35          final IResource resource = root.findMember(new Path(projectName));
36          final IJavaProject javaProject = JavaCore.create(resource).getJavaProject();
37          validateProject(projectName, javaProject);
38  
39          final IProject project = javaProject.getProject();
40  
41          startExport(exporters, monitor, project);
42      }
43  
44      public void run(final IProgressMonitor monitor) throws InvocationTargetException {
45          try {
46              doFinish(project, exporters, monitor);
47          } catch (final Exception e) {
48              throw new InvocationTargetException(e);
49          } finally {
50              monitor.done();
51          }
52      }
53  
54      private void startExport(final Exporter[] exporters, final IProgressMonitor monitor, final IProject project) throws Exception {
55          try {
56              new MetricsBuilder().export(project, exporters, monitor);
57          } catch (final IOException ioex) {
58              throw new CoreException(new Status(IStatus.ERROR, "Failed to write metrics", IStatus.OK, ioex.getMessage(), ioex));
59          }
60      }
61  
62      private void validateProject(final String projectName, final IJavaElement project) throws CoreException {
63          if (project == null || !project.exists() || !(project instanceof IJavaProject)) {
64              throw new CoreException(new Status(IStatus.ERROR, MetricsPlugin.PLUGIN_ID, IStatus.OK, "Java Project \"" + projectName + "\" does not exist.", null));
65          }
66      }
67  }
68