/* * Copyright 2014 Google Inc. All rights reserved. * * 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 org.inferred.freebuilder.processor.util; import com.google.common.base.Throwables; import java.io.IOException; import java.io.Writer; import java.lang.reflect.Method; import javax.annotation.processing.Filer; import javax.lang.model.element.Element; /** Static utility methods for working with {@link Filer}. */ public class FilerUtils { /** * Writes {@code source} to the correct file for {@code classToWrite}. * * <p>This is complicated mainly by an EJC bug that returns the wrong object from * {@link Writer#append(CharSequence)}, plus how to handle any exception thrown from * {@link Writer#close()}. */ public static void writeCompilationUnit( Filer filer, QualifiedName classToWrite, Element originatingElement, String source) throws IOException { Writer writer = filer .createSourceFile(classToWrite.toString(), originatingElement) .openWriter(); try { writer.append(source); } catch (Throwable e) { try { writer.close(); } catch (Throwable t) { // Use suppressed exceptions in Java 7+ if (ADD_SUPPRESSED != null) { try { ADD_SUPPRESSED.invoke(e, t); } catch (Exception x) { throw new RuntimeException("Failed to add suppressed exception: " + x.getMessage(), e); } } // Ignore any error thrown calling close() in Java 6 } Throwables.propagateIfPossible(e, IOException.class); throw Throwables.propagate(e); } writer.close(); } private static final Method ADD_SUPPRESSED; static { Method addSuppressed; try { addSuppressed = Throwable.class.getMethod("addSuppressed", Throwable.class); } catch (NoSuchMethodException e) { addSuppressed = null; } ADD_SUPPRESSED = addSuppressed; } private FilerUtils() {} }