18da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal/* 28da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Copyright 2010 Google Inc. 38da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * 48da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Licensed under the Apache License, Version 2.0 (the "License"); 58da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * you may not use this file except in compliance with the License. 68da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * You may obtain a copy of the License at 78da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * 88da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * http://www.apache.org/licenses/LICENSE-2.0 98da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * 108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Unless required by applicable law or agreed to in writing, software 118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * distributed under the License is distributed on an "AS IS" BASIS, 128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * See the License for the specific language governing permissions and 148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * limitations under the License. 158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal */ 168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalpackage com.google.android.testing.mocking; 178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.ByteArrayOutputStream; 198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.File; 208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.FileNotFoundException; 218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.FileOutputStream; 228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.IOException; 238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.OutputStream; 248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.PrintStream; 258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.net.URL; 268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.net.URLClassLoader; 278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.text.SimpleDateFormat; 288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.Date; 298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javax.annotation.processing.ProcessingEnvironment; 318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javax.tools.Diagnostic.Kind; 328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal/** 348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * @author swoodward@google.com (Stephen Woodward) 358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * 368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal */ 378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalclass ProcessorLogger { 388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal private final OutputStream logFile; 398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal private final ProcessingEnvironment processingEnv; 408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal ProcessorLogger(OutputStream logFile, ProcessingEnvironment processingEnv) { 428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal this.logFile = logFile; 438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal this.processingEnv = processingEnv; 448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal ProcessorLogger(String logFileName, ProcessingEnvironment processingEnv) { 478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal this.logFile = openLogFile(logFileName); 488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal this.processingEnv = processingEnv; 498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal void reportClasspathError(String clazz, Throwable e) { 528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal printMessage(Kind.ERROR, "Could not find " + clazz); 538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal printMessage(Kind.ERROR, e); 548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal printMessage(Kind.NOTE, "Known Classpath: "); 558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal URL[] allUrls = ((URLClassLoader) this.getClass().getClassLoader()).getURLs(); 568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal for (URL url : allUrls) { 578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal printMessage(Kind.NOTE, url.toString()); 588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal void printMessage(Kind kind, String message) { 628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal processingEnv.getMessager().printMessage(kind, message); 638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal if (logFile != null) { 648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal try { 658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal logFile.write((SimpleDateFormat.getDateTimeInstance().format(new Date()) + " - " 668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal + kind.toString() + " : " + message + "\n").getBytes()); 678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } catch (IOException e) { 688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal // That's unfortunate, but not much to do about it. 698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal processingEnv.getMessager().printMessage(Kind.WARNING, 708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal "IOException logging to file" + e.toString()); 718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal void printMessage(Kind kind, Throwable e) { 768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal ByteArrayOutputStream stackTraceByteStream = new ByteArrayOutputStream(); 778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal PrintStream stackTraceStream = new PrintStream(stackTraceByteStream); 788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal e.printStackTrace(stackTraceStream); 798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal printMessage(kind, stackTraceByteStream.toString()); 808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal FileOutputStream openLogFile(String logFileName) { 838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal try { 848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal if (logFileName != null) { 858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal File log = new File(logFileName); 868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal if (!log.exists() && log.getParentFile() != null) { 878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal log.getParentFile().mkdirs(); 888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal return new FileOutputStream(log, true); 908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } catch (FileNotFoundException e) { 928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal printMessage(Kind.WARNING, e); 938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal return null; 958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal 978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal void close() { 988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal if (logFile != null) { 998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal try { 1008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal logFile.close(); 1018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } catch (IOException e) { 1028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal // That's ok 1038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 1048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 1058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal } 1068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal} 107