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) {
}
}