blob: a55e1f996750ab33e98cf07dfe55d30b3ad76561 [file] [log] [blame]
/*
* Copyright 2000-2011 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.internal;
import com.intellij.codeInspection.InspectionProfile;
import com.intellij.codeInspection.ex.InspectionToolWrapper;
import com.intellij.codeInspection.ex.LocalInspectionToolWrapper;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.util.ResourceUtil;
import com.intellij.util.containers.ContainerUtil;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.net.URL;
import java.util.Collection;
import java.util.Map;
/**
* @author stathik
* Date: Nov 6, 2003
*/
public class DumpInspectionDescriptionsAction extends AnAction implements DumbAware {
private static final Logger LOG = Logger.getInstance("#com.intellij.internal.DumpInspectionDescriptionsAction");
public DumpInspectionDescriptionsAction() {
super("Dump inspection descriptions");
}
@Override
public void actionPerformed(final AnActionEvent event) {
final InspectionProfile profile = (InspectionProfile)InspectionProfileManager.getInstance().getRootProfile();
final InspectionToolWrapper[] tools = (InspectionToolWrapper[])profile.getInspectionTools(null);
final Collection<String> classes = ContainerUtil.newTreeSet();
final Map<String, Collection<String>> groups = ContainerUtil.newTreeMap();
final String tempDirectory = FileUtil.getTempDirectory();
final File descDirectory = new File(tempDirectory, "inspections");
if (!descDirectory.mkdirs() && !descDirectory.isDirectory()) {
LOG.error("Unable to create directory: " + descDirectory.getAbsolutePath());
return;
}
for (InspectionToolWrapper toolWrapper : tools) {
classes.add(getInspectionClass(toolWrapper).getName());
final String group = getGroupName(toolWrapper);
Collection<String> names = groups.get(group);
if (names == null) groups.put(group, (names = ContainerUtil.newTreeSet()));
names.add(toolWrapper.getShortName());
final URL url = getDescriptionUrl(toolWrapper);
if (url != null) {
doDump(new File(descDirectory, toolWrapper.getShortName() + ".html"), new Processor() {
@Override public void process(BufferedWriter writer) throws Exception {
writer.write(ResourceUtil.loadText(url));
}
});
}
}
doNotify("Inspection descriptions dumped to\n" + descDirectory.getAbsolutePath());
final File fqnListFile = new File(tempDirectory, "inspection_fqn_list.txt");
final boolean fqnOk = doDump(fqnListFile, new Processor() {
@Override public void process(BufferedWriter writer) throws Exception {
for (String name : classes) {
writer.write(name);
writer.newLine();
}
}
});
if (fqnOk) {
doNotify("Inspection class names dumped to\n" + fqnListFile.getAbsolutePath());
}
final File groupsFile = new File(tempDirectory, "inspection_groups.txt");
final boolean groupsOk = doDump(groupsFile, new Processor() {
@Override public void process(BufferedWriter writer) throws Exception {
for (Map.Entry<String, Collection<String>> entry : groups.entrySet()) {
writer.write(entry.getKey());
writer.write(':');
writer.newLine();
for (String name : entry.getValue()) {
writer.write(" ");
writer.write(name);
writer.newLine();
}
}
}
});
if (groupsOk) {
doNotify("Inspection groups dumped to\n" + fqnListFile.getAbsolutePath());
}
}
private static Class getInspectionClass(final InspectionToolWrapper toolWrapper) {
return toolWrapper instanceof LocalInspectionToolWrapper ? ((LocalInspectionToolWrapper)toolWrapper).getTool().getClass() : toolWrapper.getClass();
}
private static String getGroupName(final InspectionToolWrapper toolWrapper) {
final String name = toolWrapper.getGroupDisplayName();
return StringUtil.isEmptyOrSpaces(name) ? "General" : name;
}
private static URL getDescriptionUrl(final InspectionToolWrapper toolWrapper) {
final Class aClass = getInspectionClass(toolWrapper);
return ResourceUtil.getResource(aClass, "/inspectionDescriptions", toolWrapper.getShortName() + ".html");
}
private interface Processor {
void process(BufferedWriter writer) throws Exception;
}
private static boolean doDump(final File file, final Processor processor) {
try {
final BufferedWriter writer = new BufferedWriter(new FileWriter(file));
try {
processor.process(writer);
return true;
}
finally {
writer.close();
}
}
catch (Exception e) {
LOG.error(e);
return false;
}
}
private static void doNotify(final String message) {
Notifications.Bus.notify(new Notification("Actions", "Inspection descriptions dumped", message, NotificationType.INFORMATION));
}
}