/* * Contributions to FindBugs * Copyright (C) 2008, Tomas Pollak, Andrei Loskutov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package de.tobject.findbugs.actions; import java.io.File; import java.io.IOException; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import de.tobject.findbugs.FindBugsJob; import de.tobject.findbugs.FindbugsPlugin; import edu.umd.cs.findbugs.BugCollection; public class SaveXmlAction extends FindBugsAction { private static final String DIALOG_SETTINGS_SECTION = "SaveXMLDialogSettings"; //$NON-NLS-1$ private static final String SAVE_XML_PATH_KEY = "SaveXMLPathSetting"; //$NON-NLS-1$ /* * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) */ @Override public void run(final IAction action) { if (!(selection instanceof IStructuredSelection) || selection.isEmpty()) { return; } IStructuredSelection structuredSelection = (IStructuredSelection) selection; IProject project = getProject(structuredSelection); if (project == null) { return; } // Get the file name from a file dialog FileDialog fileDialog = createFileDialog(project); boolean validFileName = false; do { String fileName = openFileDialog(fileDialog); if (fileName == null) { // User cancelled break; } validFileName = validateSelectedFileName(fileName); if (!validFileName) { MessageDialog.openWarning(Display.getDefault().getActiveShell(), "Warning", fileName + " is not a file or is not writable!"); continue; } if (new File(fileName).exists()) { if (!MessageDialog.openQuestion(Display.getDefault().getActiveShell(), "Warning", fileName + " already exists. Override?")) { continue; } } getDialogSettings().put(SAVE_XML_PATH_KEY, fileName); work(project, fileName); } while (!validFileName); } protected String openFileDialog(FileDialog dialog) { return dialog.open(); } private FileDialog createFileDialog(IProject project) { FileDialog fileDialog = new FileDialog(FindbugsPlugin.getShell(), SWT.APPLICATION_MODAL | SWT.SAVE); fileDialog.setText("Select bug result xml for project: " + project.getName()); String initialFileName = getDialogSettings().get(SAVE_XML_PATH_KEY); if (initialFileName != null && initialFileName.length() > 0) { File initialFile = new File(initialFileName); // have to check if exists, otherwise crazy GTK will ignore preset // filter if (initialFile.exists()) { fileDialog.setFileName(initialFile.getName()); } fileDialog.setFilterPath(initialFile.getParent()); } return fileDialog; } private boolean validateSelectedFileName(String fileName) { if (fileName == null) { return false; } File file = new File(fileName); return !file.exists() || (file.isFile() && file.canWrite()); } @Override protected String getDialogSettingsId() { return DIALOG_SETTINGS_SECTION; } /** * Save the XML result of a FindBugs analysis on the given project, * displaying a progress monitor. * * @param project * The selected project. * @param fileName * The file name to store the XML to. */ private void work(final IProject project, final String fileName) { FindBugsJob runFindBugs = new FindBugsJob("Saving FindBugs XML data to " + fileName + "...", project) { @Override protected void runWithProgress(IProgressMonitor monitor) throws CoreException { BugCollection bugCollection = FindbugsPlugin.getBugCollection(project, monitor); try { bugCollection.writeXML(fileName); } catch (IOException e) { CoreException ex = new CoreException(FindbugsPlugin.createErrorStatus( "Can't write FindBugs bug collection from project " + project + " to file " + fileName, e)); throw ex; } } }; runFindBugs.scheduleInteractive(); } }