Skip to content

Commit 8817c17

Browse files
committed
fix(thread): FWK005 parse may not be called while parsing on EventModelParser.parse()
This is a draft fix for issue : https://issues.apache.org/jira/browse/FOP-3275 It does not fix all the build error
1 parent 6779aa1 commit 8817c17

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

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

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.fop.events.model;
2121

2222
import java.util.Stack;
23+
import java.util.concurrent.*;
2324

2425
import javax.xml.transform.Source;
2526
import javax.xml.transform.Transformer;
@@ -57,16 +58,38 @@ private EventModelParser() {
5758
* @return the created event model structure
5859
* @throws TransformerException if an error occurs while parsing the XML file
5960
*/
60-
public static EventModel parse(Source src)
61-
throws TransformerException {
62-
Transformer transformer = tFactory.newTransformer();
63-
transformer.setErrorListener(new DefaultErrorListener(LOG));
64-
61+
public static EventModel parse(Source src) throws TransformerException {
6562
EventModel model = new EventModel();
66-
SAXResult res = new SAXResult(getContentHandler(model));
67-
68-
transformer.transform(src, res);
69-
return model;
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+
}
7093
}
7194

7295
/**

0 commit comments

Comments
 (0)