1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package fr.inrae.agroclim.indicators.xml;
20
21 import java.io.InputStream;
22 import java.util.Map;
23
24 import javax.xml.XMLConstants;
25 import javax.xml.parsers.ParserConfigurationException;
26 import javax.xml.parsers.SAXParser;
27 import javax.xml.parsers.SAXParserFactory;
28 import javax.xml.transform.Source;
29 import javax.xml.transform.sax.SAXSource;
30
31 import org.xml.sax.InputSource;
32 import org.xml.sax.SAXException;
33 import org.xml.sax.XMLReader;
34
35 import jakarta.xml.bind.JAXBContext;
36 import jakarta.xml.bind.JAXBException;
37 import jakarta.xml.bind.Unmarshaller;
38 import lombok.Setter;
39
40
41
42
43
44
45
46
47
48 public final class UnmarshallerBuilder {
49
50
51
52
53 @Setter
54 private Map<String, InputStream> dtds;
55
56
57
58
59 @Setter
60 private Class<?>[] classesToBeBound;
61
62
63
64
65
66 public Unmarshaller build() throws JAXBException {
67 final JAXBContext context = JAXBContext.newInstance(classesToBeBound);
68 return context.createUnmarshaller();
69 }
70
71
72
73
74
75
76
77 public Source buildSource(final InputStream inputStream) throws ParserConfigurationException, SAXException {
78 final SAXParserFactory parserFactory = SAXParserFactory.newInstance();
79 parserFactory.setNamespaceAware(true);
80 final SAXParser parser = parserFactory.newSAXParser();
81 parser.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
82 parser.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
83 final XMLReader xmlreader = parser.getXMLReader();
84 if (dtds != null) {
85 final DtdResolver dtdResolver = new DtdResolver();
86 dtdResolver.setDtds(dtds);
87 xmlreader.setEntityResolver(dtdResolver);
88 }
89 final InputSource inputSource = new InputSource(inputStream);
90 return new SAXSource(xmlreader, inputSource);
91
92 }
93 }