remove Profile
[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.ex.InspectionProfileImpl;
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 org.jdom.Element;
29 import org.jdom.JDOMException;
30 import org.jetbrains.annotations.NonNls;
31 import org.jetbrains.annotations.NotNull;
32
33 import java.io.File;
34 import java.io.FileOutputStream;
35 import java.io.IOException;
36 import java.util.HashMap;
37 import java.util.Map;
38
39 /**
40  * User: anna
41  * Date: Dec 20, 2004
42  */
43 public class InspectionProfileConvertor {
44   private final Map<String, HighlightDisplayLevel> myDisplayLevelMap = new HashMap<>();
45   @NonNls public static final String OLD_HIGHTLIGHTING_SETTINGS_PROFILE = "EditorHighlightingSettings";
46   @NonNls public static final String OLD_DEFAUL_PROFILE = "OldDefaultProfile";
47
48   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettingsConvertor");
49
50   @NonNls private static final String NAME_ATT = "name";
51   @NonNls private static final String VERSION_ATT = "version";
52   @NonNls private static final String OPTION_TAG = "option";
53   @NonNls private static final String DISPLAY_LEVEL_MAP_OPTION = "DISPLAY_LEVEL_MAP";
54   @NonNls protected static final String VALUE_ATT = "value";
55   @NonNls private static final String DEFAULT_XML = "Default.xml";
56   @NonNls private static final String XML_EXTENSION = ".xml";
57   @NonNls public static final String LEVEL_ATT = "level";
58   private final InspectionProfileManager myManager;
59
60   public InspectionProfileConvertor(@NotNull InspectionProfileManager manager) {
61     myManager = manager;
62     renameOldDefaultsProfile();
63   }
64
65   private boolean retrieveOldSettings(@NotNull Element element) {
66     boolean hasOldSettings = false;
67     for (Element option : element.getChildren(OPTION_TAG)) {
68       final String name = option.getAttributeValue(NAME_ATT);
69       if (name != null) {
70         hasOldSettings |= processElement(option, name);
71       }
72     }
73     return hasOldSettings;
74   }
75
76   protected boolean processElement(final Element option, final String name) {
77     if (name.equals(DISPLAY_LEVEL_MAP_OPTION)) {
78       for (Element e : option.getChild(VALUE_ATT).getChildren()) {
79         String key = e.getName();
80         String levelName = e.getAttributeValue(LEVEL_ATT);
81         HighlightSeverity severity = myManager.getSeverityRegistrar().getSeverity(levelName);
82         HighlightDisplayLevel level = severity == null ? null : HighlightDisplayLevel.find(severity);
83         if (level == null) continue;
84         myDisplayLevelMap.put(key, level);
85       }
86       return true;
87     }
88     return false;
89   }
90
91   public void storeEditorHighlightingProfile(@NotNull Element element, @NotNull InspectionProfile editorProfile) {
92     if (retrieveOldSettings(element)) {
93       InspectionProfileImpl editorProfileModel = (InspectionProfileImpl)editorProfile.getModifiableModel();
94       fillErrorLevels(editorProfileModel);
95       editorProfileModel.commit();
96     }
97   }
98
99   private static void renameOldDefaultsProfile() {
100     String directoryPath = PathManager.getConfigPath() + File.separator + InspectionProfileManager.INSPECTION_DIR;
101     File profileDirectory = new File(directoryPath);
102     if (!profileDirectory.exists()) {
103       return;
104     }
105
106     File[] files = profileDirectory.listFiles(pathname -> pathname.getPath().endsWith(File.separator + DEFAULT_XML));
107     if (files == null || files.length != 1 || !files[0].isFile()) {
108       return;
109     }
110     try {
111       Element root = JDOMUtil.load(files[0]);
112       if (root.getAttributeValue(VERSION_ATT) == null){
113         JDOMUtil.writeParent(root, new FileOutputStream(new File(profileDirectory, OLD_DEFAUL_PROFILE + XML_EXTENSION)), "\n");
114         FileUtil.delete(files[0]);
115       }
116     }
117     catch (IOException e) {
118       LOG.error(e);
119     }
120     catch (JDOMException e) {
121       LOG.error(e);
122     }
123   }
124
125   protected void fillErrorLevels(final InspectionProfileImpl profile) {
126     InspectionToolWrapper[] toolWrappers = profile.getInspectionTools(null);
127     LOG.assertTrue(toolWrappers != null, "Profile was not correctly init");
128     //fill error levels
129     for (final String shortName : myDisplayLevelMap.keySet()) {
130       //key <-> short name
131       HighlightDisplayLevel level = myDisplayLevelMap.get(shortName);
132
133       HighlightDisplayKey key = HighlightDisplayKey.find(shortName);
134
135       if (key == null) continue;
136
137       //set up tools for default profile
138       if (level != HighlightDisplayLevel.DO_NOT_SHOW) {
139         profile.enableTool(shortName, null, null);
140       }
141
142       if (level == null || level == HighlightDisplayLevel.DO_NOT_SHOW) {
143         level = HighlightDisplayLevel.WARNING;
144       }
145       profile.setErrorLevel(key, level, null);
146     }
147   }
148 }