com.intellij.codeInspection.ui.actions.ExportHTMLAction.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.codeInspection.ui.actions.ExportHTMLAction.java

Source

/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.intellij.codeInspection.ui.actions;

import com.intellij.codeEditor.printing.ExportToHTMLSettings;
import com.intellij.codeInspection.InspectionApplication;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.ex.*;
import com.intellij.codeInspection.export.ExportToHTMLDialog;
import com.intellij.codeInspection.export.HTMLExportFrameMaker;
import com.intellij.codeInspection.export.HTMLExportUtil;
import com.intellij.codeInspection.export.HTMLExporter;
import com.intellij.codeInspection.reference.RefEntity;
import com.intellij.codeInspection.reference.RefModule;
import com.intellij.codeInspection.ui.InspectionNode;
import com.intellij.codeInspection.ui.InspectionResultsView;
import com.intellij.codeInspection.ui.InspectionToolPresentation;
import com.intellij.codeInspection.ui.InspectionTreeNode;
import com.intellij.codeInspection.util.RefEntityAlphabeticalComparator;
import com.intellij.icons.AllIcons;
import com.intellij.ide.BrowserUtil;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.util.ThrowableRunnable;
import com.intellij.util.ui.tree.TreeUtil;
import org.jdom.Document;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 * User: anna
 * Date: 11-Jan-2006
 */
public class ExportHTMLAction extends AnAction implements DumbAware {
    private final InspectionResultsView myView;
    @NonNls
    private static final String PROBLEMS = "problems";
    @NonNls
    private static final String HTML = "HTML";
    @NonNls
    private static final String XML = "XML";

    public ExportHTMLAction(final InspectionResultsView view) {
        super(InspectionsBundle.message("inspection.action.export.html"), null, AllIcons.Actions.Export);
        myView = view;
    }

    @Override
    public void actionPerformed(AnActionEvent e) {
        final ListPopup popup = JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep<String>(
                InspectionsBundle.message("inspection.action.export.popup.title"), new String[] { HTML, XML }) {
            @Override
            public PopupStep onChosen(final String selectedValue, final boolean finalChoice) {
                exportHTML(Comparing.strEqual(selectedValue, HTML));
                return PopupStep.FINAL_CHOICE;
            }
        });
        InspectionResultsView.showPopup(e, popup);
    }

    private void exportHTML(final boolean exportToHTML) {
        ExportToHTMLDialog exportToHTMLDialog = new ExportToHTMLDialog(myView.getProject(), exportToHTML);
        final ExportToHTMLSettings exportToHTMLSettings = ExportToHTMLSettings.getInstance(myView.getProject());
        if (exportToHTMLSettings.OUTPUT_DIRECTORY == null) {
            exportToHTMLSettings.OUTPUT_DIRECTORY = PathManager.getHomePath() + File.separator + "inspections";
        }
        exportToHTMLDialog.reset();
        exportToHTMLDialog.show();
        if (!exportToHTMLDialog.isOK()) {
            return;
        }
        exportToHTMLDialog.apply();

        final String outputDirectoryName = exportToHTMLSettings.OUTPUT_DIRECTORY;
        ApplicationManager.getApplication().invokeLater(new Runnable() {
            @Override
            public void run() {
                final Runnable exportRunnable = new Runnable() {
                    @Override
                    public void run() {
                        if (!exportToHTML) {
                            dupm2XML(outputDirectoryName);
                        } else {
                            final HTMLExportFrameMaker maker = new HTMLExportFrameMaker(outputDirectoryName,
                                    myView.getProject());
                            maker.start();
                            try {
                                final InspectionTreeNode root = myView.getTree().getRoot();
                                TreeUtil.traverse(root, new TreeUtil.Traverse() {
                                    @Override
                                    public boolean accept(final Object node) {
                                        if (node instanceof InspectionNode) {
                                            exportHTML(maker, (InspectionNode) node);
                                        }
                                        return true;
                                    }
                                });
                            } catch (ProcessCanceledException e) {
                                // Do nothing here.
                            }

                            maker.done();
                        }
                    }
                };

                if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(exportRunnable,
                        exportToHTML ? InspectionsBundle.message("inspection.generating.html.progress.title")
                                : InspectionsBundle.message("inspection.generating.xml.progress.title"),
                        true, myView.getProject())) {
                    return;
                }

                if (exportToHTML && exportToHTMLSettings.OPEN_IN_BROWSER) {
                    BrowserUtil.browse(new File(exportToHTMLSettings.OUTPUT_DIRECTORY, "index.html"));
                }
            }
        });
    }

    private void dupm2XML(final String outputDirectoryName) {
        try {
            new File(outputDirectoryName).mkdirs();
            final InspectionTreeNode root = myView.getTree().getRoot();
            final IOException[] ex = new IOException[1];
            TreeUtil.traverse(root, new TreeUtil.Traverse() {
                @Override
                public boolean accept(final Object node) {
                    if (node instanceof InspectionNode) {
                        InspectionNode toolNode = (InspectionNode) node;
                        Element problems = new Element(PROBLEMS);
                        InspectionToolWrapper toolWrapper = toolNode.getToolWrapper();

                        final Set<InspectionToolWrapper> toolWrappers = getWorkedTools(toolNode);
                        for (InspectionToolWrapper wrapper : toolWrappers) {
                            InspectionToolPresentation presentation = myView.getGlobalInspectionContext()
                                    .getPresentation(wrapper);
                            presentation.exportResults(problems);
                        }
                        PathMacroManager.getInstance(myView.getProject()).collapsePaths(problems);
                        try {
                            JDOMUtil.writeDocument(new Document(problems),
                                    outputDirectoryName + File.separator + toolWrapper.getShortName()
                                            + InspectionApplication.XML_EXTENSION,
                                    CodeStyleSettingsManager.getSettings(null).getLineSeparator());
                        } catch (IOException e) {
                            ex[0] = e;
                        }
                    }
                    return true;
                }
            });
            if (ex[0] != null) {
                throw ex[0];
            }
            final Element element = new Element(InspectionApplication.INSPECTIONS_NODE);
            final String profileName = myView.getCurrentProfileName();
            if (profileName != null) {
                element.setAttribute(InspectionApplication.PROFILE, profileName);
            }
            JDOMUtil.writeDocument(new Document(element),
                    outputDirectoryName + File.separator + InspectionApplication.DESCRIPTIONS
                            + InspectionApplication.XML_EXTENSION,
                    CodeStyleSettingsManager.getSettings(null).getLineSeparator());
        } catch (final IOException e) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Messages.showErrorDialog(myView, e.getMessage());
                }
            });
        }
    }

    @NotNull
    private Set<InspectionToolWrapper> getWorkedTools(@NotNull InspectionNode node) {
        final Set<InspectionToolWrapper> result = new HashSet<InspectionToolWrapper>();
        final InspectionToolWrapper wrapper = node.getToolWrapper();
        if (myView.getCurrentProfileName() != null) {
            result.add(wrapper);
            return result;
        }
        final String shortName = wrapper.getShortName();
        final GlobalInspectionContextImpl context = myView.getGlobalInspectionContext();
        final Tools tools = context.getTools().get(shortName);
        if (tools != null) { //dummy entry points tool
            for (ScopeToolState state : tools.getTools()) {
                InspectionToolWrapper toolWrapper = state.getTool();
                result.add(toolWrapper);
            }
        }
        return result;
    }

    private void exportHTML(HTMLExportFrameMaker frameMaker, InspectionNode node) {
        final Set<InspectionToolWrapper> toolWrappers = getWorkedTools(node);
        final InspectionToolWrapper toolWrapper = node.getToolWrapper();

        final HTMLExporter exporter = new HTMLExporter(
                frameMaker.getRootFolder() + "/" + toolWrapper.getShortName(),
                myView.getGlobalInspectionContext().getPresentation(toolWrapper).getComposer());
        frameMaker.startInspection(toolWrapper);
        HTMLExportUtil.runExport(myView.getProject(), new ThrowableRunnable<IOException>() {
            @Override
            public void run() throws IOException {
                exportHTML(toolWrappers, exporter);
                exporter.generateReferencedPages();
            }
        });
    }

    @SuppressWarnings({ "HardCodedStringLiteral" })
    private void exportHTML(@NotNull Set<InspectionToolWrapper> toolWrappers, HTMLExporter exporter)
            throws IOException {
        StringBuffer packageIndex = new StringBuffer();
        packageIndex.append("<html><body>");

        final Map<String, Set<RefEntity>> content = new HashMap<String, Set<RefEntity>>();

        for (InspectionToolWrapper toolWrapper : toolWrappers) {
            InspectionToolPresentation presentation = myView.getGlobalInspectionContext()
                    .getPresentation(toolWrapper);
            final Map<String, Set<RefEntity>> toolContent = presentation.getContent();
            if (toolContent != null) {
                content.putAll(toolContent);
            }
        }

        final Set<RefEntity> defaultPackageEntities = content.remove(null);
        if (defaultPackageEntities != null) {
            content.put("default package", defaultPackageEntities);
        }

        List<String> packageNames = new ArrayList<String>(content.keySet());

        Collections.sort(packageNames);
        for (String packageName : packageNames) {
            appendPackageReference(packageIndex, packageName);
            List<RefEntity> packageContent = new ArrayList<RefEntity>(content.get(packageName));
            Collections.sort(packageContent, RefEntityAlphabeticalComparator.getInstance());
            StringBuffer contentIndex = new StringBuffer();
            contentIndex.append("<html><body>");
            for (RefEntity refElement : packageContent) {
                refElement = refElement.getRefManager().getRefinedElement(refElement);
                contentIndex.append("<a HREF=\"");
                contentIndex.append(exporter.getURL(refElement));
                contentIndex.append("\" target=\"elementFrame\">");
                contentIndex.append(refElement.getName());
                contentIndex.append("</a><br>");

                exporter.createPage(refElement);
            }

            contentIndex.append("</body></html>");
            HTMLExportUtil.writeFile(exporter.getRootFolder(), packageName + "-index.html", contentIndex,
                    myView.getProject());
        }

        final Set<RefModule> modules = new HashSet<RefModule>();
        for (InspectionToolWrapper toolWrapper : toolWrappers) {
            InspectionToolPresentation presentation = myView.getGlobalInspectionContext()
                    .getPresentation(toolWrapper);
            final Set<RefModule> problems = presentation.getModuleProblems();
            if (problems != null) {
                modules.addAll(problems);
            }
        }

        final List<RefModule> sortedModules = new ArrayList<RefModule>(modules);
        Collections.sort(sortedModules, RefEntityAlphabeticalComparator.getInstance());
        for (RefModule module : sortedModules) {
            appendPackageReference(packageIndex, module.getName());
            StringBuffer contentIndex = new StringBuffer();
            contentIndex.append("<html><body>");

            contentIndex.append("<a HREF=\"");
            contentIndex.append(exporter.getURL(module));
            contentIndex.append("\" target=\"elementFrame\">");
            contentIndex.append(module.getName());
            contentIndex.append("</a><br>");
            exporter.createPage(module);

            contentIndex.append("</body></html>");
            HTMLExportUtil.writeFile(exporter.getRootFolder(), module.getName() + "-index.html", contentIndex,
                    myView.getProject());
        }

        packageIndex.append("</body></html>");

        HTMLExportUtil.writeFile(exporter.getRootFolder(), "index.html", packageIndex, myView.getProject());
    }

    @SuppressWarnings({ "HardCodedStringLiteral" })
    private static void appendPackageReference(StringBuffer packageIndex, String packageName) {
        packageIndex.append("<a HREF=\"");
        packageIndex.append(packageName);
        packageIndex.append("-index.html\" target=\"packageFrame\">");
        packageIndex.append(packageName);
        packageIndex.append("</a><br>");
    }

}