/******************************************************************************* * Copyright (c) 2014 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.compiler.apt.tests.processors.filer; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import javax.annotation.processing.Filer; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedOptions; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import org.eclipse.jdt.compiler.apt.tests.processors.base.BaseProcessor; /** * A processor that reads the GenResource annotation and produces the specified Java type */ @SupportedAnnotationTypes({"targets.filer8.PackageAnnot"}) @SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedOptions({}) public class Java8FilerProcessor extends BaseProcessor { String simpleName = "filer8"; String packageName = "targets.filer8"; int roundNo = 0; boolean reportSuccessAlready = true; /* (non-Javadoc) * @see javax.annotation.processing.AbstractProcessor#init(javax.annotation.processing.ProcessingEnvironment) */ @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); } /* (non-Javadoc) * @see javax.annotation.processing.AbstractProcessor#process(java.util.Set, javax.annotation.processing.RoundEnvironment) */ @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { String packageName = "targets.filer8"; this.reportSuccessAlready = true; if (++roundNo == 1) { this.reportSuccessAlready = false; try { createPackageBinary(); } catch (IOException e) { e.printStackTrace(); } System.setProperty(this.getClass().getName(), "Processor did not fully do the job"); } else if (roundNo == 2){ PackageElement packageEl = null; for (Element e : roundEnv.getRootElements()) { if (e.getKind() == ElementKind.PACKAGE) { packageEl = (PackageElement) e; } } if (packageEl == null) { reportError("Package Element not found"); return false; } if (!packageName.equals(packageEl.getQualifiedName().toString())) { reportError("Package Element \"targets.filer8\" not found"); return false; } if (packageEl.isUnnamed()) { reportError("Package info not found"); return false; } if (packageEl.getAnnotationMirrors().isEmpty()) { reportError("Annotatons not found in package-info"); return false; } } if (this.reportSuccessAlready) { super.reportSuccess(); } return false; } private void createPackageBinary() throws IOException { String path = packageName.replace('.', '/'); ClassLoader loader = getClass().getClassLoader(); InputStream in = loader.getResourceAsStream(path + "/package-info.class"); try { Filer filer = processingEnv.getFiler(); OutputStream out = filer.createClassFile(packageName + ".package-info").openOutputStream(); try { if (in != null && out != null) { int c = in.read(); while (c != -1) { out.write(c); c = in.read(); } } } finally { out.close(); } } finally { in.close(); } } }