/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.testing.mocking; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.net.URL; import java.net.URLClassLoader; import java.text.SimpleDateFormat; import java.util.Date; import javax.annotation.processing.ProcessingEnvironment; import javax.tools.Diagnostic.Kind; /** * @author swoodward@google.com (Stephen Woodward) * */ class ProcessorLogger { private final OutputStream logFile; private final ProcessingEnvironment processingEnv; ProcessorLogger(OutputStream logFile, ProcessingEnvironment processingEnv) { this.logFile = logFile; this.processingEnv = processingEnv; } ProcessorLogger(String logFileName, ProcessingEnvironment processingEnv) { this.logFile = openLogFile(logFileName); this.processingEnv = processingEnv; } void reportClasspathError(String clazz, Throwable e) { printMessage(Kind.ERROR, "Could not find " + clazz); printMessage(Kind.ERROR, e); printMessage(Kind.NOTE, "Known Classpath: "); URL[] allUrls = ((URLClassLoader) this.getClass().getClassLoader()).getURLs(); for (URL url : allUrls) { printMessage(Kind.NOTE, url.toString()); } } void printMessage(Kind kind, String message) { processingEnv.getMessager().printMessage(kind, message); if (logFile != null) { try { logFile.write((SimpleDateFormat.getDateTimeInstance().format(new Date()) + " - " + kind.toString() + " : " + message + "\n").getBytes()); } catch (IOException e) { // That's unfortunate, but not much to do about it. processingEnv.getMessager().printMessage(Kind.WARNING, "IOException logging to file" + e.toString()); } } } void printMessage(Kind kind, Throwable e) { ByteArrayOutputStream stackTraceByteStream = new ByteArrayOutputStream(); PrintStream stackTraceStream = new PrintStream(stackTraceByteStream); e.printStackTrace(stackTraceStream); printMessage(kind, stackTraceByteStream.toString()); } FileOutputStream openLogFile(String logFileName) { try { if (logFileName != null) { File log = new File(logFileName); if (!log.exists() && log.getParentFile() != null) { log.getParentFile().mkdirs(); } return new FileOutputStream(log, true); } } catch (FileNotFoundException e) { printMessage(Kind.WARNING, e); } return null; } void close() { if (logFile != null) { try { logFile.close(); } catch (IOException e) { // That's ok } } } }