Skip to content

Commit 4e8e697

Browse files
committed
chore(optimize): different behaviour for java 25+
Older version of java will use the previous behavior. This is a draft fix for issue : https://issues.apache.org/jira/browse/FOP-3275
1 parent 8817c17 commit 4e8e697

File tree

1 file changed

+62
-31
lines changed

1 file changed

+62
-31
lines changed

fop-events/src/main/java/org/apache/fop/events/model/EventModelParser.java

Lines changed: 62 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import java.util.Stack;
2323
import java.util.concurrent.*;
24+
import java.util.function.Function;
2425

2526
import javax.xml.transform.Source;
2627
import javax.xml.transform.Transformer;
@@ -52,44 +53,74 @@ private EventModelParser() {
5253
private static SAXTransformerFactory tFactory
5354
= (SAXTransformerFactory)SAXTransformerFactory.newInstance();
5455

56+
abstract static class EventModelParserWorker {
57+
public abstract EventModel parse(Source src) throws TransformerException;
58+
}
59+
60+
private static EventModelParserWorker init() {
61+
String javaVersion = System.getProperty("java.version");
62+
if ( javaVersion.compareTo( "25" ) < 0 ) {
63+
return new EventModelParserWorker() {
64+
@Override
65+
public EventModel parse(Source src) throws TransformerException {
66+
Transformer transformer = tFactory.newTransformer();
67+
transformer.setErrorListener(new DefaultErrorListener(LOG));
68+
EventModel model = new EventModel();
69+
SAXResult res = new SAXResult(getContentHandler(model));
70+
transformer.transform(src, res);
71+
return model;
72+
}
73+
};
74+
} else {
75+
return new EventModelParserWorker() {
76+
@Override
77+
public EventModel parse(Source src) throws TransformerException {
78+
EventModel model = new EventModel();
79+
// Create a single-thread executor for this parsing operation
80+
ExecutorService executor = Executors.newSingleThreadExecutor();
81+
try ( AutoCloseable executorAc = () -> executor.shutdown() ) {
82+
// Submit the parsing task and wait for completion
83+
Future<Void> parsingTask = executor.submit(() -> {
84+
try {
85+
Transformer transformer = tFactory.newTransformer();
86+
transformer.setErrorListener(new DefaultErrorListener(LOG));
87+
SAXResult res = new SAXResult(getContentHandler(model));
88+
transformer.transform(src, res);
89+
return null;
90+
} catch (TransformerException e) {
91+
throw new RuntimeException(e);
92+
}
93+
});
94+
// Block until parsing is complete
95+
parsingTask.get();
96+
return model;
97+
} catch (ExecutionException e) {
98+
if (e.getCause() instanceof RuntimeException &&
99+
e.getCause().getCause() instanceof TransformerException) {
100+
throw (TransformerException) e.getCause().getCause();
101+
}
102+
throw new TransformerException(e.getCause());
103+
} catch (InterruptedException e) {
104+
Thread.currentThread().interrupt();
105+
throw new TransformerException("Parsing was interrupted", e);
106+
} catch (Exception e) {
107+
throw new TransformerException("Parsing generic error", e);
108+
}
109+
}
110+
};
111+
}
112+
}
113+
114+
private static final EventModelParserWorker PARSER_WORKER = init();
115+
55116
/**
56117
* Parses an event model file into an EventModel instance.
57118
* @param src the Source instance pointing to the XML file
58119
* @return the created event model structure
59120
* @throws TransformerException if an error occurs while parsing the XML file
60121
*/
61122
public static EventModel parse(Source src) throws TransformerException {
62-
EventModel model = new EventModel();
63-
// Create a single-thread executor for this parsing operation
64-
ExecutorService executor = Executors.newSingleThreadExecutor();
65-
try ( AutoCloseable executorAc = () -> executor.shutdown() ) {
66-
// Submit the parsing task and wait for completion
67-
Future<Void> parsingTask = executor.submit(() -> {
68-
try {
69-
Transformer transformer = tFactory.newTransformer();
70-
transformer.setErrorListener(new DefaultErrorListener(LOG));
71-
SAXResult res = new SAXResult(getContentHandler(model));
72-
transformer.transform(src, res);
73-
return null;
74-
} catch (TransformerException e) {
75-
throw new RuntimeException(e);
76-
}
77-
});
78-
// Block until parsing is complete
79-
parsingTask.get();
80-
return model;
81-
} catch (ExecutionException e) {
82-
if (e.getCause() instanceof RuntimeException &&
83-
e.getCause().getCause() instanceof TransformerException) {
84-
throw (TransformerException) e.getCause().getCause();
85-
}
86-
throw new TransformerException(e.getCause());
87-
} catch (InterruptedException e) {
88-
Thread.currentThread().interrupt();
89-
throw new TransformerException("Parsing was interrupted", e);
90-
} catch (Exception e) {
91-
throw new TransformerException("Parsing generic error", e);
92-
}
123+
return PARSER_WORKER.parse(src);
93124
}
94125

95126
/**

0 commit comments

Comments
 (0)