| /* |
| * Copyright (c) 2013, the Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.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/legal/epl-v10.html |
| * |
| * 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.google.dart.engine.services.status; |
| |
| import com.google.common.collect.Lists; |
| import com.google.dart.engine.utilities.translation.DartOmit; |
| import com.google.dart.engine.utilities.translation.DartOptional; |
| |
| import java.util.List; |
| |
| /** |
| * Outcome of a condition checking operation. |
| */ |
| public class RefactoringStatus { |
| /** |
| * @return the new {@link RefactoringStatus} with {@link RefactoringStatusSeverity#ERROR}. |
| */ |
| public static RefactoringStatus createErrorStatus(String msg) { |
| RefactoringStatus status = new RefactoringStatus(); |
| status.addError(msg); |
| return status; |
| } |
| |
| /** |
| * @return the new {@link RefactoringStatus} with {@link RefactoringStatusSeverity#FATAL}. |
| */ |
| @DartOmit |
| public static RefactoringStatus createFatalErrorStatus(String msg) { |
| RefactoringStatus status = new RefactoringStatus(); |
| status.addFatalError(msg); |
| return status; |
| } |
| |
| /** |
| * @return the new {@link RefactoringStatus} with {@link RefactoringStatusSeverity#FATAL}. |
| */ |
| public static RefactoringStatus createFatalErrorStatus(String msg, |
| @DartOptional RefactoringStatusContext context) { |
| RefactoringStatus status = new RefactoringStatus(); |
| status.addFatalError(msg, context); |
| return status; |
| } |
| |
| /** |
| * @return the new {@link RefactoringStatus} with {@link RefactoringStatusSeverity#WARNING}. |
| */ |
| public static RefactoringStatus createWarningStatus(String msg) { |
| RefactoringStatus status = new RefactoringStatus(); |
| status.addWarning(msg); |
| return status; |
| } |
| |
| /** |
| * @return the {@link Enum} value with maximal ordinal. |
| */ |
| private static <T extends Enum<T>> T max(T a, T b) { |
| if (b.ordinal() > a.ordinal()) { |
| return b; |
| } |
| return a; |
| } |
| |
| private RefactoringStatusSeverity severity = RefactoringStatusSeverity.OK; |
| private final List<RefactoringStatusEntry> entries = Lists.newArrayList(); |
| |
| /** |
| * Adds a <code>ERROR</code> entry filled with the given message to this status. |
| */ |
| @DartOmit |
| public void addError(String msg) { |
| addError(msg, null); |
| } |
| |
| /** |
| * Adds a <code>ERROR</code> entry filled with the given message and status to this status. |
| */ |
| public void addError(String msg, @DartOptional RefactoringStatusContext context) { |
| addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.ERROR, msg, context)); |
| } |
| |
| /** |
| * Adds a <code>FATAL</code> entry filled with the given message to this status. |
| */ |
| @DartOmit |
| public void addFatalError(String msg) { |
| addFatalError(msg, null); |
| } |
| |
| /** |
| * Adds a <code>FATAL</code> entry filled with the given message and status to this status. |
| */ |
| public void addFatalError(String msg, @DartOptional RefactoringStatusContext context) { |
| addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.FATAL, msg, context)); |
| } |
| |
| /** |
| * Adds a <code>WARNING</code> entry filled with the given message to this status. |
| */ |
| @DartOmit |
| public void addWarning(String msg) { |
| addWarning(msg, null); |
| } |
| |
| /** |
| * Adds a <code>WARNING</code> entry filled with the given message and status to this status. |
| */ |
| public void addWarning(String msg, @DartOptional RefactoringStatusContext context) { |
| addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.WARNING, msg, context)); |
| } |
| |
| /** |
| * @return the copy of this {@link RefactoringStatus} with {@link RefactoringStatusSeverity#ERROR} |
| * replaced with {@link RefactoringStatusSeverity#FATAL}. |
| */ |
| public RefactoringStatus escalateErrorToFatal() { |
| RefactoringStatus result = new RefactoringStatus(); |
| for (RefactoringStatusEntry entry : entries) { |
| RefactoringStatusSeverity severity = entry.getSeverity(); |
| if (severity == RefactoringStatusSeverity.ERROR) { |
| severity = RefactoringStatusSeverity.FATAL; |
| } |
| result.addEntry(new RefactoringStatusEntry(severity, entry.getMessage(), entry.getContext())); |
| } |
| return result; |
| } |
| |
| /** |
| * @return the {@link RefactoringStatusEntry}s. |
| */ |
| public List<RefactoringStatusEntry> getEntries() { |
| return entries; |
| } |
| |
| /** |
| * @return the RefactoringStatusEntry with the highest severity, or <code>null</code> if no |
| * entries are present. |
| */ |
| public RefactoringStatusEntry getEntryWithHighestSeverity() { |
| if (entries.isEmpty()) { |
| return null; |
| } |
| RefactoringStatusEntry result = entries.get(0); |
| for (RefactoringStatusEntry entry : entries) { |
| if (result.getSeverity().ordinal() < entry.getSeverity().ordinal()) { |
| result = entry; |
| } |
| } |
| return result; |
| } |
| |
| /** |
| * @return the message from the {@link RefactoringStatusEntry} with highest severity; may be |
| * <code>null</code> if not entries are present. |
| */ |
| public String getMessage() { |
| RefactoringStatusEntry entry = getEntryWithHighestSeverity(); |
| if (entry == null) { |
| return null; |
| } |
| return entry.getMessage(); |
| } |
| |
| /** |
| * @return the current severity of the {@link RefactoringStatus}. |
| */ |
| public RefactoringStatusSeverity getSeverity() { |
| return severity; |
| } |
| |
| /** |
| * @return <code>true</code> if the current severity is <code> |
| * FATAL</code> or <code>ERROR</code>. |
| */ |
| public boolean hasError() { |
| return severity == RefactoringStatusSeverity.FATAL |
| || severity == RefactoringStatusSeverity.ERROR; |
| } |
| |
| /** |
| * @return <code>true</code> if the current severity is <code>FATAL</code>. |
| */ |
| public boolean hasFatalError() { |
| return severity == RefactoringStatusSeverity.FATAL; |
| } |
| |
| /** |
| * @return <code>true</code> if the current severity is <code> |
| * FATAL</code>, <code>ERROR</code>, <code>WARNING</code> or <code>INFO</code>. |
| */ |
| public boolean hasInfo() { |
| return severity == RefactoringStatusSeverity.FATAL |
| || severity == RefactoringStatusSeverity.ERROR |
| || severity == RefactoringStatusSeverity.WARNING |
| || severity == RefactoringStatusSeverity.INFO; |
| } |
| |
| /** |
| * @return <code>true</code> if the current severity is <code> |
| * FATAL</code>, <code>ERROR</code> or <code>WARNING</code>. |
| */ |
| public boolean hasWarning() { |
| return severity == RefactoringStatusSeverity.FATAL |
| || severity == RefactoringStatusSeverity.ERROR |
| || severity == RefactoringStatusSeverity.WARNING; |
| } |
| |
| /** |
| * @return <code>true</code> if the severity is <code>OK</code>. |
| */ |
| public boolean isOK() { |
| return severity == RefactoringStatusSeverity.OK; |
| } |
| |
| /** |
| * Merges the receiver and the parameter statuses. The resulting list of entries in the receiver |
| * will contain entries from both. The resulting severity in the receiver will be the more severe |
| * of its current severity and the parameter's severity. Merging with <code>null</code> is allowed |
| * - it has no effect. |
| */ |
| public void merge(RefactoringStatus other) { |
| if (other == null) { |
| return; |
| } |
| entries.addAll(other.entries); |
| severity = max(severity, other.getSeverity()); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append("<").append(severity.name()); |
| if (!isOK()) { |
| sb.append("\n"); |
| for (RefactoringStatusEntry entry : entries) { |
| sb.append("\t").append(entry).append("\n"); |
| } |
| } |
| sb.append(">"); |
| return sb.toString(); |
| } |
| |
| /** |
| * Adds given {@link RefactoringStatusEntry} and updates {@link #severity}. |
| */ |
| private void addEntry(RefactoringStatusEntry entry) { |
| entries.add(entry); |
| severity = max(severity, entry.getSeverity()); |
| } |
| } |