13
13
import javax .xml .parsers .ParserConfigurationException ;
14
14
import javax .xml .parsers .SAXParser ;
15
15
import javax .xml .parsers .SAXParserFactory ;
16
+ import java .io .File ;
16
17
import java .io .IOException ;
17
18
import java .io .InputStream ;
18
19
import java .lang .reflect .Constructor ;
19
20
import java .lang .reflect .InvocationTargetException ;
20
21
import java .net .*;
22
+ import java .nio .file .Path ;
23
+ import java .nio .file .Paths ;
21
24
import java .util .*;
22
25
import java .util .function .Supplier ;
23
26
@@ -325,6 +328,19 @@ public XMLResolverConfiguration(XMLResolverConfiguration current) {
325
328
accessExternalDocument = current .accessExternalDocument ;
326
329
saxParserFactoryClass = current .saxParserFactoryClass ;
327
330
xmlReaderSupplier = current .xmlReaderSupplier ;
331
+ fixWindowsSystemIdentifiers = current .fixWindowsSystemIdentifiers ;
332
+ }
333
+
334
+ private String getConfigProperty (String name ) {
335
+ String property = System .getProperty (name );
336
+ if (property == null ) {
337
+ String env = name
338
+ .replaceAll ("\\ ." , "_" )
339
+ .replaceAll ("([a-z])([A-Z])" , "$1_$2" )
340
+ .toUpperCase ();
341
+ property = System .getenv (env );
342
+ }
343
+ return property ;
328
344
}
329
345
330
346
private void loadConfiguration (List <URL > propertyFiles , List <String > catalogFiles ) {
@@ -333,10 +349,7 @@ private void loadConfiguration(List<URL> propertyFiles, List<String> catalogFile
333
349
ArrayList <URL > propertyFilesList = new ArrayList <>();
334
350
if (propertyFiles == null ) {
335
351
// Do default initialization
336
- String propfn = System .getProperty ("xmlresolver.properties" );
337
- if (propfn == null ) {
338
- propfn = System .getenv ("XMLRESOLVER_PROPERTIES" );
339
- }
352
+ String propfn = getConfigProperty ("xmlresolver.properties" );
340
353
341
354
// Hack: you can set the xmlresolver.properties to the empty string
342
355
// to avoid loading the XMLRESOLVER_PROPERTIES environment. This is
@@ -406,7 +419,7 @@ private void loadConfiguration(List<URL> propertyFiles, List<String> catalogFile
406
419
}
407
420
408
421
private void loadSystemPropertiesConfiguration () {
409
- String property = System . getProperty ("xml.catalog.files" );
422
+ String property = getConfigProperty ("xml.catalog.files" );
410
423
if (property != null ) {
411
424
StringTokenizer tokens = new StringTokenizer (property , ";" );
412
425
showConfigChange ("Catalog list cleared" );
@@ -420,7 +433,7 @@ private void loadSystemPropertiesConfiguration() {
420
433
}
421
434
}
422
435
423
- property = System . getProperty ("xml.catalog.additions" );
436
+ property = getConfigProperty ("xml.catalog.additions" );
424
437
if (property != null ) {
425
438
StringTokenizer tokens = new StringTokenizer (property , ";" );
426
439
while (tokens .hasMoreTokens ()) {
@@ -432,121 +445,121 @@ private void loadSystemPropertiesConfiguration() {
432
445
}
433
446
}
434
447
435
- property = System . getProperty ("xml.catalog.prefer" );
448
+ property = getConfigProperty ("xml.catalog.prefer" );
436
449
if (property != null ) {
437
450
showConfigChange ("Prefer public: %s" , property );
438
451
preferPublic = "public" .equals (property );
439
452
}
440
453
441
- property = System . getProperty ("xml.catalog.preferPropertyFile" );
454
+ property = getConfigProperty ("xml.catalog.preferPropertyFile" );
442
455
if (property != null ) {
443
456
showConfigChange ("Prefer propertyFile: %s" , property );
444
457
preferPropertyFile = isTrue (property );
445
458
}
446
459
447
- property = System . getProperty ("xml.catalog.allowPI" );
460
+ property = getConfigProperty ("xml.catalog.allowPI" );
448
461
if (property != null ) {
449
462
showConfigChange ("Allow catalog PI: %s" , property );
450
463
allowCatalogPI = isTrue (property );
451
464
}
452
465
453
- property = System . getProperty ("xml.catalog.cache" );
466
+ property = getConfigProperty ("xml.catalog.cache" );
454
467
if (property != null ) {
455
468
showConfigChange ("Cache directory: %s" , property );
456
469
cacheDirectory = property ;
457
470
}
458
471
459
- property = System . getProperty ("xml.catalog.cacheUnderHome" );
472
+ property = getConfigProperty ("xml.catalog.cacheUnderHome" );
460
473
if (property != null ) {
461
474
showConfigChange ("Cache under home: %s" , property );
462
475
cacheUnderHome = isTrue (property );
463
476
}
464
477
465
- property = System . getProperty ("xml.catalog.cacheEnabled" );
478
+ property = getConfigProperty ("xml.catalog.cacheEnabled" );
466
479
if (property != null ) {
467
480
showConfigChange ("Cache enabled: %s" , property );
468
481
cacheEnabled = isTrue (property );
469
482
}
470
483
471
- property = System . getProperty ("xml.catalog.uriForSystem" );
484
+ property = getConfigProperty ("xml.catalog.uriForSystem" );
472
485
if (property != null ) {
473
486
showConfigChange ("URI-for-system: %s" , property );
474
487
uriForSystem = isTrue (property );
475
488
}
476
489
477
- property = System . getProperty ("xml.catalog.mergeHttps" );
490
+ property = getConfigProperty ("xml.catalog.mergeHttps" );
478
491
if (property != null ) {
479
492
showConfigChange ("Merge-https: %s" , property );
480
493
mergeHttps = isTrue (property );
481
494
}
482
495
483
- property = System . getProperty ("xml.catalog.maskJarUris" );
496
+ property = getConfigProperty ("xml.catalog.maskJarUris" );
484
497
if (property != null ) {
485
498
showConfigChange ("Mask-jar-URIs: %s" , property );
486
499
maskJarUris = isTrue (property );
487
500
}
488
501
489
- property = System . getProperty ("xml.catalog.catalogLoaderClass" );
502
+ property = getConfigProperty ("xml.catalog.catalogLoaderClass" );
490
503
if (property != null ) {
491
504
showConfigChange ("Catalog loader: %s" , property );
492
505
catalogLoader = property ;
493
506
}
494
507
495
- property = System . getProperty ("xml.catalog.parseRddl" );
508
+ property = getConfigProperty ("xml.catalog.parseRddl" );
496
509
if (property != null ) {
497
510
showConfigChange ("Use RDDL: %s" , property );
498
511
parseRddl = isTrue (property );
499
512
}
500
513
501
- property = System . getProperty ("xml.catalog.classpathCatalogs" );
514
+ property = getConfigProperty ("xml.catalog.classpathCatalogs" );
502
515
if (property != null ) {
503
516
showConfigChange ("Classpath catalogs: %s" , property );
504
517
classpathCatalogs = isTrue (property );
505
518
}
506
519
507
- property = System . getProperty ("xml.catalog.archivedCatalogs" );
520
+ property = getConfigProperty ("xml.catalog.archivedCatalogs" );
508
521
if (property != null ) {
509
522
showConfigChange ("Archived catalogs: %s" , property );
510
523
archivedCatalogs = isTrue (property );
511
524
}
512
525
513
- property = System . getProperty ("xml.catalog.throwUriExceptions" );
526
+ property = getConfigProperty ("xml.catalog.throwUriExceptions" );
514
527
if (property != null ) {
515
528
showConfigChange ("Throw URI exceptions: %s" , property );
516
529
throwUriExceptions = isTrue (property );
517
530
}
518
531
519
- property = System . getProperty ("xml.catalog.resolverLoggerClass" );
532
+ property = getConfigProperty ("xml.catalog.resolverLoggerClass" );
520
533
if (property != null ) {
521
534
showConfigChange ("Resolver logger class: %s" , property );
522
535
resolverLoggerClass = property ;
523
536
}
524
537
525
- property = System . getProperty ("xml.catalog.defaultLoggerLogLevel" );
538
+ property = getConfigProperty ("xml.catalog.defaultLoggerLogLevel" );
526
539
if (property != null ) {
527
540
showConfigChange ("Default logger log level: %s" , property );
528
541
defaultLoggerLogLevel = property ;
529
542
}
530
543
531
- property = System . getProperty ("xml.catalog.accessExternalEntity" );
544
+ property = getConfigProperty ("xml.catalog.accessExternalEntity" );
532
545
if (property != null ) {
533
546
showConfigChange ("Access external entity: %s" , property );
534
547
accessExternalEntity = property ;
535
548
}
536
549
537
- property = System . getProperty ("xml.catalog.accessExternalDocument" );
550
+ property = getConfigProperty ("xml.catalog.accessExternalDocument" );
538
551
if (property != null ) {
539
552
showConfigChange ("Access external document: %s" , property );
540
553
accessExternalDocument = property ;
541
554
}
542
555
543
- property = System . getProperty ("xml.catalog.saxParserFactoryClass" );
556
+ property = getConfigProperty ("xml.catalog.saxParserFactoryClass" );
544
557
if (property != null ) {
545
558
showConfigChange ("SAXParserFactory class: %s" , property );
546
559
saxParserFactoryClass = property ;
547
560
}
548
561
549
- property = System . getProperty ("xml.catalog.fixWindowsSystemIdentifiers" );
562
+ property = getConfigProperty ("xml.catalog.fixWindowsSystemIdentifiers" );
550
563
if (property != null ) {
551
564
showConfigChange ("Fix windows system identifiers: %s" , property );
552
565
fixWindowsSystemIdentifiers = isTrue (property );
@@ -556,7 +569,7 @@ private void loadSystemPropertiesConfiguration() {
556
569
private void loadPropertiesConfiguration (URL propertiesURL , Properties properties ) {
557
570
// Bit of a hack here.
558
571
String property = properties .getProperty ("catalog-logging" );
559
- if (property != null && System . getProperty ("xml.catalog.logging" ) == null ) {
572
+ if (property != null && getConfigProperty ("xml.catalog.logging" ) == null ) {
560
573
System .setProperty ("xml.catalog.logging" , property );
561
574
}
562
575
@@ -732,7 +745,7 @@ private void loadPropertiesConfiguration(URL propertiesURL, Properties propertie
732
745
}
733
746
734
747
private void showConfig () {
735
- resolverLogger .log (AbstractLogger .CONFIG , "Logging: %s" , System . getProperty ("xml.catalog.logging" ));
748
+ resolverLogger .log (AbstractLogger .CONFIG , "Logging: %s" , getConfigProperty ("xml.catalog.logging" ));
736
749
resolverLogger .log (AbstractLogger .CONFIG , "Prefer public: %s" , preferPublic );
737
750
resolverLogger .log (AbstractLogger .CONFIG , "Prefer property file: %s" , preferPropertyFile );
738
751
resolverLogger .log (AbstractLogger .CONFIG , "Allow catalog PI: %s" , allowCatalogPI );
@@ -1012,20 +1025,31 @@ private void showConfigChange(String message, Object value) {
1012
1025
1013
1026
private List <String > findClasspathCatalogFiles () {
1014
1027
if (classpathCatalogList == null ) {
1015
- resolverLogger .log (AbstractLogger .CONFIG , "Searching for catalogs on classpath:" );
1016
- try {
1017
- for (URL url : ((URLClassLoader ) XMLResolverConfiguration .class .getClassLoader ()).getURLs ()) {
1018
- resolverLogger .log (AbstractLogger .CONFIG , " " + url .toString ());
1028
+ // Set to avoid duplicates
1029
+ ArrayList <String > catalogs = new ArrayList <>();
1030
+
1031
+ // Starting in Java 9, the class loader is no longer a URLClassLoader, so the .getURLs()
1032
+ // trick doesn't work. Instead, we're just going to assume that the java.class.path
1033
+ // system property is correct. It seems to be.
1034
+ String sep = System .getProperty ("path.separator" );
1035
+ String cpath = System .getProperty ("java.class.path" );
1036
+ if (sep != null && cpath != null ) {
1037
+ resolverLogger .log (AbstractLogger .CONFIG , "Searching for catalogs on classpath:" );
1038
+ for (String loc : cpath .split (sep )) {
1039
+ File dir = new File (loc );
1040
+ if (dir .exists () && dir .isDirectory ()) {
1041
+ Path path = Paths .get (loc , "catalog.xml" );
1042
+ if (path .toFile ().exists ()) {
1043
+ catalogs .add (path .toString ());
1044
+ }
1045
+ }
1019
1046
}
1020
- } catch (ClassCastException ex ) {
1021
- resolverLogger .log (AbstractLogger .CONFIG , " Unknown: cannot determine class path in JDK9+" );
1022
1047
}
1023
- ArrayList < String > catalogs = new ArrayList <>();
1048
+
1024
1049
try {
1025
1050
Enumeration <URL > resources = XMLResolverConfiguration .class .getClassLoader ().getResources ("org/xmlresolver/catalog.xml" );
1026
1051
while (resources .hasMoreElements ()) {
1027
1052
URL catalog = resources .nextElement ();
1028
- resolverLogger .log (AbstractLogger .CONFIG , "Catalog: " + catalog .toString ());
1029
1053
catalogs .add (catalog .toString ());
1030
1054
}
1031
1055
} catch (IOException ex ) {
@@ -1171,8 +1195,10 @@ private static boolean isTrue(String aString) {
1171
1195
1172
1196
private static class FallbackLogger extends AbstractLogger {
1173
1197
private final ArrayList <Message > messages = new ArrayList <>();
1174
- private final String fallbackLogging = System .getProperty ("xml.catalog.FallbackLoggerLogLevel" );
1175
-
1198
+ private final String fallbackLogging
1199
+ = System .getProperty ("xml.catalog.FallbackLoggerLogLevel" ) != null
1200
+ ? System .getProperty ("xml.catalog.FallbackLoggerLogLevel" )
1201
+ : System .getenv ("XML_CATALOG_FALLBACK_LOGGER_LOG_LEVEL" );
1176
1202
1177
1203
@ Override
1178
1204
public void log (String cat , String message , Object ... params ) {
0 commit comments