1 package org
.argeo
.app
.docbook
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
6 import java
.io
.IOException
;
7 import java
.io
.InputStream
;
9 import javax
.jcr
.ImportUUIDBehavior
;
10 import javax
.jcr
.Node
;
11 import javax
.jcr
.RepositoryException
;
12 import javax
.xml
.parsers
.DocumentBuilder
;
13 import javax
.xml
.parsers
.DocumentBuilderFactory
;
14 import javax
.xml
.parsers
.ParserConfigurationException
;
15 import javax
.xml
.transform
.Result
;
16 import javax
.xml
.transform
.Source
;
17 import javax
.xml
.transform
.Templates
;
18 import javax
.xml
.transform
.Transformer
;
19 import javax
.xml
.transform
.TransformerConfigurationException
;
20 import javax
.xml
.transform
.TransformerException
;
21 import javax
.xml
.transform
.TransformerFactory
;
22 import javax
.xml
.transform
.dom
.DOMSource
;
23 import javax
.xml
.transform
.stream
.StreamResult
;
24 import javax
.xml
.transform
.stream
.StreamSource
;
26 import org
.argeo
.jcr
.JcrException
;
27 import org
.w3c
.dom
.Document
;
28 import org
.xml
.sax
.InputSource
;
29 import org
.xml
.sax
.SAXException
;
31 import net
.sf
.saxon
.BasicTransformerFactory
;
32 import net
.sf
.saxon
.TransformerFactoryImpl
;
34 /** Convert from DocBook v4 to DocBook v5, using the official XSL. */
35 public class Dbk4Converter
{
36 private final Templates templates
;
38 public Dbk4Converter() {
39 try (InputStream in
= getClass().getResourceAsStream("db4-upgrade.xsl")) {
40 Source xsl
= new StreamSource(in
);
41 TransformerFactory transformerFactory
= new BasicTransformerFactory();
42 // TransformerFactory transformerFactory = new TransformerFactoryImpl();
43 templates
= transformerFactory
.newTemplates(xsl
);
44 } catch (IOException
| TransformerConfigurationException e
) {
45 throw new RuntimeException("Cannot initialise DocBook v4 converter", e
);
49 public void importXml(Node baseNode
, InputStream in
) throws IOException
{
50 try (ByteArrayOutputStream out
= new ByteArrayOutputStream();) {
51 DocumentBuilderFactory factory
= DocumentBuilderFactory
.newInstance();
52 factory
.setXIncludeAware(true);
53 factory
.setNamespaceAware(true);
54 DocumentBuilder docBuilder
= factory
.newDocumentBuilder();
55 Document doc
= docBuilder
.parse(new InputSource(in
));
56 Source xmlInput
= new DOMSource(doc
);
58 // ContentHandler contentHandler = baseNode.getSession().getImportContentHandler(baseNode.getPath(),
59 // ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
61 Transformer transformer
= templates
.newTransformer();
62 Result xmlOutput
= new StreamResult(out
);
63 transformer
.transform(xmlInput
, xmlOutput
);
64 try (InputStream dbk5in
= new ByteArrayInputStream(out
.toByteArray())) {
65 baseNode
.getSession().importXML(baseNode
.getPath(), dbk5in
,
66 ImportUUIDBehavior
.IMPORT_UUID_COLLISION_REPLACE_EXISTING
);
68 } catch (RepositoryException e
) {
69 throw new JcrException("Cannot import XML to " + baseNode
, e
);
70 } catch (TransformerException
| SAXException
| ParserConfigurationException e
) {
71 throw new RuntimeException("Cannot import DocBook v4 to " + baseNode
, e
);
76 public static void main(String
[] args
) {
79 Source xsl
= new StreamSource(new File("/usr/share/xml/docbook5/stylesheet/upgrade/db4-upgrade.xsl"));
80 TransformerFactory transformerFactory
= new TransformerFactoryImpl();
81 Templates templates
= transformerFactory
.newTemplates(xsl
);
83 File inputDir
= new File(args
[0]);
84 File outputDir
= new File(args
[1]);
86 for (File inputFile
: inputDir
.listFiles()) {
87 Result xmlOutput
= new StreamResult(new File(outputDir
, inputFile
.getName()));
89 DocumentBuilderFactory factory
= DocumentBuilderFactory
.newInstance();
90 factory
.setXIncludeAware(true);
91 factory
.setNamespaceAware(true);
92 DocumentBuilder docBuilder
= factory
.newDocumentBuilder();
93 Document doc
= docBuilder
.parse(inputFile
);
94 Source xmlInput
= new DOMSource(doc
);
95 Transformer transformer
= templates
.newTransformer();
96 transformer
.transform(xmlInput
, xmlOutput
);
98 } catch (Throwable e
) {