1 package org
.argeo
.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
.apache
.xalan
.processor
.TransformerFactoryImpl
;
27 import org
.argeo
.jcr
.JcrException
;
28 import org
.w3c
.dom
.Document
;
29 import org
.xml
.sax
.InputSource
;
30 import org
.xml
.sax
.SAXException
;
32 /** Convert from DocBook v4 to DocBook v5, using the official XSL. */
33 public class Dbk4Converter
{
34 private final Templates templates
;
36 public Dbk4Converter() {
37 try (InputStream in
= getClass().getResourceAsStream("db4-upgrade.xsl")) {
38 Source xsl
= new StreamSource(in
);
39 TransformerFactory transformerFactory
= new TransformerFactoryImpl();
40 templates
= transformerFactory
.newTemplates(xsl
);
41 } catch (IOException
| TransformerConfigurationException e
) {
42 throw new RuntimeException("Cannot initialise DocBook v4 converter", e
);
46 public void importXml(Node baseNode
, InputStream in
) throws IOException
{
47 try (ByteArrayOutputStream out
= new ByteArrayOutputStream();) {
48 DocumentBuilderFactory factory
= DocumentBuilderFactory
.newInstance();
49 factory
.setXIncludeAware(true);
50 factory
.setNamespaceAware(true);
51 DocumentBuilder docBuilder
= factory
.newDocumentBuilder();
52 Document doc
= docBuilder
.parse(new InputSource(in
));
53 Source xmlInput
= new DOMSource(doc
);
55 // ContentHandler contentHandler = baseNode.getSession().getImportContentHandler(baseNode.getPath(),
56 // ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
58 Transformer transformer
= templates
.newTransformer();
59 Result xmlOutput
= new StreamResult(out
);
60 transformer
.transform(xmlInput
, xmlOutput
);
61 try (InputStream dbk5in
= new ByteArrayInputStream(out
.toByteArray())) {
62 baseNode
.getSession().importXML(baseNode
.getPath(), dbk5in
,
63 ImportUUIDBehavior
.IMPORT_UUID_COLLISION_REPLACE_EXISTING
);
65 } catch (RepositoryException e
) {
66 throw new JcrException("Cannot import XML to " + baseNode
, e
);
67 } catch (TransformerException
| SAXException
| ParserConfigurationException e
) {
68 throw new RuntimeException("Cannot import DocBook v4 to " + baseNode
, e
);
73 public static void main(String
[] args
) {
76 Source xsl
= new StreamSource(new File("/usr/share/xml/docbook5/stylesheet/upgrade/db4-upgrade.xsl"));
77 TransformerFactory transformerFactory
= new TransformerFactoryImpl();
78 Templates templates
= transformerFactory
.newTemplates(xsl
);
80 File inputDir
= new File(args
[0]);
81 File outputDir
= new File(args
[1]);
83 for (File inputFile
: inputDir
.listFiles()) {
84 Result xmlOutput
= new StreamResult(new File(outputDir
, inputFile
.getName()));
86 DocumentBuilderFactory factory
= DocumentBuilderFactory
.newInstance();
87 factory
.setXIncludeAware(true);
88 factory
.setNamespaceAware(true);
89 DocumentBuilder docBuilder
= factory
.newDocumentBuilder();
90 Document doc
= docBuilder
.parse(inputFile
);
91 Source xmlInput
= new DOMSource(doc
);
92 Transformer transformer
= templates
.newTransformer();
93 transformer
.transform(xmlInput
, xmlOutput
);
95 } catch (Throwable e
) {