Package archmapper.main.ui

Source Code of archmapper.main.ui.GenerateArchitectureGraphAction

package archmapper.main.ui;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ListDialog;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import archmapper.main.codegenerator.GenericSourcecodeGenerator;
import archmapper.main.exceptions.ArchMapperException;
import archmapper.main.model.ArchitectureMappingCache;
import archmapper.main.model.ArchitectureMappingModel;
import archmapper.main.model.architecture.DotGraphExporter;


public class GenerateArchitectureGraphAction implements IWorkbenchWindowActionDelegate {
  private IWorkbenchWindow window;
 
 
  public void dispose() {
  }

  public void init(IWorkbenchWindow window) {
    this.window = window;
  }

  public void run(IAction action) {
    List<IProject> javaProjects = GenericSourcecodeGenerator.getSelectableProjects();
    if (javaProjects.size() == 0) {
      MessageDialog.openError(window.getShell(), "Error",
          "No java project is currently open in the workspace. Please create one.");
      return;
    }
   
    ListDialog dlg = new ListDialog(window.getShell());
    dlg.setTitle("Please select the project for which to create an architecture graph");
    dlg.setInput(javaProjects);
    dlg.setLabelProvider(new WorkbenchLabelProvider());
    dlg.setContentProvider(new ArrayContentProvider());
    if (dlg.open() == ListDialog.CANCEL) {
      return;
    }
   
    final Object[] selected = dlg.getResult();
    if (selected == null || selected.length == 0) {
      return;
    }
   
    final IProject project = (IProject) selected[0];
   
    FileDialog fd = new FileDialog(window.getShell(), SWT.SAVE);
    fd.setText("Please select a location for the generated .dot file");
    final String filename = fd.open();
   
    if (filename == null) {
      return;
    }
   
   
    Job job = new WorkspaceJob("Generate architecture graph") {
      @Override
      public IStatus runInWorkspace(IProgressMonitor monitor) {
        monitor.beginTask("Loading architecture", IProgressMonitor.UNKNOWN);
       
        ArchitectureMappingModel model = null;
        try {
          model = ArchitectureMappingCache.getArchitectureMappingModel(project);
          if (model == null) {
            return Status.CANCEL_STATUS;
          }
        } catch (ArchMapperException e) {
          showErrorAsync("Error reading architecture: "+ e.getMessage());
          e.printStackTrace();
          return Status.CANCEL_STATUS;
        }
       
        monitor.beginTask("Generating graph definition file", IProgressMonitor.UNKNOWN);
       
        String def = new DotGraphExporter().getDotGraphDefinition(model.getArchitecture());
       
        File out = new File(filename);
        try {
          FileWriter writer = new FileWriter(out);
          writer.write(def);
          writer.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
       
        return Status.OK_STATUS;
      }
    };
   
    job.setUser(true);
    job.schedule();
    job.addJobChangeListener(new JobChangeAdapter() {
      @Override
      public void done(IJobChangeEvent event) {
        Display.getDefault().asyncExec(new Runnable() {
          public void run() {
            MessageDialog.openInformation(window.getShell(), "Finished",
                "The architecture graph definition file has been created. You can now use dot to generate a graphic file from the definition.");
          }
        });
      }
    });
  }
 
  public void showErrorAsync(final String text) {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", text);
      }
    });
  }
 

  public void selectionChanged(IAction action, ISelection selection) {
  }

}
TOP

Related Classes of archmapper.main.ui.GenerateArchitectureGraphAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.