/** * Copyright 2011-2017 Asakusa Framework Team. * * 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.asakusafw.utils.java.jsr199.testing; import java.util.Set; import javax.annotation.processing.Completion; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; /** * An annotation processor that handles occurred exceptions. * @see #rethrow() */ public class SafeProcessor implements Processor { private final Processor delegate; private RuntimeException runtimeException; private Error error; /** * Creates a new instance. * @param delegate the delegation target * @throws IllegalArgumentException if the parameter is {@code null} */ public SafeProcessor(Processor delegate) { if (delegate == null) { throw new IllegalArgumentException("delegate must not be null"); //$NON-NLS-1$ } this.delegate = delegate; } /** * Throws the exception occurred while running {@link #process(Set, RoundEnvironment)} only if it exists. */ public void rethrow() { if (runtimeException != null) { throw runtimeException; } else if (error != null) { throw error; } } @Override public void init(ProcessingEnvironment processingEnv) { this.delegate.init(processingEnv); } @Override public Set<String> getSupportedOptions() { return this.delegate.getSupportedOptions(); } @Override public Set<String> getSupportedAnnotationTypes() { return this.delegate.getSupportedAnnotationTypes(); } @Override public SourceVersion getSupportedSourceVersion() { return this.delegate.getSupportedSourceVersion(); } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { try { return this.delegate.process(annotations, roundEnv); } catch (RuntimeException e) { runtimeException = e; throw e; } catch (Error e) { error = e; throw e; } } @Override public Iterable<? extends Completion> getCompletions( Element element, AnnotationMirror annotation, ExecutableElement member, String userText) { return this.delegate.getCompletions(element, annotation, member, userText); } }