3030package com .jcabi .xml ;
3131
3232import com .jcabi .log .Logger ;
33- import java .io .IOException ;
34- import java .net .SocketException ;
3533import java .util .ArrayList ;
3634import java .util .Collection ;
3735import java .util .Iterator ;
3836import java .util .List ;
39- import java .util .concurrent .CopyOnWriteArrayList ;
40- import javax .xml .XMLConstants ;
4137import javax .xml .namespace .NamespaceContext ;
42- import javax .xml .transform .dom .DOMSource ;
43- import javax .xml .validation .SchemaFactory ;
44- import javax .xml .validation .Validator ;
4538import lombok .EqualsAndHashCode ;
4639import org .cactoos .Scalar ;
4740import org .cactoos .scalar .Sticky ;
4841import org .cactoos .scalar .Unchecked ;
4942import org .w3c .dom .Node ;
5043import org .w3c .dom .ls .LSResourceResolver ;
51- import org .xml .sax .SAXException ;
5244import org .xml .sax .SAXParseException ;
5345
5446/**
@@ -84,16 +76,7 @@ public StrictXML(final XML xml) {
8476 * @since 0.19
8577 */
8678 public StrictXML (final XML xml , final LSResourceResolver resolver ) {
87- this (xml , StrictXML .newValidator (resolver ));
88- }
89-
90- /**
91- * Public ctor.
92- * @param xml XML document
93- * @param val Custom validator
94- */
95- public StrictXML (final XML xml , final Validator val ) {
96- this (xml , () -> StrictXML .validate (xml , val ));
79+ this (xml , () -> xml .validate (resolver ));
9780 }
9881
9982 /**
@@ -102,7 +85,7 @@ public StrictXML(final XML xml, final Validator val) {
10285 * @param schema XSD schema
10386 */
10487 public StrictXML (final XML xml , final XML schema ) {
105- this (xml , () -> StrictXML . check ( xml , schema ));
88+ this (xml , () -> xml . validate ( schema ));
10689 }
10790
10891 /**
@@ -193,25 +176,15 @@ public Node deepCopy() {
193176 }
194177
195178 @ Override
196- public Collection <SAXParseException > validate () {
197- return this .origin .value ().validate ();
179+ public Collection <SAXParseException > validate (final LSResourceResolver resolver ) {
180+ return this .origin .value ().validate (resolver );
198181 }
199182
200183 @ Override
201184 public Collection <SAXParseException > validate (final XML xsd ) {
202185 return this .origin .value ().validate (xsd );
203186 }
204187
205- /**
206- * Check and return list of errors.
207- * @param xml The XML to check
208- * @param xsd Schema to use
209- * @return List of errors
210- */
211- private static Collection <SAXParseException > check (final XML xml , final XML xsd ) {
212- return xml .validate (xsd );
213- }
214-
215188 /**
216189 * Convert errors to lines.
217190 * @param errors The errors
@@ -273,64 +246,4 @@ private static String join(final Iterable<?> iterable, final String sep) {
273246 }
274247 return buf .toString ();
275248 }
276-
277- /**
278- * Validate XML without external schema.
279- * @param xml XML Document
280- * @param validator XML Validator
281- * @return List of validation errors
282- */
283- private static Collection <SAXParseException > validate (
284- final XML xml ,
285- final Validator validator
286- ) {
287- final Collection <SAXParseException > errors =
288- new CopyOnWriteArrayList <>();
289- final int max = 3 ;
290- try {
291- validator .setErrorHandler (
292- new XMLDocument .ValidationHandler (errors )
293- );
294- final DOMSource dom = new DOMSource (xml .inner ());
295- for (int retry = 1 ; retry <= max ; ++retry ) {
296- try {
297- validator .validate (dom );
298- break ;
299- } catch (final SocketException ex ) {
300- Logger .error (
301- StrictXML .class ,
302- "Try #%d of %d failed: %s: %s" ,
303- retry ,
304- max ,
305- ex .getClass ().getName (),
306- ex .getMessage ()
307- );
308- if (retry == max ) {
309- throw new IllegalStateException (ex );
310- }
311- }
312- }
313- } catch (final SAXException | IOException ex ) {
314- throw new IllegalStateException (ex );
315- }
316- return errors ;
317- }
318-
319- /**
320- * Creates a new validator.
321- * @param resolver The resolver for resources
322- * @return A new validator
323- */
324- private static Validator newValidator (final LSResourceResolver resolver ) {
325- try {
326- final Validator validator = SchemaFactory
327- .newInstance (XMLConstants .W3C_XML_SCHEMA_NS_URI )
328- .newSchema ()
329- .newValidator ();
330- validator .setResourceResolver (resolver );
331- return validator ;
332- } catch (final SAXException ex ) {
333- throw new IllegalStateException (ex );
334- }
335- }
336249}
0 commit comments