diff --git a/build.xml b/build.xml index 3f7ff7bc1..3cfb9aed7 100644 --- a/build.xml +++ b/build.xml @@ -184,8 +184,8 @@ under the License. - - + + @@ -408,7 +408,54 @@ under the License. basedir="${ooxml.xsds.src.dir}" destfile="${ooxml.xsds.src.jar}" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lst = new ArrayList(); + //collect unit tests + System.out.println("Collecting unit tests"); + collectTests(_testDir, _testDir, lst, ".+?\\.Test.+?\\.class$"); + + TestSuite suite = new TestSuite(); + for (String arg : lst) { + //ignore inner classes defined in tests + if (arg.indexOf('$') != -1) continue; + + String cls = arg.replace(".class", ""); + try { + Class test = Class.forName(cls); + suite.addTestSuite(test); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + //run tests + System.out.println("Running tests"); + TestRunner.run(suite); + + //see what classes from the ooxml-schemas.jar are loaded + System.out.println("Copying classes"); + Map> classes = getLoadedClasses(_ooxmlJar.getName()); + for (Class cls : classes.values()) { + String className = cls.getName(); + String classRef = className.replace('.', '/') + ".class"; + File destFile = new File(_destDest, classRef); + //System.out.println(classRef + " --> " + destFile); + copyFile(cls.getResourceAsStream('/' + classRef), destFile); + + if(cls.isInterface()){ + //always copy Factory that accompanies every ooxml schema object + String factoryClass = className + "$Factory"; + if(!classes.containsKey(factoryClass)){ + try { + Class fc = Class.forName(factoryClass); + className = fc.getName(); + classRef = className.replace('.', '/') + ".class"; + destFile = new File(_destDest, classRef); + //System.out.println(classRef + " --> " + destFile); + copyFile(fc.getResourceAsStream('/' + classRef), destFile); + } catch(ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + } + + //finally copy the compiled .xsb files + System.out.println("Copying .xsb resources"); + JarFile jar = new JarFile(_ooxmlJar); + for(Enumeration e = jar.entries(); e.hasMoreElements(); ){ + JarEntry je = e.nextElement(); + if(je.getName().matches("schemaorg_apache_xmlbeans/system/\\w+/\\w+\\.xsb")){ + File destFile = new File(_destDest, je.getName()); + //System.out.println(je.getName() + " --> " + destFile); + copyFile(jar.getInputStream(je), destFile); + } + } + jar.close(); + } + + /** + * Recursively collect classes from the supplied directory + * + * @param arg the directory to search in + * @param out output + * @param ptrn the pattern (regexp) to filter found files + */ + private static void collectTests(File root, File arg, List out, String ptrn) { + if (arg.isDirectory()) { + for (File f : arg.listFiles()) { + collectTests(root, f, out, ptrn); + } + } else { + String path = arg.getAbsolutePath(); + String prefix = root.getAbsolutePath(); + String cls = path.substring(prefix.length() + 1).replace(File.separator, "."); + if(cls.matches(ptrn)) out.add(cls); + } + } + + /** + * + * @param ptrn the pattern to filter output + * @return the classes loaded by the system class loader keyed by class name + */ + @SuppressWarnings("unchecked") + private static Map> getLoadedClasses(String ptrn) { + ClassLoader appLoader = ClassLoader.getSystemClassLoader(); + try { + Vector> classes = (Vector>) _classes.get(appLoader); + Map> map = new HashMap>(); + for (Class cls : classes) { + String jar = cls.getProtectionDomain().getCodeSource().getLocation().toString(); + if(jar.indexOf(ptrn) != -1) map.put(cls.getName(), cls); + } + return map; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private static void copyFile(InputStream srcStream, File destFile) throws IOException { + File destDirectory = destFile.getParentFile(); + destDirectory.mkdirs(); + OutputStream destStream = new FileOutputStream(destFile); + try { + IOUtils.copy(srcStream, destStream); + } finally { + destStream.close(); + } + } + +} \ No newline at end of file