From c7e84f2e295c6be683b8a0efcde00d1c1060b8c3 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Tue, 18 Dec 2018 10:45:29 -0500 Subject: [PATCH] DslCompiler: Use s9api instead of JAXP The difference is described here: http://www.saxonica.com/html/documentation/using-xsl/embedding/ And s9api here: http://www.saxonica.com/html/documentation/using-xsl/embedding/s9api-transformation.html * Makefile.am (DSLC_CLASSPATH): Export for submakes. * configure.ac (DSLC_CLASSPATH): Prefix with SAXON_CP. * rater/rater.xsd (classNameType): Increase length 50=>75 (generated identifiers can now exceed that, it seems). * src/current/rater.xsd: Likewise. These files need to be combined. * src/current/src/Makefile (CLASSPATH): Set to DSLC_CLASSPATH. * src/current/src/com/lovullo/dslc/DslCompiler.java: Update imports. (DslCompiler)[_DslCompiler]: New members _processor and _xsltCompiler. Convert to s9api. --- Makefile.am | 1 + configure.ac | 2 +- rater/rater.xsd | 2 +- src/current/rater.xsd | 2 +- src/current/src/Makefile | 2 + .../src/com/lovullo/dslc/DslCompiler.java | 74 ++++++++++++------- 6 files changed, 52 insertions(+), 31 deletions(-) diff --git a/Makefile.am b/Makefile.am index 77c44bae..4f0d89da 100644 --- a/Makefile.am +++ b/Makefile.am @@ -29,6 +29,7 @@ apply_dest := $(apply_src:%.xsl=%.xsl.apply) # needed by test runner export SAXON_CP +export DSLC_CLASSPATH .DELETE_ON_ERROR: diff --git a/configure.ac b/configure.ac index f115f9aa..59ad044d 100644 --- a/configure.ac +++ b/configure.ac @@ -54,7 +54,7 @@ AS_IF(test ! -d "$HOXSL", AC_MSG_RESULT(found) # BC with RATER_CLASSPATH -DSLC_CLASSPATH="${DSLC_CLASSPATH:-$RATER_CLASSPATH}" +DSLC_CLASSPATH="$SAXON_CP:${DSLC_CLASSPATH:-$RATER_CLASSPATH}" AC_SUBST(DSLC_CLASSPATH, [$DSLC_CLASSPATH]) AC_SUBST([AUTOGENERATED], diff --git a/rater/rater.xsd b/rater/rater.xsd index d159e2d7..cbc7473a 100644 --- a/rater/rater.xsd +++ b/rater/rater.xsd @@ -1350,7 +1350,7 @@ - + diff --git a/src/current/rater.xsd b/src/current/rater.xsd index abdf1ff4..86accc4d 100644 --- a/src/current/rater.xsd +++ b/src/current/rater.xsd @@ -1327,7 +1327,7 @@ - + diff --git a/src/current/src/Makefile b/src/current/src/Makefile index 3bf8ad18..792810bd 100644 --- a/src/current/src/Makefile +++ b/src/current/src/Makefile @@ -4,6 +4,8 @@ dslc_bin := $(dslc_src:.java=.class) .PHONY: all all-nodoc dslc clean check info pdf html +export CLASSPATH=$(DSLC_CLASSPATH) + all: dslc dslc: dslc.jar diff --git a/src/current/src/com/lovullo/dslc/DslCompiler.java b/src/current/src/com/lovullo/dslc/DslCompiler.java index f7ec3e74..54cdbc1b 100644 --- a/src/current/src/com/lovullo/dslc/DslCompiler.java +++ b/src/current/src/com/lovullo/dslc/DslCompiler.java @@ -31,17 +31,15 @@ package com.lovullo.dslc; import java.io.*; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Map; import java.util.HashMap; -import javax.xml.XMLConstants; +import java.util.Map; +import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.*; -import javax.xml.validation.*; -import javax.xml.transform.sax.SAXTransformerFactory; -import org.xml.sax.SAXException; -import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXNotSupportedException; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; +import javax.xml.XMLConstants; +import net.sf.saxon.s9api.*; // TODO: Decouple from rater/ path assumptions @@ -50,8 +48,10 @@ public class DslCompiler private static class _DslCompiler { private Validator _xsd; - private HashMap _xsl; + private HashMap _xsl; private Path _pathRoot; + private Processor _processor; + private XsltCompiler _xsltCompiler; public _DslCompiler( String path_root ) @@ -59,7 +59,10 @@ public class DslCompiler { _pathRoot = Paths.get( path_root ).toRealPath(); _xsd = _createXsd(); - _xsl = new HashMap(); + _xsl = new HashMap(); + + _processor = new Processor( false ); + _xsltCompiler = _processor.newXsltCompiler(); } @@ -96,7 +99,7 @@ public class DslCompiler src, doc, cmd, - new StreamResult( new File( dest ) ), + _processor.newSerializer( new File( dest ) ), params ); @@ -122,7 +125,7 @@ public class DslCompiler String src, Source doc, String cmd, - StreamResult dest, + Destination dest, HashMap params ) throws Exception { @@ -142,26 +145,45 @@ public class DslCompiler Integer dircount = srcpkg.replaceAll( "[^/]", "" ).length(); String relroot = new String( new char[ dircount ] ).replace( "\0", "../" ); - Transformer t = _xsl.get( cmd ); - t.setParameter( "__path-root", _pathRoot.toString() + "/tame" ); - t.setParameter( "__srcpkg", srcpkg ); - t.setParameter( "__relroot", relroot ); - t.setParameter( "__rseed", (int)( Math.random() * 10e6 ) ); + XsltTransformer t = _xsl.get( cmd ); + + t.setParameter( + new QName( "__path-root" ), + XdmValue.makeValue( _pathRoot.toString() + "/tame" ) + ); + t.setParameter( + new QName( "__srcpkg" ), + XdmValue.makeValue( srcpkg ) + ); + t.setParameter( + new QName( "__relroot" ), + XdmValue.makeValue( relroot ) + ); + t.setParameter( + new QName( "__rseed" ), + XdmValue.makeValue( (int)( Math.random() * 10e6 ) ) + ); _setTemplateParams( t, params ); - t.transform( doc, dest ); + t.setSource( doc ); + t.setDestination( dest ); + + t.transform(); } private void _setTemplateParams( - Transformer t, + XsltTransformer t, HashMap params ) throws Exception { for ( Map.Entry param : params.entrySet() ) { - t.setParameter( param.getKey(), param.getValue() ); + t.setParameter( + new QName( param.getKey() ), + XdmValue.makeValue( param.getValue() ) + ); } } @@ -200,7 +222,7 @@ public class DslCompiler return schema.newValidator(); } - catch ( SAXException e ) + catch ( Exception e ) { System.err.printf( "fatal: %s\n", @@ -214,19 +236,15 @@ public class DslCompiler } - private Transformer _createXslt( String src ) + private XsltTransformer _createXslt( String src ) { try { - final TransformerFactory factory = TransformerFactory.newInstance( - "net.sf.saxon.TransformerFactoryImpl", null - ); - final Source xsl = new StreamSource( _pathRoot.toString() + "/" + src + ".xsl" ); - return factory.newTransformer( xsl ); + return _xsltCompiler.compile( xsl ).load(); } catch ( Exception e ) {