5454import javax .xml .transform .stream .StreamResult ;
5555import javax .xml .transform .stream .StreamSource ;
5656import lombok .EqualsAndHashCode ;
57+ import net .sf .saxon .Version ;
5758import net .sf .saxon .jaxp .TransformerImpl ;
5859import net .sf .saxon .serialize .MessageWarner ;
5960import org .cactoos .map .MapEntry ;
@@ -335,11 +336,8 @@ public String toString() {
335336 public XML transform (final XML xml ) {
336337 final Document target ;
337338 try {
338- target = XSLDocument .DFACTORY .newDocumentBuilder ()
339- .newDocument ();
340- this .transformInto (
341- xml , new DOMResult (target )
342- );
339+ target = XSLDocument .DFACTORY .newDocumentBuilder ().newDocument ();
340+ this .transformInto (xml , new DOMResult (target ));
343341 } catch (final ParserConfigurationException ex ) {
344342 throw new IllegalStateException (ex );
345343 }
@@ -378,15 +376,7 @@ private void transformInto(final XML xml, final Result result) {
378376 );
379377 trans .setErrorListener (errors );
380378 trans .setURIResolver (this .sources );
381- if (
382- "net.sf.saxon.jaxp.TransformerImpl" .equals (
383- trans .getClass ().getCanonicalName ()
384- )
385- ) {
386- TransformerImpl .class .cast (trans )
387- .getUnderlyingController ()
388- .setMessageEmitter (new MessageWarner ());
389- }
379+ XSLDocument .prepare (trans );
390380 for (final Map .Entry <String , Object > ent
391381 : this .params .entrySet ()) {
392382 trans .setParameter (ent .getKey (), ent .getValue ());
@@ -404,9 +394,9 @@ private void transformInto(final XML xml, final Result result) {
404394 } catch (final TransformerException ex ) {
405395 throw new IllegalArgumentException (
406396 String .format (
407- "Failed to transform by %s: %s" ,
397+ "Failed to transform by %s: %s (%s) " ,
408398 factory .getClass ().getName (),
409- errors .summary ()
399+ errors .summary (), ex . getMessageAndLocation ()
410400 ),
411401 ex
412402 );
@@ -415,4 +405,33 @@ private void transformInto(final XML xml, final Result result) {
415405 Logger .debug (this , "%s transformed XML" , trans .getClass ().getName ());
416406 }
417407
408+ /**
409+ * Prepare it for error logging.
410+ * @param trans The transformer
411+ */
412+ @ SuppressWarnings ("deprecation" )
413+ private static void prepare (final Transformer trans ) {
414+ final String type = trans .getClass ().getCanonicalName ();
415+ if (!"net.sf.saxon.jaxp.TransformerImpl" .equals (type )) {
416+ return ;
417+ }
418+ if (Version .getStructuredVersionNumber ()[0 ] < 11 ) {
419+ TransformerImpl .class .cast (trans )
420+ .getUnderlyingController ()
421+ .setMessageEmitter (new MessageWarner ());
422+ }
423+ if (Version .getStructuredVersionNumber ()[0 ] >= 11 ) {
424+ TransformerImpl .class .cast (trans )
425+ .getUnderlyingController ()
426+ .setMessageHandler (
427+ message -> Logger .error (
428+ XSLDocument .class ,
429+ "%s: %s" ,
430+ message .getLocation (),
431+ message .toString ()
432+ )
433+ );
434+ }
435+ }
436+
418437}
0 commit comments