diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java new file mode 100644 index 000000000..2f0261e7b --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php + * + * 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.android.ide.eclipse.adt.internal.lint; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.ide.eclipse.adt.AdtPlugin; +import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs; +import com.android.tools.lint.client.api.Configuration; +import com.android.tools.lint.client.api.IssueRegistry; +import com.android.tools.lint.detector.api.Context; +import com.android.tools.lint.detector.api.Issue; +import com.android.tools.lint.detector.api.Location; +import com.android.tools.lint.detector.api.Severity; + +import org.eclipse.jface.preference.IPreferenceStore; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** Global (non-project-specific) configuration for Lint in Eclipse */ +class GlobalLintConfiguration extends Configuration { + private static final GlobalLintConfiguration sInstance = new GlobalLintConfiguration(); + + private Map<Issue, Severity> mSeverities; + private boolean mBulkEditing; + + private GlobalLintConfiguration() { + } + + /** + * Obtain a reference to the singleton + * + * @return the singleton configuration + */ + @NonNull + public static GlobalLintConfiguration get() { + return sInstance; + } + + @Override + public Severity getSeverity(@NonNull Issue issue) { + if (mSeverities == null) { + IssueRegistry registry = EclipseLintClient.getRegistry(); + mSeverities = new HashMap<Issue, Severity>(); + IPreferenceStore store = getStore(); + String assignments = store.getString(AdtPrefs.PREFS_LINT_SEVERITIES); + if (assignments != null && assignments.length() > 0) { + for (String assignment : assignments.split(",")) { //$NON-NLS-1$ + String[] s = assignment.split("="); //$NON-NLS-1$ + if (s.length == 2) { + Issue d = registry.getIssue(s[0]); + if (d != null) { + Severity severity = Severity.valueOf(s[1]); + if (severity != null) { + mSeverities.put(d, severity); + } + } + } + } + } + } + + Severity severity = mSeverities.get(issue); + if (severity != null) { + return severity; + } + + if (!issue.isEnabledByDefault()) { + return Severity.IGNORE; + } + + return issue.getDefaultSeverity(); + } + + private IPreferenceStore getStore() { + IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore(); + return store; + } + + @Override + public void ignore(@NonNull Context context, @NonNull Issue issue, + @Nullable Location location, @NonNull String message) { + throw new UnsupportedOperationException( + "Can't ignore() in global configurations"); //$NON-NLS-1$ + } + + @Override + public void setSeverity(@NonNull Issue issue, @Nullable Severity severity) { + if (mSeverities == null) { + // Force initialization + getSeverity(issue); + } + + if (severity == null) { + mSeverities.remove(issue); + } else { + mSeverities.put(issue, severity); + } + + if (!mBulkEditing) { + setSeverities(mSeverities); + } + } + + /** + * Sets the custom severities for the given issues, in bulk. + * + * @param severities a map from detector to severity to use from now on + * @return true if something changed from the current settings + */ + private boolean setSeverities(Map<Issue, Severity> severities) { + mSeverities = severities; + + String value = ""; + if (severities.size() > 0) { + List<Issue> sortedKeys = new ArrayList<Issue>(severities.keySet()); + Collections.sort(sortedKeys); + + StringBuilder sb = new StringBuilder(severities.size() * 20); + for (Issue issue : sortedKeys) { + Severity severity = severities.get(issue); + if (severity != issue.getDefaultSeverity()) { + if (sb.length() > 0) { + sb.append(','); + } + sb.append(issue.getId()); + sb.append('='); + sb.append(severity.name()); + } + } + + value = sb.toString(); + } + + IPreferenceStore store = getStore(); + String previous = store.getString(AdtPrefs.PREFS_LINT_SEVERITIES); + boolean changed = !value.equals(previous); + if (changed) { + if (value.length() == 0) { + store.setToDefault(AdtPrefs.PREFS_LINT_SEVERITIES); + } else { + store.setValue(AdtPrefs.PREFS_LINT_SEVERITIES, value); + } + } + + return changed; + } + + @Override + public void startBulkEditing() { + mBulkEditing = true; + } + + @Override + public void finishBulkEditing() { + mBulkEditing = false; + setSeverities(mSeverities); + } +}
\ No newline at end of file |