org.apache.poi.util.OOXMLLite - an utility to build a 'lite' version of the ooxml-schemas.jar
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@880798 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
518ae59f07
commit
aead99342f
47
build.xml
47
build.xml
@ -410,6 +410,53 @@ under the License.
|
||||
/>
|
||||
</target>
|
||||
|
||||
<!-- Build a 'lite' version of the ooxml-schemas.jar-->
|
||||
<target name="ooxml-xsds-lite" depends="test-ooxml">
|
||||
<java classname="org.apache.poi.util.OOXMLLite" fork="yes">
|
||||
<classpath refid="test.ooxml.classpath"/>
|
||||
<sysproperty key="POI.testdata.path" file="${poi.test.dir}"/>
|
||||
<sysproperty key="user.language" value="en"/>
|
||||
<sysproperty key="user.country" value="US"/>
|
||||
<arg line="-ooxml ${ooxml.xsds.jar} -test ${ooxml.output.test.dir} -dest build/ooxml-xsds-lite"/>
|
||||
</java>
|
||||
<echo message="Running ooxml tests against the 'lite' classes"/>
|
||||
<antcall target="test-ooxml-lite"/>
|
||||
<jar basedir="build/ooxml-xsds-lite" destfile="build/dist/ooxml-schemas-lite-${version.id}.jar"/>
|
||||
</target>
|
||||
|
||||
<!-- Run ooxml tests against the 'lite' version of the ooxml-schemas.jar-->
|
||||
<target name="test-ooxml-lite">
|
||||
<junit printsummary="yes" fork="yes" forkmode="once" haltonfailure="${halt.on.test.failure}" failureproperty="ooxml.test.failed">
|
||||
<classpath>
|
||||
<path refid="main.classpath"/>
|
||||
<pathelement location="${main.output.dir}"/>
|
||||
<pathelement location="${scratchpad.output.dir}"/>
|
||||
<fileset dir="${ooxml.lib}">
|
||||
<include name="*.jar" />
|
||||
<exclude name="ooxml-schemas-*.jar" />
|
||||
</fileset>
|
||||
<pathelement location="build/ooxml-xsds-lite"/>
|
||||
<pathelement location="${ooxml.output.dir}"/>
|
||||
<pathelement location="${ooxml.output.test.dir}"/>
|
||||
<pathelement location="${main.output.test.dir}"/>
|
||||
<pathelement location="${scratchpad.output.test.dir}"/>
|
||||
<pathelement location="${junit.jar1.dir}"/>
|
||||
</classpath>
|
||||
<sysproperty key="user.language" value="en"/>
|
||||
<sysproperty key="user.country" value="US"/>
|
||||
<sysproperty key="POI.testdata.path" file="${poi.test.dir}"/>
|
||||
<sysproperty key="java.awt.headless" value="true"/>
|
||||
<formatter type="plain"/>
|
||||
<formatter type="xml"/>
|
||||
<batchtest todir="${ooxml.reports.test}">
|
||||
<fileset dir="${ooxml.src.test}">
|
||||
<include name="**/Test*.java"/>
|
||||
<exclude name="**/All*Tests.java"/>
|
||||
</fileset>
|
||||
</batchtest>
|
||||
</junit>
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="init, compile-main,
|
||||
compile-scratchpad, compile-contrib, compile-examples, compile-scratchpad-examples"
|
||||
description="Compiles the POI main classes, scratchpad, contrib, examples, and scratchpad examples"/>
|
||||
|
200
src/ooxml/java/org/apache/poi/util/OOXMLLite.java
Executable file
200
src/ooxml/java/org/apache/poi/util/OOXMLLite.java
Executable file
@ -0,0 +1,200 @@
|
||||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You 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 org.apache.poi.util;
|
||||
|
||||
import junit.framework.TestSuite;
|
||||
import junit.textui.TestRunner;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
/**
|
||||
* Build a 'lite' version of the ooxml-schemas.jar
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public final class OOXMLLite {
|
||||
|
||||
private static final Field _classes;
|
||||
static {
|
||||
try {
|
||||
_classes = ClassLoader.class.getDeclaredField("classes");
|
||||
_classes.setAccessible(true);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Destination directory to copy filtered classes
|
||||
*/
|
||||
private File _destDest;
|
||||
|
||||
/**
|
||||
* Directory with the compiled ooxml tests
|
||||
*/
|
||||
private File _testDir;
|
||||
|
||||
/**
|
||||
* Reference to the ooxml-schemas.jar
|
||||
*/
|
||||
private File _ooxmlJar;
|
||||
|
||||
|
||||
OOXMLLite(String dest, String test, String ooxmlJar) {
|
||||
_destDest = new File(dest);
|
||||
_testDir = new File(test);
|
||||
_ooxmlJar = new File(ooxmlJar);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
String dest = null, test = null, ooxml = null;
|
||||
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
if (args[i].equals("-dest")) dest = args[++i];
|
||||
else if (args[i].equals("-test")) test = args[++i];
|
||||
else if (args[i].equals("-ooxml")) ooxml = args[++i];
|
||||
}
|
||||
OOXMLLite builder = new OOXMLLite(dest, test, ooxml);
|
||||
builder.build();
|
||||
}
|
||||
|
||||
void build() throws IOException{
|
||||
|
||||
List<String> lst = new ArrayList<String>();
|
||||
//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<String, Class<?>> 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<JarEntry> 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<String> 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<String, Class<?>> getLoadedClasses(String ptrn) {
|
||||
ClassLoader appLoader = ClassLoader.getSystemClassLoader();
|
||||
try {
|
||||
Vector<Class<?>> classes = (Vector<Class<?>>) _classes.get(appLoader);
|
||||
Map<String, Class<?>> map = new HashMap<String, Class<?>>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user