1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/*
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc.
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License");
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License.
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS,
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License.
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava;
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.Set;
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.TreeSet;
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class Errors {
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean hadError = false;
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static boolean warningsAreErrors = false;
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static TreeSet<ErrorMessage> allErrors = new TreeSet<ErrorMessage>();
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static class ErrorMessage implements Comparable {
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Error error;
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    SourcePositionInfo pos;
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String msg;
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ErrorMessage(Error e, SourcePositionInfo p, String m) {
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      error = e;
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      pos = p;
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      msg = m;
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public int compareTo(Object o) {
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ErrorMessage that = (ErrorMessage) o;
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int r = this.pos.compareTo(that.pos);
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (r != 0) return r;
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return this.msg.compareTo(that.msg);
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public String toString() {
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String whereText = this.pos == null ? "unknown: " : this.pos.toString() + ':';
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return whereText + this.msg;
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public Error error() {
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return error;
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void error(Error error, SourcePositionInfo where, String text) {
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (error.level == HIDDEN) {
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return;
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int level = (!warningsAreErrors && error.level == WARNING) ? WARNING : ERROR;
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String which = level == WARNING ? " warning " : " error ";
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String message = which + error.code + ": " + text;
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (where == null) {
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      where = new SourcePositionInfo("unknown", 0, 0);
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    allErrors.add(new ErrorMessage(error, where, message));
70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (error.level == ERROR || (warningsAreErrors && error.level == WARNING)) {
72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hadError = true;
73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void clearErrors() {
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hadError = false;
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    allErrors.clear();
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void printErrors() {
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    printErrors(allErrors);
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void printErrors(Set<ErrorMessage> errors) {
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ErrorMessage m : errors) {
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (m.error.level == WARNING) {
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        System.err.println(m.toString());
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ErrorMessage m : errors) {
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (m.error.level == ERROR) {
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        System.err.println(m.toString());
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static Set<ErrorMessage> getErrors() {
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return allErrors;
100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static int HIDDEN = 0;
103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static int WARNING = 1;
104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static int ERROR = 2;
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void setWarningsAreErrors(boolean val) {
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    warningsAreErrors = val;
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static class Error {
111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public int code;
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public int level;
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public Error(int code, int level) {
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      this.code = code;
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      this.level = level;
117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public String toString() {
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return "Error #" + this.code;
121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1249ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  // Errors for API verification
1259ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error PARSE_ERROR = new Error(1, ERROR);
1269ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error ADDED_PACKAGE = new Error(2, WARNING);
1279ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error ADDED_CLASS = new Error(3, WARNING);
1289ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error ADDED_METHOD = new Error(4, WARNING);
1299ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error ADDED_FIELD = new Error(5, WARNING);
1309ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error ADDED_INTERFACE = new Error(6, WARNING);
1319ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error REMOVED_PACKAGE = new Error(7, WARNING);
1329ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error REMOVED_CLASS = new Error(8, WARNING);
1339ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error REMOVED_METHOD = new Error(9, WARNING);
1349ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error REMOVED_FIELD = new Error(10, WARNING);
1359ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error REMOVED_INTERFACE = new Error(11, WARNING);
1369ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_STATIC = new Error(12, WARNING);
13743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown  public static Error ADDED_FINAL = new Error(13, WARNING);
1389ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_TRANSIENT = new Error(14, WARNING);
1399ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_VOLATILE = new Error(15, WARNING);
1409ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_TYPE = new Error(16, WARNING);
1419ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_VALUE = new Error(17, WARNING);
1429ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_SUPERCLASS = new Error(18, WARNING);
1439ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_SCOPE = new Error(19, WARNING);
1449ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_ABSTRACT = new Error(20, WARNING);
1459ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_THROWS = new Error(21, WARNING);
1469ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_NATIVE = new Error(22, HIDDEN);
1479ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_CLASS = new Error(23, WARNING);
1489ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_DEPRECATED = new Error(24, WARNING);
1499ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static Error CHANGED_SYNCHRONIZED = new Error(25, ERROR);
15043d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown  public static Error ADDED_FINAL_UNINSTANTIABLE = new Error(26, WARNING);
15143d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown  public static Error REMOVED_FINAL = new Error(27, WARNING);
1529ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson
1539ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  // Errors in javadoc generation
1549ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error UNRESOLVED_LINK = new Error(101, WARNING);
1559ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error BAD_INCLUDE_TAG = new Error(102, WARNING);
1569ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error UNKNOWN_TAG = new Error(103, WARNING);
1579ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error UNKNOWN_PARAM_TAG_NAME = new Error(104, WARNING);
1589ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error UNDOCUMENTED_PARAMETER = new Error(105, HIDDEN);
1599ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error BAD_ATTR_TAG = new Error(106, ERROR);
1609ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error BAD_INHERITDOC = new Error(107, HIDDEN);
1619ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error HIDDEN_LINK = new Error(108, WARNING);
1629ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error HIDDEN_CONSTRUCTOR = new Error(109, WARNING);
1639ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error UNAVAILABLE_SYMBOL = new Error(110, ERROR);
1649ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error HIDDEN_SUPERCLASS = new Error(111, WARNING);
1659ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error DEPRECATED = new Error(112, HIDDEN);
1669ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error DEPRECATION_MISMATCH = new Error(113, WARNING);
1679ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error MISSING_COMMENT = new Error(114, WARNING);
1689ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error IO_ERROR = new Error(115, HIDDEN);
1699ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error NO_SINCE_DATA = new Error(116, HIDDEN);
1709ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static final Error NO_FEDERATION_DATA = new Error(117, WARNING);
1717ab64e63c47c4b13472f230d22265cd2cd50fef1Jesse Wilson  public static final Error BROKEN_SINCE_FILE = new Error(118, ERROR);
1729b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static final Error INVALID_CONTENT_TYPE = new Error(119, ERROR);
1739ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson
174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final Error[] ERRORS =
175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      {UNRESOLVED_LINK, BAD_INCLUDE_TAG, UNKNOWN_TAG, UNKNOWN_PARAM_TAG_NAME,
176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          UNDOCUMENTED_PARAMETER, BAD_ATTR_TAG, BAD_INHERITDOC, HIDDEN_LINK, HIDDEN_CONSTRUCTOR,
177297fb6d2c5d7b8127b29fdaf82a5bb0e87bba8f6Ben Dodson          UNAVAILABLE_SYMBOL, HIDDEN_SUPERCLASS, DEPRECATED, DEPRECATION_MISMATCH, MISSING_COMMENT,
178297fb6d2c5d7b8127b29fdaf82a5bb0e87bba8f6Ben Dodson          IO_ERROR, NO_SINCE_DATA, NO_FEDERATION_DATA, PARSE_ERROR, ADDED_PACKAGE, ADDED_CLASS,
179297fb6d2c5d7b8127b29fdaf82a5bb0e87bba8f6Ben Dodson          ADDED_METHOD, ADDED_FIELD, ADDED_INTERFACE, REMOVED_PACKAGE, REMOVED_CLASS,
18043d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown          REMOVED_METHOD, REMOVED_FIELD, REMOVED_INTERFACE, CHANGED_STATIC, ADDED_FINAL,
181297fb6d2c5d7b8127b29fdaf82a5bb0e87bba8f6Ben Dodson          CHANGED_TRANSIENT, CHANGED_VOLATILE, CHANGED_TYPE, CHANGED_VALUE, CHANGED_SUPERCLASS,
182297fb6d2c5d7b8127b29fdaf82a5bb0e87bba8f6Ben Dodson          CHANGED_SCOPE, CHANGED_ABSTRACT, CHANGED_THROWS, CHANGED_NATIVE, CHANGED_CLASS,
18343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown          CHANGED_DEPRECATED, CHANGED_SYNCHRONIZED, ADDED_FINAL_UNINSTANTIABLE, REMOVED_FINAL,
18443d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown          BROKEN_SINCE_FILE, INVALID_CONTENT_TYPE};
185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean setErrorLevel(int code, int level) {
187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (Error e : ERRORS) {
188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (e.code == code) {
189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        e.level = level;
190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
196