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