001: //////////////////////////////////////////////////////////////////////////////
002: // Clirr: compares two versions of a java library for binary compatibility
003: // Copyright (C) 2003 - 2005 Lars Kühne
004: //
005: // This library is free software; you can redistribute it and/or
006: // modify it under the terms of the GNU Lesser General Public
007: // License as published by the Free Software Foundation; either
008: // version 2.1 of the License, or (at your option) any later version.
009: //
010: // This library is distributed in the hope that it will be useful,
011: // but WITHOUT ANY WARRANTY; without even the implied warranty of
012: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: // Lesser General Public License for more details.
014: //
015: // You should have received a copy of the GNU Lesser General Public
016: // License along with this library; if not, write to the Free Software
017: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: //////////////////////////////////////////////////////////////////////////////
019:
020: package net.sf.clirr.core.internal;
021:
022: import net.sf.clirr.core.ApiDifference;
023: import net.sf.clirr.core.Severity;
024: import net.sf.clirr.core.Message;
025: import net.sf.clirr.core.spi.JavaType;
026: import net.sf.clirr.core.spi.Field;
027: import net.sf.clirr.core.spi.Method;
028: import net.sf.clirr.core.spi.Scope;
029:
030: public abstract class AbstractDiffReporter {
031: private static final Message MSG_UNABLE_TO_DETERMINE_CLASS_SCOPE = new Message(
032: 9000);
033:
034: private ApiDiffDispatcher dispatcher;
035:
036: public AbstractDiffReporter(ApiDiffDispatcher dispatcher) {
037: this .dispatcher = dispatcher;
038: }
039:
040: protected final ApiDiffDispatcher getApiDiffDispatcher() {
041: return dispatcher;
042: }
043:
044: protected final void log(Message msg, Severity severity,
045: String clazz, Method method, Field field, String[] args) {
046: final ApiDifference diff = new ApiDifference(msg, severity,
047: clazz, null, null, args);
048: getApiDiffDispatcher().fireDiff(diff);
049: }
050:
051: /**
052: * Determine whether the severity of the problem should be reduced
053: * to INFO because the specified class is package or private accessibility.
054: * Clirr reports changes at level INFO for all private and package
055: * scoped objects.
056: * <p>
057: * Note that the class passed here should always be from the <i>old</i>
058: * class version, because we're checking whether <i>existing</i> code
059: * would have been able to access it (potential compatibility problems)
060: * or not.
061: *
062: * @param clazz is the class the change is being reported about.
063: * @param sev is the severity that should be reported for public/protected
064: * scoped classes.
065: *
066: * @return param sev if the class is public/protected, and Severity.INFO
067: * if the class is package or private scope.
068: */
069: protected final Severity getSeverity(JavaType clazz, Severity sev) {
070: Scope scope = clazz.getEffectiveScope();
071:
072: if (scope.isLessVisibleThan(Scope.PROTECTED)) {
073: return Severity.INFO;
074: } else {
075: return sev;
076: }
077: }
078:
079: /**
080: * Determine whether the severity of the problem should be reduced
081: * to INFO because:
082: * <ul>
083: * <li>the specified method is package or private accessibility, or</li>
084: * <li>the specified method is in a package or private class. </li
085: * </ul>
086: * <p>
087: * Clirr reports changes at level INFO for all private and package
088: * scoped objects.
089: * <p>
090: * Note that the method passed here should always be from the <i>old</i>
091: * class version, because we're checking whether <i>existing</i> code
092: * would have been able to access it (potential compatibility problems)
093: * or not.
094: *
095: * @param clazz is the class containing the method of interest
096: * @param method is the method the change is being reported about.
097: * @param sev is the severity that should be reported for public/protected
098: * scoped methods.
099: *
100: * @return param sev if the method is public/protected, and Severity.INFO
101: * if the method is package or private scope.
102: */
103: protected final Severity getSeverity(JavaType clazz, Method method,
104: Severity sev) {
105:
106: if (!method.getDeclaredScope().isLessVisibleThan(
107: Scope.PROTECTED)) {
108: return getSeverity(clazz, sev);
109: } else {
110: return Severity.INFO;
111: }
112: }
113:
114: /**
115: * Determine whether the severity of the problem should be reduced
116: * to INFO because:
117: * <ul>
118: * <li>the specified field is package or private accessibility, or</li>
119: * <li>the specified field is in a package or private class. </li>
120: * </ul>
121: * <p>
122: * Clirr reports changes at level INFO for all private and package
123: * scoped objects.
124: * <p>
125: * Note that the field passed here should always be from the <i>old</i>
126: * class version, because we're checking whether <i>existing</i> code
127: * would have been able to access it (potential compatibility problems)
128: * or not.
129: *
130: * @param clazz is the class containing the method of interest
131: * @param field is the field the change is being reported about.
132: * @param sev is the severity that should be reported for public/protected
133: * scoped field.
134: *
135: * @return param sev if the field is public/protected, and Severity.INFO
136: * if the field is package or private scope.
137: */
138: protected final Severity getSeverity(JavaType clazz, Field field,
139: Severity sev) {
140: if (!field.getDeclaredScope()
141: .isLessVisibleThan(Scope.PROTECTED)) {
142: return getSeverity(clazz, sev);
143: } else {
144: return Severity.INFO;
145: }
146: }
147: }
|