/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package tests; import java.io.*; import java.util.*; import java.util.zip.*; import util.*; /** * Create the romtestclasses.zip that contains classes that need to be * romized for the romizer unit tests. */ public class CreateRomTestClasses { static void usage() { System.out.println("Usage: java -jar buildtool.jar " + "romtestclasses cldc_classes.zip " + "cldcx_classes.zip tests.jar <outputfile>"); } static File workspacedir; static File outputdir; static Vector sourcefiles; static PrintWriter pw; public static void main(String args[]) throws Throwable { if (args.length != 4) { usage(); System.exit(1); } File cldc_classes_zip = new File(args[0]); File cldcx_classes_zip = new File(args[1]); File tests_jar = new File(args[2]); File output = new File(args[3]); FileOutputStream out = new FileOutputStream(output); ZipOutputStream zout = new ZipOutputStream(out); // Simply copy all entries from cldc_classes_zip and cldcx_classes_zip copyZipEntries(zout, cldc_classes_zip, null); copyZipEntries(zout, cldcx_classes_zip, null); // We need to filter out the entries in tests_jar if: // (1) The test is a negative test case // (2) The test may use a feature that's not supported by the // VM's configuration (e.g., floating point or CLDC 1.1 API) Filter filter = new Filter(); copyZipEntries(zout, tests_jar, filter); zout.close(); } /** * Copy the content of of the given zip file source * to the ZIP file output stream */ static void copyZipEntries(ZipOutputStream zout, File src, Filter filter) throws Throwable { ZipFile zipSrc = null; try { zipSrc = new ZipFile(src); } catch (Throwable t) { System.out.println("Unexpected error:"); t.printStackTrace(); System.out.println(); System.out.println("Your JDK_DIR cannot handle long JAR entries"); System.out.println("Please upgrade to JDK 1.4.1 or later."); System.out.println("JDK version '1.4.1' is known to work."); System.exit(-1); } for (Enumeration e = zipSrc.entries(); e.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) e.nextElement(); String name = entry.getName(); if (name.startsWith("META-INF")) { continue; } if (filter != null && !filter.includeEntry(entry.getName())) { continue; } int size = (int)entry.getSize(); byte data[] = new byte[size]; InputStream in = zipSrc.getInputStream(entry); DataInputStream din = new DataInputStream(in); din.readFully(data); zout.putNextEntry(entry); zout.write(data, 0, data.length); zout.closeEntry(); din.close(); } } static class Filter { static final String include_prefixes[] = { "Sanity", "com/sun/tck/cldc/lib/", "vm/share/rom/ROMOptimizer/functional_test1_b", "vm/share/rom/ROMWriter/generate_java_fieldmap2_rom", "vm/share/rom/ROMWriter/generate_java_fieldmap1_rom", "vm/share/rom/ROMInliner/rom_", "util/", "bench/NativeMethod.class", "rom/", "vm/share/natives/jni", "vm/share/natives/sni", "vm/share/natives/kni", "vm/share/runtime/JVM/JVM_SetHeapLimit1", "vm/cpu/share/InterpreterGenerator/FastMemRoutines", "vm/share/memory/FinalizerWeakRef", "anilib", "isolate/tests/Natives", "vm/cpu/arm/CodeGenerator_arm", "mps/HiddenClass", "mps/hidden", "vm/cpu/share/CodeGenerator/InitStaticArrayTest", "vm/share/compiler/BytecodeCompileClosure/A", }; static final String include_infixes[] = { "/SNI_", }; static final String include_suffixes[] = { "_rom.class", }; static final String exclude_prefixes[] = { "rom/unrestricted/NotRomized.class", "rom/restricted/NotRomized.class", "rom/hidden/NotRomized.class", }; /** * @return true iff the given entry should be included in * the output ZIP file */ public boolean includeEntry(String name) { if (!name.endsWith(".class")) { return false; } boolean include = false; for (int i=0; i<include_prefixes.length; i++) { String prefix = include_prefixes[i]; if (name.startsWith(prefix)) { include = true; break; } } for (int i=0; i<include_suffixes.length; i++) { String prefix = include_suffixes[i]; if (name.endsWith(prefix)) { include = true; break; } } for (int i=0; i<include_infixes.length; i++) { String prefix = include_infixes[i]; if (name.indexOf(prefix) != -1) { include = true; break; } } if (include) { for (int i=0; i<exclude_prefixes.length; i++) { String prefix = exclude_prefixes[i]; if (name.startsWith(prefix)) { include = false; break; } } } if (include) { System.out.println("Added to ROM: " + name); } return include; } } }