|
15 | 15 | import java.io.InputStream;
|
16 | 16 | import java.io.InputStreamReader;
|
17 | 17 | import java.io.Reader;
|
| 18 | +import java.lang.reflect.Constructor; |
18 | 19 | import java.net.HttpURLConnection;
|
19 | 20 | import java.net.URL;
|
20 | 21 | import java.net.URLConnection;
|
21 | 22 | import java.nio.charset.StandardCharsets;
|
22 |
| -import java.security.PrivilegedActionException; |
23 | 23 | import java.util.HashMap;
|
24 | 24 | import java.util.HashSet;
|
25 | 25 | import java.util.Iterator;
|
@@ -77,6 +77,8 @@ public class DefaultEntityResolver implements EntityResolver2 {
|
77 | 77 |
|
78 | 78 | private final HashMap<String, String> systemIdToPublicId = new HashMap<String, String>(13);
|
79 | 79 |
|
| 80 | + private static final DTDLoader dtdLoader = createDTDLoader(); |
| 81 | + |
80 | 82 | private ClassLoader loader = null;
|
81 | 83 |
|
82 | 84 | private HashSet<String> whitelist = null;
|
@@ -331,7 +333,7 @@ public final InputSource resolveEntity(String name, String publicId, String base
|
331 | 333 | String fname = systemIdToFilename.get(systemId);
|
332 | 334 | InputSource isrc = null;
|
333 | 335 | if (fname != null) {
|
334 |
| - Reader re = loadDTDfromClasspath(fname); |
| 336 | + Reader re = dtdLoader.loadDTDfromClasspath(loader, fname); |
335 | 337 | if (re != null) {
|
336 | 338 | isrc = new InputSource(re);
|
337 | 339 | isrc.setPublicId(publicId);
|
@@ -480,17 +482,7 @@ protected URLConnection openConnection(URL url) throws IOException {
|
480 | 482 | */
|
481 | 483 | protected void connect(final URLConnection con) throws IOException {
|
482 | 484 | con.setConnectTimeout(60000);
|
483 |
| - try { |
484 |
| - java.security.AccessController.doPrivileged(new java.security.PrivilegedExceptionAction<Void>() { |
485 |
| - @Override |
486 |
| - public Void run() throws IOException { |
487 |
| - con.connect(); |
488 |
| - return null; |
489 |
| - } |
490 |
| - }); |
491 |
| - } catch (PrivilegedActionException e) { |
492 |
| - throw (IOException) e.getException(); |
493 |
| - } |
| 485 | + dtdLoader.connect(con); |
494 | 486 | }
|
495 | 487 |
|
496 | 488 | /**
|
@@ -519,26 +511,52 @@ public void setClassLoader(ClassLoader loader) {
|
519 | 511 | this.loader = loader;
|
520 | 512 | }
|
521 | 513 |
|
522 |
| - private Reader loadDTDfromClasspath(final String dtdFilename) { |
523 |
| - InputStream is = java.security.AccessController.doPrivileged(new java.security.PrivilegedAction<InputStream>() { |
524 |
| - @Override |
525 |
| - public InputStream run() { |
526 |
| - InputStream is; |
527 |
| - if (loader != null) { |
528 |
| - is = loader.getResourceAsStream(dtdFilename); |
529 |
| - } else { |
530 |
| - is = DefaultEntityResolver.class.getResourceAsStream(dtdFilename); |
531 |
| - } |
532 |
| - if (is == null) { |
533 |
| - is = ClassLoader.getSystemResourceAsStream(dtdFilename); |
534 |
| - } |
535 |
| - return is; |
| 514 | + private static DTDLoader createDTDLoader() { |
| 515 | + DTDLoader loader; |
| 516 | + try { |
| 517 | + Class<?> cl = Class.forName("io.sf.carte.doc.xml.dtd.SMDTDLoader"); |
| 518 | + Constructor<?> ctor = cl.getConstructor(); |
| 519 | + loader = (DTDLoader) ctor.newInstance(); |
| 520 | + } catch (Exception e) { |
| 521 | + loader = new SimpleDTDLoader(); |
| 522 | + } |
| 523 | + return loader; |
| 524 | + } |
| 525 | + |
| 526 | + abstract static class DTDLoader { |
| 527 | + abstract void connect(URLConnection con) throws IOException; |
| 528 | + abstract Reader loadDTDfromClasspath(ClassLoader loader, String dtdFilename); |
| 529 | + } |
| 530 | + |
| 531 | + /** |
| 532 | + * Load DTDs without a Security Manager. |
| 533 | + */ |
| 534 | + private static class SimpleDTDLoader extends DTDLoader { |
| 535 | + |
| 536 | + @Override |
| 537 | + void connect(final URLConnection con) throws IOException { |
| 538 | + con.connect(); |
| 539 | + } |
| 540 | + |
| 541 | + @Override |
| 542 | + Reader loadDTDfromClasspath(final ClassLoader loader, final String dtdFilename) { |
| 543 | + InputStream is; |
| 544 | + if (loader != null) { |
| 545 | + is = loader.getResourceAsStream(dtdFilename); |
| 546 | + } else { |
| 547 | + is = DefaultEntityResolver.class.getResourceAsStream(dtdFilename); |
| 548 | + } |
| 549 | + if (is == null) { |
| 550 | + is = ClassLoader.getSystemResourceAsStream(dtdFilename); |
| 551 | + } |
| 552 | + |
| 553 | + Reader re = null; |
| 554 | + if (is != null) { |
| 555 | + re = new InputStreamReader(is, StandardCharsets.UTF_8); |
536 | 556 | }
|
537 |
| - }); |
538 |
| - Reader re = null; |
539 |
| - if (is != null) { |
540 |
| - re = new InputStreamReader(is, StandardCharsets.UTF_8); |
| 557 | + return re; |
541 | 558 | }
|
542 |
| - return re; |
| 559 | + |
543 | 560 | }
|
| 561 | + |
544 | 562 | }
|
0 commit comments