• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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 
17 package android.databinding.tool.util;
18 
19 import android.databinding.tool.processing.ScopedException;
20 
21 import java.io.PrintWriter;
22 import java.io.StringWriter;
23 
24 import javax.lang.model.element.Element;
25 import javax.tools.Diagnostic;
26 import javax.tools.Diagnostic.Kind;
27 
28 public class L {
29     private static boolean sEnableDebug = false;
30     private static final Client sSystemClient = new Client() {
31         @Override
32         public void printMessage(Kind kind, String message, Element element) {
33             if (kind == Kind.ERROR) {
34                 System.err.println(message);
35             } else {
36                 System.out.println(message);
37             }
38         }
39     };
40 
41     private static Client sClient = sSystemClient;
42 
setClient(Client systemClient)43     public static void setClient(Client systemClient) {
44         sClient = systemClient;
45     }
46 
setDebugLog(boolean enabled)47     public static void setDebugLog(boolean enabled) {
48         sEnableDebug = enabled;
49     }
50 
d(String msg, Object... args)51     public static void d(String msg, Object... args) {
52         if (sEnableDebug) {
53             printMessage(null, Diagnostic.Kind.NOTE, String.format(msg, args));
54         }
55     }
56 
d(Element element, String msg, Object... args)57     public static void d(Element element, String msg, Object... args) {
58         if (sEnableDebug) {
59             printMessage(element, Diagnostic.Kind.NOTE, String.format(msg, args));
60         }
61     }
62 
d(Throwable t, String msg, Object... args)63     public static void d(Throwable t, String msg, Object... args) {
64         if (sEnableDebug) {
65             printMessage(null, Diagnostic.Kind.NOTE,
66                     String.format(msg, args) + " " + getStackTrace(t));
67         }
68     }
69 
w(String msg, Object... args)70     public static void w(String msg, Object... args) {
71         printMessage(null, Kind.WARNING, String.format(msg, args));
72     }
73 
w(Element element, String msg, Object... args)74     public static void w(Element element, String msg, Object... args) {
75         printMessage(element, Kind.WARNING, String.format(msg, args));
76     }
77 
w(Throwable t, String msg, Object... args)78     public static void w(Throwable t, String msg, Object... args) {
79         printMessage(null, Kind.WARNING,
80                 String.format(msg, args) + " " + getStackTrace(t));
81     }
82 
tryToThrowScoped(Throwable t, String fullMessage)83     private static void tryToThrowScoped(Throwable t, String fullMessage) {
84         if (t instanceof ScopedException) {
85             ScopedException ex = (ScopedException) t;
86             if (ex.isValid()) {
87                 throw ex;
88             }
89         }
90         ScopedException ex = new ScopedException(fullMessage);
91         if (ex.isValid()) {
92             throw ex;
93         }
94     }
95 
e(String msg, Object... args)96     public static void e(String msg, Object... args) {
97         String fullMsg = String.format(msg, args);
98         tryToThrowScoped(null, fullMsg);
99         printMessage(null, Diagnostic.Kind.ERROR, fullMsg);
100     }
101 
e(Element element, String msg, Object... args)102     public static void e(Element element, String msg, Object... args) {
103         String fullMsg = String.format(msg, args);
104         tryToThrowScoped(null, fullMsg);
105         printMessage(element, Diagnostic.Kind.ERROR, fullMsg);
106     }
107 
e(Throwable t, String msg, Object... args)108     public static void e(Throwable t, String msg, Object... args) {
109         String fullMsg = String.format(msg, args);
110         tryToThrowScoped(t, fullMsg);
111         printMessage(null, Diagnostic.Kind.ERROR,
112                 fullMsg + " " + getStackTrace(t));
113     }
114 
printMessage(Element element, Diagnostic.Kind kind, String message)115     private static void printMessage(Element element, Diagnostic.Kind kind, String message) {
116         sClient.printMessage(kind, message, element);
117         if (kind == Diagnostic.Kind.ERROR) {
118             throw new RuntimeException("failure, see logs for details.\n" + message);
119         }
120     }
121 
isDebugEnabled()122     public static boolean isDebugEnabled() {
123         return sEnableDebug;
124     }
125 
126     public interface Client {
printMessage(Diagnostic.Kind kind, String message, Element element)127         void printMessage(Diagnostic.Kind kind, String message, Element element);
128     }
129 
getStackTrace(Throwable t)130     private static String getStackTrace(Throwable t) {
131         StringWriter sw = new StringWriter();
132         PrintWriter pw = new PrintWriter(sw);
133         try {
134             t.printStackTrace(pw);
135         } finally {
136             pw.close();
137         }
138         return sw.toString();
139     }
140 }
141