package net.sourceforge.pmd.eclipse.ui.actions; import java.util.Iterator; import name.herlin.command.CommandException; import net.sourceforge.pmd.cpd.CSVRenderer; import net.sourceforge.pmd.cpd.LanguageFactory; import net.sourceforge.pmd.cpd.Renderer; import net.sourceforge.pmd.cpd.SimpleRenderer; import net.sourceforge.pmd.cpd.XMLRenderer; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; import net.sourceforge.pmd.eclipse.runtime.cmd.DetectCutAndPasteCmd; import net.sourceforge.pmd.eclipse.ui.PMDUiConstants; import net.sourceforge.pmd.eclipse.ui.dialogs.CPDCheckDialog; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.views.cpd2.CPDView2; import org.apache.log4j.Logger; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PartInitException; /** * Process CPD action menu. Run CPD against the selected project. * * @author Sven Jacob * @author David Craine * @author Philippe Herlin * */ public class CPDCheckProjectAction extends AbstractUIAction { private static final Logger log = Logger.getLogger(CPDCheckProjectAction.class); private static final String XML_KEY = "XML"; private static final String SIMPLE_KEY = "Simple Text"; private static final String CSV_KEY = "CSV"; /* * @see org.eclipse.ui.IActionDelegate#run(IAction) */ public void run(final IAction action) { // NOPMD:UnusedFormalParameter final IWorkbenchPartSite site = targetPartSite(); final ISelection sel = site.getSelectionProvider().getSelection(); final Shell shell = site.getShell(); final String[] languages = LanguageFactory.supportedLanguages; final String[] formats = { SIMPLE_KEY, XML_KEY, CSV_KEY }; final CPDCheckDialog dialog = new CPDCheckDialog(shell, languages, formats); if (dialog.open() == Dialog.OK && sel instanceof IStructuredSelection) { final StructuredSelection ss = (StructuredSelection) sel; final Iterator<?> i = ss.iterator(); while (i.hasNext()) { final Object obj = i.next(); if (obj instanceof IAdaptable) { final IAdaptable adaptable = (IAdaptable) obj; final IProject project = (IProject) adaptable.getAdapter(IProject.class); if (project == null) { log.warn("The selected object cannot adapt to a project"); log.debug(" -> selected object : " + obj); } else { this.detectCutAndPaste(project, dialog); } } else { log.warn("The selected object is not adaptable"); log.debug(" -> selected object : " + obj); } } } } /* * @see org.eclipse.ui.IActionDelegate#selectionChanged(IAction, ISelection) */ public void selectionChanged(final IAction action, final ISelection selection) { // NOPMD:UnusedFormalParameter } /** * Run the DetectCutAndPaste command against the selected project * and creates optionally the report file. * * @param project a project * @param dialog the object of the dialog with the selected values * @throws CommandException */ private void detectCutAndPaste(final IProject project, CPDCheckDialog dialog) { final String selectedLanguage = dialog.getSelectedLanguage(); final int tilesize = dialog.getTileSize(); final boolean createReport = dialog.isCreateReportSelected(); final Renderer selectedRenderer = this.createRenderer(dialog.getSelectedFormat()); final String fileName = this.createFileName(dialog.getSelectedFormat()); final CPDView2 view = showView(); try { final DetectCutAndPasteCmd detectCmd = new DetectCutAndPasteCmd(); detectCmd.setProject(project); detectCmd.setCreateReport(createReport); detectCmd.setLanguage(selectedLanguage); detectCmd.setMinTileSize(tilesize); detectCmd.setRenderer(selectedRenderer); detectCmd.setReportName(fileName); detectCmd.setUserInitiated(true); detectCmd.addPropertyListener(view); detectCmd.performExecute(); } catch (CommandException e) { logError(getString(StringKeys.ERROR_PMD_EXCEPTION), e); } } /** * Shows the view. * @param matches */ private CPDView2 showView() { CPDView2 view = null; try { final IWorkbenchPage workbenchPage = targetPartSite().getPage(); view = (CPDView2) workbenchPage.showView(PMDUiConstants.ID_CPDVIEW2); } catch (PartInitException pie) { logError( getString(StringKeys.ERROR_VIEW_EXCEPTION), pie); } return view; } /** * Creates a renderer from a key. * @param rendererKey xml, simple or cvs key * @return Renderer */ private Renderer createRenderer(final String rendererKey) { Renderer renderer = null; if (XML_KEY.equals(rendererKey)) { renderer = new XMLRenderer(); } else if (SIMPLE_KEY.equals(rendererKey)) { renderer = new SimpleRenderer(); } else if (CSV_KEY.equals(rendererKey)) { renderer = new CSVRenderer(); } return renderer; } /** * Creates a filename according to the renderer. * @param rendererKey xml, simple or cvs key * @return file name */ private String createFileName(String rendererKey) { String fileName; if (XML_KEY.equals(rendererKey)) { fileName = PMDRuntimeConstants.XML_CPDREPORT_NAME; } else if (CSV_KEY.equals(rendererKey)) { fileName = PMDRuntimeConstants.CSV_CPDREPORT_NAME; } else { fileName = PMDRuntimeConstants.SIMPLE_CPDREPORT_NAME; } return fileName; } }