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.
master
Mike Gerwitz 2018-12-18 10:45:29 -05:00
parent 044498f03f
commit c7e84f2e29
6 changed files with 52 additions and 31 deletions

View File

@ -29,6 +29,7 @@ apply_dest := $(apply_src:%.xsl=%.xsl.apply)
# needed by test runner # needed by test runner
export SAXON_CP export SAXON_CP
export DSLC_CLASSPATH
.DELETE_ON_ERROR: .DELETE_ON_ERROR:

View File

@ -54,7 +54,7 @@ AS_IF(test ! -d "$HOXSL",
AC_MSG_RESULT(found) AC_MSG_RESULT(found)
# BC with RATER_CLASSPATH # 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(DSLC_CLASSPATH, [$DSLC_CLASSPATH])
AC_SUBST([AUTOGENERATED], AC_SUBST([AUTOGENERATED],

View File

@ -1350,7 +1350,7 @@
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="[a-z-][a-z0-9-]+|@[a-z][a-zA-Z0-9_]*@" /> <xs:pattern value="[a-z-][a-z0-9-]+|@[a-z][a-zA-Z0-9_]*@" />
<xs:minLength value="2" /> <xs:minLength value="2" />
<xs:maxLength value="50" /> <xs:maxLength value="75" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>

View File

@ -1327,7 +1327,7 @@
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="[a-z-][a-z0-9-]+|@[a-z][a-zA-Z0-9_]*@" /> <xs:pattern value="[a-z-][a-z0-9-]+|@[a-z][a-zA-Z0-9_]*@" />
<xs:minLength value="2" /> <xs:minLength value="2" />
<xs:maxLength value="50" /> <xs:maxLength value="75" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>

View File

@ -4,6 +4,8 @@ dslc_bin := $(dslc_src:.java=.class)
.PHONY: all all-nodoc dslc clean check info pdf html .PHONY: all all-nodoc dslc clean check info pdf html
export CLASSPATH=$(DSLC_CLASSPATH)
all: dslc all: dslc
dslc: dslc.jar dslc: dslc.jar

View File

@ -31,17 +31,15 @@ package com.lovullo.dslc;
import java.io.*; import java.io.*;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Map;
import java.util.HashMap; 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.StreamSource;
import javax.xml.transform.stream.StreamResult; import javax.xml.validation.Schema;
import javax.xml.transform.*; import javax.xml.validation.SchemaFactory;
import javax.xml.validation.*; import javax.xml.validation.Validator;
import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.XMLConstants;
import org.xml.sax.SAXException; import net.sf.saxon.s9api.*;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
// TODO: Decouple from rater/ path assumptions // TODO: Decouple from rater/ path assumptions
@ -50,8 +48,10 @@ public class DslCompiler
private static class _DslCompiler private static class _DslCompiler
{ {
private Validator _xsd; private Validator _xsd;
private HashMap<String,Transformer> _xsl; private HashMap<String,XsltTransformer> _xsl;
private Path _pathRoot; private Path _pathRoot;
private Processor _processor;
private XsltCompiler _xsltCompiler;
public _DslCompiler( String path_root ) public _DslCompiler( String path_root )
@ -59,7 +59,10 @@ public class DslCompiler
{ {
_pathRoot = Paths.get( path_root ).toRealPath(); _pathRoot = Paths.get( path_root ).toRealPath();
_xsd = _createXsd(); _xsd = _createXsd();
_xsl = new HashMap<String,Transformer>(); _xsl = new HashMap<String,XsltTransformer>();
_processor = new Processor( false );
_xsltCompiler = _processor.newXsltCompiler();
} }
@ -96,7 +99,7 @@ public class DslCompiler
src, src,
doc, doc,
cmd, cmd,
new StreamResult( new File( dest ) ), _processor.newSerializer( new File( dest ) ),
params params
); );
@ -122,7 +125,7 @@ public class DslCompiler
String src, String src,
Source doc, Source doc,
String cmd, String cmd,
StreamResult dest, Destination dest,
HashMap<String,String> params HashMap<String,String> params
) throws Exception ) throws Exception
{ {
@ -142,26 +145,45 @@ public class DslCompiler
Integer dircount = srcpkg.replaceAll( "[^/]", "" ).length(); Integer dircount = srcpkg.replaceAll( "[^/]", "" ).length();
String relroot = new String( new char[ dircount ] ).replace( "\0", "../" ); String relroot = new String( new char[ dircount ] ).replace( "\0", "../" );
Transformer t = _xsl.get( cmd ); XsltTransformer t = _xsl.get( cmd );
t.setParameter( "__path-root", _pathRoot.toString() + "/tame" );
t.setParameter( "__srcpkg", srcpkg ); t.setParameter(
t.setParameter( "__relroot", relroot ); new QName( "__path-root" ),
t.setParameter( "__rseed", (int)( Math.random() * 10e6 ) ); 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 ); _setTemplateParams( t, params );
t.transform( doc, dest ); t.setSource( doc );
t.setDestination( dest );
t.transform();
} }
private void _setTemplateParams( private void _setTemplateParams(
Transformer t, XsltTransformer t,
HashMap<String,String> params HashMap<String,String> params
) throws Exception ) throws Exception
{ {
for ( Map.Entry<String, String> param : params.entrySet() ) for ( Map.Entry<String, String> 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(); return schema.newValidator();
} }
catch ( SAXException e ) catch ( Exception e )
{ {
System.err.printf( System.err.printf(
"fatal: %s\n", "fatal: %s\n",
@ -214,19 +236,15 @@ public class DslCompiler
} }
private Transformer _createXslt( String src ) private XsltTransformer _createXslt( String src )
{ {
try try
{ {
final TransformerFactory factory = TransformerFactory.newInstance(
"net.sf.saxon.TransformerFactoryImpl", null
);
final Source xsl = new StreamSource( final Source xsl = new StreamSource(
_pathRoot.toString() + "/" + src + ".xsl" _pathRoot.toString() + "/" + src + ".xsl"
); );
return factory.newTransformer( xsl ); return _xsltCompiler.compile( xsl ).load();
} }
catch ( Exception e ) catch ( Exception e )
{ {