jaroslav@611: /** jaroslav@611: * Back 2 Browser Bytecode Translator jaroslav@611: * Copyright (C) 2012 Jaroslav Tulach jaroslav@611: * jaroslav@611: * This program is free software: you can redistribute it and/or modify jaroslav@611: * it under the terms of the GNU General Public License as published by jaroslav@611: * the Free Software Foundation, version 2 of the License. jaroslav@611: * jaroslav@611: * This program is distributed in the hope that it will be useful, jaroslav@611: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@611: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@611: * GNU General Public License for more details. jaroslav@611: * jaroslav@611: * You should have received a copy of the GNU General Public License jaroslav@611: * along with this program. Look for COPYING file in the top folder. jaroslav@611: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@611: */ jaroslav@611: package org.apidesign.bck2brwsr.vmtest.impl; jaroslav@611: jaroslav@611: import java.io.ByteArrayInputStream; jaroslav@611: import java.io.IOException; jaroslav@611: import java.io.OutputStream; jaroslav@611: import java.util.Set; jaroslav@611: import java.util.jar.JarEntry; jaroslav@611: import java.util.jar.JarOutputStream; jaroslav@611: import java.util.jar.Manifest; jaroslav@611: import javax.annotation.processing.AbstractProcessor; jaroslav@672: import javax.annotation.processing.Filer; jaroslav@611: import javax.annotation.processing.Processor; jaroslav@611: import javax.annotation.processing.RoundEnvironment; jaroslav@611: import javax.annotation.processing.SupportedAnnotationTypes; jaroslav@611: import javax.lang.model.element.Element; jaroslav@611: import javax.lang.model.element.ElementKind; jaroslav@611: import javax.lang.model.element.PackageElement; jaroslav@611: import javax.lang.model.element.TypeElement; jaroslav@611: import javax.tools.Diagnostic; jaroslav@611: import javax.tools.FileObject; jaroslav@611: import javax.tools.StandardLocation; jaroslav@611: import org.openide.util.lookup.ServiceProvider; jaroslav@611: jaroslav@611: /** jaroslav@611: * jaroslav@611: * @author Jaroslav Tulach jaroslav@611: */ jaroslav@611: @ServiceProvider(service = Processor.class) jaroslav@611: @SupportedAnnotationTypes("org.apidesign.bck2brwsr.vmtest.impl.GenerateZip") jaroslav@611: public class GenerateZipProcessor extends AbstractProcessor { jaroslav@611: jaroslav@611: @Override jaroslav@611: public boolean process(Set annotations, RoundEnvironment roundEnv) { jaroslav@611: for (Element e : roundEnv.getElementsAnnotatedWith(GenerateZip.class)) { jaroslav@611: GenerateZip gz = e.getAnnotation(GenerateZip.class); jaroslav@611: if (gz == null) { jaroslav@611: continue; jaroslav@611: } jaroslav@611: PackageElement pe = findPackage(e); jaroslav@611: try { jaroslav@611: generateJar(pe, gz, e); jaroslav@611: } catch (IOException ex) { jaroslav@611: processingEnv.getMessager().printMessage( jaroslav@611: Diagnostic.Kind.ERROR, jaroslav@611: "Can't generate JAR " + gz.name() + ": " + ex.getMessage() jaroslav@611: ); jaroslav@611: } jaroslav@611: } jaroslav@611: return true; jaroslav@611: } jaroslav@611: jaroslav@611: private static PackageElement findPackage(Element e) { jaroslav@611: while (e.getKind() != ElementKind.PACKAGE) { jaroslav@611: e = e.getEnclosingElement(); jaroslav@611: } jaroslav@611: return (PackageElement)e; jaroslav@611: } jaroslav@611: jaroslav@611: private void generateJar(PackageElement pe, GenerateZip gz, Element e) throws IOException { jaroslav@672: final Filer filer = processingEnv.getFiler(); jaroslav@672: FileObject res = filer.createResource( jaroslav@611: StandardLocation.CLASS_OUTPUT, jaroslav@611: pe.getQualifiedName().toString(), jaroslav@611: gz.name(), e jaroslav@611: ); jaroslav@611: OutputStream os = res.openOutputStream(); jaroslav@611: JarOutputStream jar; jaroslav@611: if (gz.manifest().isEmpty()) { jaroslav@611: jar = new JarOutputStream(os); jaroslav@611: } else { jaroslav@611: Manifest mf = new Manifest(new ByteArrayInputStream(gz.manifest().getBytes("UTF-8"))); jaroslav@611: jar = new JarOutputStream(os, mf); jaroslav@611: } jaroslav@611: String[] arr = gz.contents(); jaroslav@611: for (int i = 0; i < arr.length; i += 2) { jaroslav@611: JarEntry je = new JarEntry(arr[i]); jaroslav@611: jar.putNextEntry(je); jaroslav@611: jar.write(arr[i + 1].getBytes("UTF-8")); jaroslav@611: jar.closeEntry(); jaroslav@611: } jaroslav@672: jar.close(); jaroslav@611: } jaroslav@672: jaroslav@611: }