• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
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.android.ide.eclipse.adt.internal.lint;
17 
18 import com.android.annotations.NonNull;
19 import com.android.annotations.Nullable;
20 import com.android.ide.eclipse.adt.AdtPlugin;
21 import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
22 import com.android.tools.lint.client.api.Configuration;
23 import com.android.tools.lint.client.api.IssueRegistry;
24 import com.android.tools.lint.detector.api.Context;
25 import com.android.tools.lint.detector.api.Issue;
26 import com.android.tools.lint.detector.api.Location;
27 import com.android.tools.lint.detector.api.Severity;
28 
29 import org.eclipse.jface.preference.IPreferenceStore;
30 
31 import java.util.ArrayList;
32 import java.util.Collections;
33 import java.util.HashMap;
34 import java.util.List;
35 import java.util.Map;
36 
37 /** Global (non-project-specific) configuration for Lint in Eclipse */
38 class GlobalLintConfiguration extends Configuration {
39     private static final GlobalLintConfiguration sInstance = new GlobalLintConfiguration();
40 
41     private Map<Issue, Severity> mSeverities;
42     private boolean mBulkEditing;
43 
GlobalLintConfiguration()44     private GlobalLintConfiguration() {
45     }
46 
47     /**
48      * Obtain a reference to the singleton
49      *
50      * @return the singleton configuration
51      */
52     @NonNull
get()53     public static GlobalLintConfiguration get() {
54         return sInstance;
55     }
56 
57     @Override
getSeverity(@onNull Issue issue)58     public Severity getSeverity(@NonNull Issue issue) {
59         if (mSeverities == null) {
60             IssueRegistry registry = EclipseLintClient.getRegistry();
61             mSeverities = new HashMap<Issue, Severity>();
62             IPreferenceStore store = getStore();
63             String assignments = store.getString(AdtPrefs.PREFS_LINT_SEVERITIES);
64             if (assignments != null && assignments.length() > 0) {
65                 for (String assignment : assignments.split(",")) { //$NON-NLS-1$
66                     String[] s = assignment.split("="); //$NON-NLS-1$
67                     if (s.length == 2) {
68                         Issue d = registry.getIssue(s[0]);
69                         if (d != null) {
70                             Severity severity = Severity.valueOf(s[1]);
71                             if (severity != null) {
72                                 mSeverities.put(d, severity);
73                             }
74                         }
75                     }
76                 }
77             }
78         }
79 
80         Severity severity = mSeverities.get(issue);
81         if (severity != null) {
82             return severity;
83         }
84 
85         if (!issue.isEnabledByDefault()) {
86             return Severity.IGNORE;
87         }
88 
89         return issue.getDefaultSeverity();
90     }
91 
getStore()92     private IPreferenceStore getStore() {
93         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
94         return store;
95     }
96 
97     @Override
ignore(@onNull Context context, @NonNull Issue issue, @Nullable Location location, @NonNull String message, @Nullable Object data)98     public void ignore(@NonNull Context context, @NonNull Issue issue,
99             @Nullable Location location, @NonNull String message,
100             @Nullable Object data) {
101         throw new UnsupportedOperationException(
102                 "Can't ignore() in global configurations"); //$NON-NLS-1$
103     }
104 
105     @Override
setSeverity(@onNull Issue issue, @Nullable Severity severity)106     public void setSeverity(@NonNull Issue issue, @Nullable Severity severity) {
107         if (mSeverities == null) {
108             // Force initialization
109             getSeverity(issue);
110         }
111 
112         if (severity == null) {
113             mSeverities.remove(issue);
114         } else {
115             mSeverities.put(issue, severity);
116         }
117 
118         if (!mBulkEditing) {
119             setSeverities(mSeverities);
120         }
121     }
122 
123     /**
124      * Sets the custom severities for the given issues, in bulk.
125      *
126      * @param severities a map from detector to severity to use from now on
127      * @return true if something changed from the current settings
128      */
setSeverities(Map<Issue, Severity> severities)129     private boolean setSeverities(Map<Issue, Severity> severities) {
130         mSeverities = severities;
131 
132         String value = "";
133         if (severities.size() > 0) {
134             List<Issue> sortedKeys = new ArrayList<Issue>(severities.keySet());
135             Collections.sort(sortedKeys);
136 
137             StringBuilder sb = new StringBuilder(severities.size() * 20);
138             for (Issue issue : sortedKeys) {
139                 Severity severity = severities.get(issue);
140                 if (severity != issue.getDefaultSeverity()) {
141                     if (sb.length() > 0) {
142                         sb.append(',');
143                     }
144                     sb.append(issue.getId());
145                     sb.append('=');
146                     sb.append(severity.name());
147                 }
148             }
149 
150             value = sb.toString();
151         }
152 
153         IPreferenceStore store = getStore();
154         String previous = store.getString(AdtPrefs.PREFS_LINT_SEVERITIES);
155         boolean changed = !value.equals(previous);
156         if (changed) {
157             if (value.length() == 0) {
158                 store.setToDefault(AdtPrefs.PREFS_LINT_SEVERITIES);
159             } else {
160                 store.setValue(AdtPrefs.PREFS_LINT_SEVERITIES, value);
161             }
162         }
163 
164         return changed;
165     }
166 
167     @Override
startBulkEditing()168     public void startBulkEditing() {
169         mBulkEditing = true;
170     }
171 
172     @Override
finishBulkEditing()173     public void finishBulkEditing() {
174         mBulkEditing = false;
175         setSeverities(mSeverities);
176     }
177 }