Merge remote-tracking branch 'origin/master'
[idea/community.git] / platform / analysis-impl / src / com / intellij / codeInsight / daemon / InspectionProfileConvertor.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeInsight.daemon;
17
18 import com.intellij.codeHighlighting.HighlightDisplayLevel;
19 import com.intellij.codeInspection.InspectionProfile;
20 import com.intellij.codeInspection.ModifiableModel;
21 import com.intellij.codeInspection.ex.InspectionToolWrapper;
22 import com.intellij.lang.annotation.HighlightSeverity;
23 import com.intellij.openapi.application.PathManager;
24 import com.intellij.openapi.diagnostic.Logger;
25 import com.intellij.openapi.util.JDOMUtil;
26 import com.intellij.openapi.util.io.FileUtil;
27 import com.intellij.profile.codeInspection.InspectionProfileManager;
28 import com.intellij.profile.codeInspection.SeverityProvider;
29 import org.jdom.Element;
30 import org.jdom.JDOMException;
31 import org.jetbrains.annotations.NonNls;
32 import org.jetbrains.annotations.NotNull;
33
34 import java.io.File;
35 import java.io.FileOutputStream;
36 import java.io.IOException;
37 import java.util.HashMap;
38 import java.util.Map;
39
40 /**
41  * User: anna
42  * Date: Dec 20, 2004
43  */
44 public class InspectionProfileConvertor {
45   private final Map<String, HighlightDisplayLevel> myDisplayLevelMap = new HashMap<>();
46   @NonNls public static final String OLD_HIGHTLIGHTING_SETTINGS_PROFILE = "EditorHighlightingSettings";
47   @NonNls public static final String OLD_DEFAUL_PROFILE = "OldDefaultProfile";
48
49   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettingsConvertor");
50
51   @NonNls private static final String NAME_ATT = "name";
52   @NonNls private static final String VERSION_ATT = "version";
53   @NonNls private static final String OPTION_TAG = "option";
54   @NonNls private static final String DISPLAY_LEVEL_MAP_OPTION = "DISPLAY_LEVEL_MAP";
55   @NonNls protected static final String VALUE_ATT = "value";
56   @NonNls private static final String DEFAULT_XML = "Default.xml";
57   @NonNls private static final String XML_EXTENSION = ".xml";
58   @NonNls public static final String LEVEL_ATT = "level";
59   private final SeverityProvider myManager;
60
61   public InspectionProfileConvertor(@NotNull SeverityProvider manager) {
62     myManager = manager;
63     renameOldDefaultsProfile();
64   }
65
66   private boolean retrieveOldSettings(@NotNull Element element) {
67     boolean hasOldSettings = false;
68     for (Element option : element.getChildren(OPTION_TAG)) {
69       final String name = option.getAttributeValue(NAME_ATT);
70       if (name != null) {
71         hasOldSettings |= processElement(option, name);
72       }
73     }
74     return hasOldSettings;
75   }
76
77   protected boolean processElement(final Element option, final String name) {
78     if (name.equals(DISPLAY_LEVEL_MAP_OPTION)) {
79       for (Element e : option.getChild(VALUE_ATT).getChildren()) {
80         String key = e.getName();
81         String levelName = e.getAttributeValue(LEVEL_ATT);
82         HighlightSeverity severity = myManager.getSeverityRegistrar().getSeverity(levelName);
83         HighlightDisplayLevel level = severity == null ? null : HighlightDisplayLevel.find(severity);
84         if (level == null) continue;
85         myDisplayLevelMap.put(key, level);
86       }
87       return true;
88     }
89     return false;
90   }
91
92   public void storeEditorHighlightingProfile(@NotNull Element element, @NotNull InspectionProfile editorProfile) {
93     if (retrieveOldSettings(element)) {
94       ModifiableModel editorProfileModel = editorProfile.getModifiableModel();
95       fillErrorLevels(editorProfileModel);
96       editorProfileModel.commit();
97     }
98   }
99
100   private static void renameOldDefaultsProfile() {
101     String directoryPath = PathManager.getConfigPath() + File.separator + InspectionProfileManager.INSPECTION_DIR;
102     File profileDirectory = new File(directoryPath);
103     if (!profileDirectory.exists()) {
104       return;
105     }
106
107     File[] files = profileDirectory.listFiles(pathname -> pathname.getPath().endsWith(File.separator + DEFAULT_XML));
108     if (files == null || files.length != 1 || !files[0].isFile()) {
109       return;
110     }
111     try {
112       Element root = JDOMUtil.load(files[0]);
113       if (root.getAttributeValue(VERSION_ATT) == null){
114         JDOMUtil.writeParent(root, new FileOutputStream(new File(profileDirectory, OLD_DEFAUL_PROFILE + XML_EXTENSION)), "\n");
115         FileUtil.delete(files[0]);
116       }
117     }
118     catch (IOException e) {
119       LOG.error(e);
120     }
121     catch (JDOMException e) {
122       LOG.error(e);
123     }
124   }
125
126   protected void fillErrorLevels(final ModifiableModel profile) {
127     InspectionToolWrapper[] toolWrappers = profile.getInspectionTools(null);
128     LOG.assertTrue(toolWrappers != null, "Profile was not correctly init");
129     //fill error levels
130     for (final String shortName : myDisplayLevelMap.keySet()) {
131       //key <-> short name
132       HighlightDisplayLevel level = myDisplayLevelMap.get(shortName);
133
134       HighlightDisplayKey key = HighlightDisplayKey.find(shortName);
135
136       if (key == null) continue;
137
138       //set up tools for default profile
139       if (level != HighlightDisplayLevel.DO_NOT_SHOW) {
140         profile.enableTool(shortName, null, null);
141       }
142
143       if (level == null || level == HighlightDisplayLevel.DO_NOT_SHOW) {
144         level = HighlightDisplayLevel.WARNING;
145       }
146       profile.setErrorLevel(key, level, null);
147     }
148   }
149 }