Class: Serialbench::Serializers::Xml::SaxonSerializer

Inherits:
BaseXmlSerializer show all
Defined in:
lib/serialbench/serializers/xml/saxon_serializer.rb

Overview

Saxon-HE via its Java CLI: the reference XSLT 2.0/3.0 engine. Cold-process semantics: every iteration is a full JVM + compile + transform, so ips is comparable to leptris only end-to-end, never per-transform — features record cold_process: true.

Instance Method Summary collapse

Methods inherited from BaseXmlSerializer

format, #generate_xml, #parse_dom, #parse_sax

Methods inherited from BaseSerializer

#generate, #get_version, #initialize, #parse, #require_library, #stream_parse, #supports?

Constructor Details

This class inherits a constructor from Serialbench::Serializers::BaseSerializer

Instance Method Details

#available?Boolean

Returns:

  • (Boolean)


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 46

def available?
  return @available if defined?(@available)

  @available = begin
    cp = classpath
    raise LoadError, 'SAXON_JAR / XMLRESOLVER_JAR not set' unless cp

    out, _err, st = Open3.capture3('java', '-cp', cp, 'net.sf.saxon.Version')
    raise LoadError, 'java failed' unless st.success?

    true
  rescue StandardError, LoadError => e
    warn "#{name} unavailable: #{e.class}: #{e.message}"
    false
  end
end

#capabilitiesObject



19
20
21
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 19

def capabilities
  Set.new(%i[xslt xslt30])
end

#classpathObject



27
28
29
30
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 27

def classpath
  jars = [ENV['SAXON_JAR'], ENV['XMLRESOLVER_JAR']].compact
  jars.empty? ? nil : jars.join(File::PATH_SEPARATOR)
end

#featuresObject



23
24
25
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 23

def features
  { 'xslt_version' => '3.0', 'cold_process' => true }
end

#nameObject



15
16
17
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 15

def name
  'saxon-he'
end

#versionObject



63
64
65
66
67
68
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 63

def version
  return 'unknown' unless available?

  out, = Open3.capture3('java', '-cp', classpath, 'net.sf.saxon.Version')
  out[/Saxon-HE (\S+)/, 1] || out.strip[0, 40]
end

#xslt_apply(source_xml, stylesheet) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 32

def xslt_apply(source_xml, stylesheet)
  Dir.mktmpdir('saxonbench') do |dir|
    src = File.join(dir, 's.xml')
    xsl = File.join(dir, 's.xsl')
    File.write(src, source_xml)
    File.write(xsl, stylesheet)
    out, _err, _st = Open3.capture3('java', '-cp', classpath, 'net.sf.saxon.Transform',
                                    "-xsl:#{xsl}", "-s:#{src}")
    raise Error, "saxon transform failed: #{out}#{_err}"[0, 200] unless _st.success?

    out
  end
end