You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2020/12/28 00:47:23 UTC
svn commit: r1884850 - in /poi/trunk: build.xml
src/multimodule/ooxml-lite-agent/java9/module-info.class
src/multimodule/ooxml-lite-agent/java9/module-info.java
src/ooxml/testcases/org/apache/poi/ooxml/lite/OOXMLLiteAgent.java
Author: kiwiwings
Date: Mon Dec 28 00:47:23 2020
New Revision: 1884850
URL: http://svn.apache.org/viewvc?rev=1884850&view=rev
Log:
gather necessary .xsb for ooxml-lite jar via intercepting the calls to SchemaTypeSystemImpl.XsbReader
Modified:
poi/trunk/build.xml
poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.class
poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.java
poi/trunk/src/ooxml/testcases/org/apache/poi/ooxml/lite/OOXMLLiteAgent.java
Modified: poi/trunk/build.xml
URL: http://svn.apache.org/viewvc/poi/trunk/build.xml?rev=1884850&r1=1884849&r2=1884850&view=diff
==============================================================================
--- poi/trunk/build.xml (original)
+++ poi/trunk/build.xml Mon Dec 28 00:47:23 2020
@@ -157,7 +157,7 @@ under the License.
<property name="ooxml.testokfile" location="build/ooxml-testokfile.txt"/>
<property name="ooxml.lite.agent" location="lib/ooxml-tests/ooxml-lite-agent.jar"/>
- <property name="ooxml.lite.report" location="build/ooxml-lite-report.txt"/>
+ <property name="ooxml.lite.report" location="build/ooxml-lite-report"/>
<property name="ooxml.lite.jar" location="build/dist/maven/poi-ooxml-lite/poi-ooxml-lite-${version.id}.jar"/>
<property name="ooxml.lite.includes" value="^(com/microsoft/schemas|org/(etsi|openxmlformats|w3/)|org/apache/poi/schemas)"/>
@@ -1157,6 +1157,7 @@ under the License.
destdir="${basedir}/src/multimodule/ooxml-lite-agent/java9"
includeantruntime="false"
fork="true"
+ modulepath="${basedir}/lib/main-tests"
unless:true="${isJava8}">
<compilerarg line="--patch-module org.apache.poi.ooxml_lite=${ooxml.output.test.dir}"/>
</javac>
@@ -1168,6 +1169,7 @@ under the License.
<attribute name="Multi-Release" value="true"/>
<attribute name="Automatic-Module-Name" value="org.apache.poi.ooxml_lite"/>
<attribute name="Premain-Class" value="org.apache.poi.ooxml.lite.OOXMLLiteAgent"/>
+ <!-- attribute name="Can-Retransform-Classes" value="true"/ -->
</manifest>
</jar>
</target>
@@ -1711,7 +1713,7 @@ under the License.
<echo message="Create ooxml-lite schemas"/>
<local name="lite.exports"/>
<loadresource property="lite.exports">
- <file file="${ooxml.lite.report}"/>
+ <file file="${ooxml.lite.report}.clazz"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="[/\\][^/\\]+$" replace=""/>
@@ -1750,7 +1752,7 @@ under the License.
</modulepath>
</javac>
- <copy file="${ooxml.lite.report}" tofile="build/ooxml-lite-classes.txt" overwrite="true">
+ <copy file="${ooxml.lite.report}.clazz" tofile="${ooxml.lite.report}.clazz2" overwrite="true">
<filterchain>
<tokenfilter>
<replaceregex pattern="(.*)" replace="\1.class${line.separator}\1$*.class "/>
@@ -1758,62 +1760,22 @@ under the License.
</filterchain>
</copy>
- <local name="ooxml.lite.xsbs"/>
- <loadresource property="ooxml.lite.xsbs">
- <file file="${ooxml.lite.report}"/>
+ <copy file="${ooxml.lite.report}.xsb" tofile="${ooxml.lite.report}.xsb2" overwrite="true">
<filterchain>
- <linecontains negate="true" matchany="true">
- <contains value="$"/>
- <contains value="TypeSystemHolder"/>
- </linecontains>
- <suffixlines suffix=".java"/>
- </filterchain>
- </loadresource>
-
- <concat dest="build/ooxml-lite-classes.txt" append="true">
- <filelist dir="build/xmlbean-sources" files="${ooxml.lite.xsbs}"/>
- <filterchain>
- <linecontains>
- <contains value="resolveHandle"/>
- </linecontains>
- <replaceregex pattern='.*"([^"]+)".*' replace="org/apache/poi/schemas/ooxml/system/ooxml/\1.xsb"/>
+ <prefixlines prefix="org/apache/poi/schemas/ooxml/system/ooxml/"/>
+ <suffixlines suffix=".xsb"/>
</filterchain>
- </concat>
-
- <!-- the following xsb files aren't detected, i.e. not directly loaded by XmlBeans interface classes -->
- <echo file="build/ooxml-lite-classes.txt" append="true">
-org/apache/poi/schemas/ooxml/system/ooxml/index.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/picelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/groupelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/group7d3fdoctype.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/shapelayoutelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/shapetypeelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/shapetypeb89bdoctype.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/shapeelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/shapeaee1doctype.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/tblelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/tbleb1bdoctype.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/relationshipreferenceelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/qualifyingpropertieselement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/oleobjelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/oleobj8482doctype.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/stcellspans60f6type.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/stcellspanf3a5type.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/alternatecontentelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/chartelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/chartf85cdoctype.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/rectelement.xsb
-org/apache/poi/schemas/ooxml/system/ooxml/rectaf36doctype.xsb
- </echo>
+ </copy>
<mkdir dir="build/dist/maven/poi-ooxml-lite"/>
<jar destfile="${ooxml.lite.jar}" duplicate="preserve">
<zipfileset dir="${basedir}/src/multimodule/ooxml-lite/java9" prefix="META-INF/versions/9" excludes="*.java"/>
<zipfileset src="${ooxml.xsds.jar}">
- <patternset includesfile="build/ooxml-lite-classes.txt">
+ <patternset includesfile="${ooxml.lite.report}.clazz2">
<include name="org/apache/poi/schemas/ooxml/element/**/*.xsb"/>
</patternset>
+ <patternset includesfile="${ooxml.lite.report}.xsb2"/>
</zipfileset>
<zipfileset dir="src/multimodule/ooxml-full/java9" prefix="META-INF/versions/9" excludes="*.java"/>
<manifest>
Modified: poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.class
URL: http://svn.apache.org/viewvc/poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.class?rev=1884850&r1=1884849&r2=1884850&view=diff
==============================================================================
Binary files - no diff available.
Modified: poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.java?rev=1884850&r1=1884849&r2=1884850&view=diff
==============================================================================
--- poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.java (original)
+++ poi/trunk/src/multimodule/ooxml-lite-agent/java9/module-info.java Mon Dec 28 00:47:23 2020
@@ -17,6 +17,7 @@
module org.apache.poi.ooxml_lite {
requires java.instrument;
+ requires static net.bytebuddy.agent;
exports org.apache.poi.ooxml.lite;
}
\ No newline at end of file
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/ooxml/lite/OOXMLLiteAgent.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/ooxml/lite/OOXMLLiteAgent.java?rev=1884850&r1=1884849&r2=1884850&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/ooxml/lite/OOXMLLiteAgent.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/ooxml/lite/OOXMLLiteAgent.java Mon Dec 28 00:47:23 2020
@@ -17,6 +17,8 @@
package org.apache.poi.ooxml.lite;
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
@@ -31,48 +33,108 @@ import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Stream;
+import net.bytebuddy.agent.builder.AgentBuilder;
+import net.bytebuddy.implementation.MethodDelegation;
+import net.bytebuddy.implementation.SuperMethodCall;
+import net.bytebuddy.matcher.ElementMatchers;
+import org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl;
+
/**
* OOXMLLiteAgent is the replacement for the former OOXMLLite, because in Java 12
* it isn't possible to access the privates :) of the ClassLoader
*/
public class OOXMLLiteAgent {
- static class LoggingTransformer implements ClassFileTransformer {
- final Path path;
- final Pattern includes;
- final Set<Integer> fileHashes = new HashSet<>();
-
- public LoggingTransformer(String agentArgs) {
- String[] args = (agentArgs == null ? "" : agentArgs).split("\\|", 2);
- path = Paths.get(args.length >= 1 ? args[0] : "ooxml-lite.out");
- includes = Pattern.compile(args.length >= 2 ? args[1] : ".*/schemas/.*");
+ public static void premain(String agentArgs, Instrumentation inst) throws IOException {
+ String[] args = (agentArgs == null ? "" : agentArgs).split("\\|", 2);
+ String logBase = args.length >= 1 ? args[0] : "ooxml-lite-report";
+
+ XsbLogger.load(logBase+".xsb");
+
+ ClazzLogger log = new ClazzLogger();
+ log.load(logBase+".clazz");
+ log.setPattern(args.length >= 2 ? args[1] : ".*/schemas/.*");
+ inst.addTransformer(log);
+
+ new AgentBuilder.Default()
+ // .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
+ .type(named("org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl$XsbReader"))
+ .transform((builder, type, cl, m) ->
+ builder
+ .constructor(ElementMatchers.any())
+ .intercept(MethodDelegation.to(XsbLogger.class).andThen(SuperMethodCall.INSTANCE))
+ )
+ .installOn(inst);
+ }
- try {
- if (Files.exists(path)) {
- try (Stream<String> stream = Files.lines(path)) {
- stream.forEach((s) -> fileHashes.add(s.hashCode()));
- }
- } else {
- Files.createFile(path);
+ /**
+ * This logger intercepts the loading of XmlBeans .xsb
+ *
+ * when ran in the ant junitlauncher, it's not possible to have the interceptor methods as
+ * instance method of ClazzLogger. the junit test will fail ... though it works ok in IntelliJ
+ * probably because of classpath vs. modulepath instantiation
+ */
+ public static class XsbLogger {
+ private static Path logPath;
+ private static final Set<Integer> hashes = new HashSet<>();
+
+ static void load(String path) throws IOException {
+ logPath = Paths.get(path);
+ if (Files.exists(logPath)) {
+ try (Stream<String> stream = Files.lines(logPath)) {
+ stream.forEach((s) -> hashes.add(s.hashCode()));
}
- } catch (IOException ignored) {
}
}
- public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) {
- if (path != null && className != null && !fileHashes.contains(className.hashCode()) && includes.matcher(className).find()) {
- try {
- // TODO: check if this is atomic ... as transform() is probably called synchronized, it doesn't matter anyway
- Files.write(path, (className+"\n").getBytes(StandardCharsets.ISO_8859_1), StandardOpenOption.APPEND);
- fileHashes.add(className.hashCode());
- } catch (IOException ignroed) {
+ // SchemaTypeSystemImpl.XsbReader::new is delegated to here - method name doesn't matter
+ public static void loadXsb(SchemaTypeSystemImpl parent, String handle) {
+ write(logPath, handle, hashes);
+ }
+
+ public static void loadXsb(SchemaTypeSystemImpl parent, String handle, int filetype) {
+ loadXsb(parent, handle);
+ }
+ }
+
+ /**
+ * This logger is used to log the used XmlBeans classes
+ */
+ public static class ClazzLogger implements ClassFileTransformer {
+ Path logPath;
+ Pattern includes;
+ final Set<Integer> hashes = new HashSet<>();
+
+ public void setPattern(String regex) {
+ includes = Pattern.compile(regex);
+ }
+
+ public void load(String path) throws IOException {
+ this.logPath = Paths.get(path);
+ if (Files.exists(this.logPath)) {
+ try (Stream<String> stream = Files.lines(this.logPath)) {
+ stream.forEach((s) -> hashes.add(s.hashCode()));
}
}
+ }
+
+ public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) {
+ if (logPath != null && className != null && includes.matcher(className).find()) {
+ write(logPath, className, hashes);
+ }
return bytes;
}
}
- public static void premain(String agentArgs, Instrumentation inst) {
- inst.addTransformer(new LoggingTransformer(agentArgs));
+
+ static void write(Path path, String item, Set<Integer> hashes) {
+ if (!hashes.contains(item.hashCode())) {
+ try {
+ // TODO: check if this is atomic ... as transform() is probably called synchronized, it doesn't matter anyway
+ Files.write(path, (item+"\n").getBytes(StandardCharsets.ISO_8859_1), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
+ hashes.add(item.hashCode());
+ } catch (IOException ignroed) {
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org