From 795014ae2753f7611ad885ef046213f7d713025f Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Tue, 6 Feb 2024 21:06:27 +0100 Subject: [PATCH 1/7] Moved debug logging to setProperty --- .../java/org/exist/util/Configuration.java | 220 +++++++----------- 1 file changed, 79 insertions(+), 141 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index 30be3fbaca9..99071c1e05d 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -378,9 +378,9 @@ private void configureLockManager(final Element lockManager) { final boolean warnWaitOnReadForWrite = parseBoolean(getConfigAttributeValue(lockManager, "warn-wait-on-read-for-write"), false); final boolean pathsMultiWriter = parseBoolean(getConfigAttributeValue(lockManager, "paths-multi-writer"), false); - config.put(LockManager.CONFIGURATION_UPGRADE_CHECK, upgradeCheck); - config.put(LockManager.CONFIGURATION_WARN_WAIT_ON_READ_FOR_WRITE, warnWaitOnReadForWrite); - config.put(LockManager.CONFIGURATION_PATHS_MULTI_WRITER, pathsMultiWriter); + setProperty(LockManager.CONFIGURATION_UPGRADE_CHECK, upgradeCheck); + setProperty(LockManager.CONFIGURATION_WARN_WAIT_ON_READ_FOR_WRITE, warnWaitOnReadForWrite); + setProperty(LockManager.CONFIGURATION_PATHS_MULTI_WRITER, pathsMultiWriter); final NodeList nlLockTable = lockManager.getElementsByTagName("lock-table"); if (nlLockTable.getLength() > 0) { @@ -388,8 +388,8 @@ private void configureLockManager(final Element lockManager) { final boolean lockTableDisabled = parseBoolean(getConfigAttributeValue(lockTable, "disabled"), false); final int lockTableTraceStackDepth = parseInt(getConfigAttributeValue(lockTable, "trace-stack-depth"), 0); - config.put(LockTable.CONFIGURATION_DISABLED, lockTableDisabled); - config.put(LockTable.CONFIGURATION_TRACE_STACK_DEPTH, lockTableTraceStackDepth); + setProperty(LockTable.CONFIGURATION_DISABLED, lockTableDisabled); + setProperty(LockTable.CONFIGURATION_TRACE_STACK_DEPTH, lockTableTraceStackDepth); } final NodeList nlDocument = lockManager.getElementsByTagName("document"); @@ -397,7 +397,7 @@ private void configureLockManager(final Element lockManager) { final Element document = (Element) nlDocument.item(0); final boolean documentUsePathLocks = parseBoolean(getConfigAttributeValue(document, "use-path-locks"), false); - config.put(LockManager.CONFIGURATION_PATH_LOCKS_FOR_DOCUMENTS, documentUsePathLocks); + setProperty(LockManager.CONFIGURATION_PATH_LOCKS_FOR_DOCUMENTS, documentUsePathLocks); } } @@ -411,7 +411,7 @@ private void configureRepository(final Element element) { root += "/"; } - config.put(Deployment.PROPERTY_APP_ROOT, root); + setProperty(Deployment.PROPERTY_APP_ROOT, root); } private void configureBinaryManager(final Element binaryManager) { @@ -422,8 +422,7 @@ private void configureBinaryManager(final Element binaryManager) { final Element cache = (Element) nlCache.item(0); final String binaryCacheClass = getConfigAttributeValue(cache, "class"); - config.put(BINARY_CACHE_CLASS_PROPERTY, binaryCacheClass); - LOG.debug(PRP_DETAILS, BINARY_CACHE_CLASS_PROPERTY, config.get(BINARY_CACHE_CLASS_PROPERTY)); + setProperty(BINARY_CACHE_CLASS_PROPERTY, binaryCacheClass); } private void configureXQuery(final Element xquery) throws DatabaseConfigurationException { @@ -431,55 +430,46 @@ private void configureXQuery(final Element xquery) throws DatabaseConfigurationE final String javabinding = getConfigAttributeValue(xquery, ENABLE_JAVA_BINDING_ATTRIBUTE); if (javabinding != null) { - config.put(PROPERTY_ENABLE_JAVA_BINDING, javabinding); - LOG.debug(PROPERTY_ENABLE_JAVA_BINDING + ": {}", - config.get(PROPERTY_ENABLE_JAVA_BINDING)); + setProperty(PROPERTY_ENABLE_JAVA_BINDING, javabinding); } final String disableDeprecated = getConfigAttributeValue(xquery, DISABLE_DEPRECATED_FUNCTIONS_ATTRIBUTE); - config.put(PROPERTY_DISABLE_DEPRECATED_FUNCTIONS, + setProperty(PROPERTY_DISABLE_DEPRECATED_FUNCTIONS, Configuration.parseBoolean(disableDeprecated, DISABLE_DEPRECATED_FUNCTIONS_BY_DEFAULT)); - LOG.debug(PRP_DETAILS, PROPERTY_DISABLE_DEPRECATED_FUNCTIONS, - config.get(PROPERTY_DISABLE_DEPRECATED_FUNCTIONS)); final String optimize = getConfigAttributeValue(xquery, ENABLE_QUERY_REWRITING_ATTRIBUTE); if (optimize != null && !optimize.isEmpty()) { - config.put(PROPERTY_ENABLE_QUERY_REWRITING, optimize); - LOG.debug(PRP_DETAILS, PROPERTY_ENABLE_QUERY_REWRITING, config.get(PROPERTY_ENABLE_QUERY_REWRITING)); + setProperty(PROPERTY_ENABLE_QUERY_REWRITING, optimize); } final String enforceIndexUse = getConfigAttributeValue(xquery, ENFORCE_INDEX_USE_ATTRIBUTE); if (enforceIndexUse != null) { - config.put(PROPERTY_ENFORCE_INDEX_USE, enforceIndexUse); + setProperty(PROPERTY_ENFORCE_INDEX_USE, enforceIndexUse); } final String backwardCompatible = getConfigAttributeValue(xquery, XQUERY_BACKWARD_COMPATIBLE_ATTRIBUTE); if ((backwardCompatible != null) && (!backwardCompatible.isEmpty())) { - config.put(PROPERTY_XQUERY_BACKWARD_COMPATIBLE, backwardCompatible); - LOG.debug(PRP_DETAILS, PROPERTY_XQUERY_BACKWARD_COMPATIBLE, - config.get(PROPERTY_XQUERY_BACKWARD_COMPATIBLE)); + setProperty(PROPERTY_XQUERY_BACKWARD_COMPATIBLE, backwardCompatible); } final String raiseErrorOnFailedRetrieval = getConfigAttributeValue(xquery, XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_ATTRIBUTE); - config.put(PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL, + setProperty(PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL, Configuration.parseBoolean(raiseErrorOnFailedRetrieval, XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_DEFAULT)); - LOG.debug(PRP_DETAILS, PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL, - config.get(PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL)); final String trace = getConfigAttributeValue(xquery, PerformanceStats.CONFIG_ATTR_TRACE); - config.put(PerformanceStats.CONFIG_PROPERTY_TRACE, trace); + setProperty(PerformanceStats.CONFIG_PROPERTY_TRACE, trace); // built-in-modules final Map> classMap = new HashMap<>(); final Map knownMappings = new HashMap<>(); final Map>> moduleParameters = new HashMap<>(); loadModuleClasses(xquery, classMap, knownMappings, moduleParameters); - config.put(PROPERTY_BUILT_IN_MODULES, classMap); - config.put(PROPERTY_STATIC_MODULE_MAP, knownMappings); - config.put(PROPERTY_MODULE_PARAMETERS, moduleParameters); + setProperty(PROPERTY_BUILT_IN_MODULES, classMap); + setProperty(PROPERTY_STATIC_MODULE_MAP, knownMappings); + setProperty(PROPERTY_MODULE_PARAMETERS, moduleParameters); } /** @@ -535,10 +525,7 @@ private void loadModuleClasses(final Element xquery, modulesSourceMap.put(uri, source); - if (LOG.isDebugEnabled()) { - LOG.debug("Registered mapping for module '{}' to '{}'", uri, source); - } - + LOG.debug("Registered mapping for module '{}' to '{}'", uri, source); } else { // source class attribute info @@ -550,9 +537,7 @@ private void loadModuleClasses(final Element xquery, modulesClassMap.put(uri, moduleClass); } - if (LOG.isDebugEnabled()) { - LOG.debug("Configured module '{}' implemented in '{}'", uri, clazz); - } + LOG.debug("Configured module '{}' implemented in '{}'", uri, clazz); } //parse any module parameters @@ -603,15 +588,13 @@ private void configureXUpdate(final Element xupdate) throws NumberFormatExceptio final String fragmentation = getConfigAttributeValue(xupdate, XUPDATE_FRAGMENTATION_FACTOR_ATTRIBUTE); if (fragmentation != null) { - config.put(PROPERTY_XUPDATE_FRAGMENTATION_FACTOR, Integer.valueOf(fragmentation)); - LOG.debug(PRP_DETAILS, PROPERTY_XUPDATE_FRAGMENTATION_FACTOR, config.get(PROPERTY_XUPDATE_FRAGMENTATION_FACTOR)); + setProperty(PROPERTY_XUPDATE_FRAGMENTATION_FACTOR, Integer.valueOf(fragmentation)); } final String consistencyCheck = getConfigAttributeValue(xupdate, XUPDATE_CONSISTENCY_CHECKS_ATTRIBUTE); if (consistencyCheck != null) { - config.put(PROPERTY_XUPDATE_CONSISTENCY_CHECKS, parseBoolean(consistencyCheck, false)); - LOG.debug(PRP_DETAILS, PROPERTY_XUPDATE_CONSISTENCY_CHECKS, config.get(PROPERTY_XUPDATE_CONSISTENCY_CHECKS)); + setProperty(PROPERTY_XUPDATE_CONSISTENCY_CHECKS, parseBoolean(consistencyCheck, false)); } } @@ -619,7 +602,7 @@ private void configureSaxon(final Element saxon) { final String configurationFile = getConfigAttributeValue( saxon, SaxonConfiguration.SAXON_CONFIGURATION_FILE_ATTRIBUTE); if (configurationFile != null) { - config.put(SaxonConfiguration.SAXON_CONFIGURATION_FILE_PROPERTY, configurationFile); + setProperty(SaxonConfiguration.SAXON_CONFIGURATION_FILE_PROPERTY, configurationFile); } } @@ -627,8 +610,7 @@ private void configureTransformer(final Element transformer) { final String className = getConfigAttributeValue(transformer, TRANSFORMER_CLASS_ATTRIBUTE); if (className != null) { - config.put(PROPERTY_TRANSFORMER_CLASS, className); - LOG.debug(PRP_DETAILS, PROPERTY_TRANSFORMER_CLASS, config.get(PROPERTY_TRANSFORMER_CLASS)); + setProperty(PROPERTY_TRANSFORMER_CLASS, className); // Process any specified attributes that should be passed to the transformer factory @@ -659,14 +641,13 @@ private void configureTransformer(final Element transformer) { } } - config.put(PROPERTY_TRANSFORMER_ATTRIBUTES, attributes); + setProperty(PROPERTY_TRANSFORMER_ATTRIBUTES, attributes); } final String cachingValue = getConfigAttributeValue(transformer, TRANSFORMER_CACHING_ATTRIBUTE); if (cachingValue != null) { - config.put(PROPERTY_CACHING_ATTRIBUTE, parseBoolean(cachingValue, false)); - LOG.debug(PRP_DETAILS, PROPERTY_CACHING_ATTRIBUTE, config.get(PROPERTY_CACHING_ATTRIBUTE)); + setProperty(PROPERTY_CACHING_ATTRIBUTE, parseBoolean(cachingValue, false)); } } @@ -695,7 +676,7 @@ private void configureXmlParser(final Element parser) { final Map features = new HashMap<>(); pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); - config.put(XML_PARSER_FEATURES_PROPERTY, features); + setProperty(XML_PARSER_FEATURES_PROPERTY, features); } private void configureHtmlToXmlParser(final Element parser) { @@ -710,14 +691,14 @@ private void configureHtmlToXmlParser(final Element parser) { } final String htmlToXmlParserClass = getConfigAttributeValue(htmlToXml, HTML_TO_XML_PARSER_CLASS_ATTRIBUTE); - config.put(HTML_TO_XML_PARSER_PROPERTY, htmlToXmlParserClass); + setProperty(HTML_TO_XML_PARSER_PROPERTY, htmlToXmlParserClass); final NodeList nlProperties = htmlToXml.getElementsByTagName(HTML_TO_XML_PARSER_PROPERTIES_ELEMENT); if (nlProperties.getLength() > 0) { final Properties pProperties = ParametersExtractor.parseProperties(nlProperties.item(0)); final Map properties = new HashMap<>(); pProperties.forEach((k, v) -> properties.put(k.toString(), v)); - config.put(HTML_TO_XML_PARSER_PROPERTIES_PROPERTY, properties); + setProperty(HTML_TO_XML_PARSER_PROPERTIES_PROPERTY, properties); } final NodeList nlFeatures = htmlToXml.getElementsByTagName(HTML_TO_XML_PARSER_FEATURES_ELEMENT); @@ -725,7 +706,7 @@ private void configureHtmlToXmlParser(final Element parser) { final Properties pFeatures = ParametersExtractor.parseFeatures(nlFeatures.item(0)); final Map features = new HashMap<>(); pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); - config.put(HTML_TO_XML_PARSER_FEATURES_PROPERTY, features); + setProperty(HTML_TO_XML_PARSER_FEATURES_PROPERTY, features); } } @@ -737,62 +718,52 @@ private void configureHtmlToXmlParser(final Element parser) { private void configureSerializer(final Element serializer) { final String omitXmlDeclaration = getConfigAttributeValue(serializer, OMIT_XML_DECLARATION_ATTRIBUTE); if (omitXmlDeclaration != null) { - config.put(PROPERTY_OMIT_XML_DECLARATION, omitXmlDeclaration); - LOG.debug(PRP_DETAILS, PROPERTY_OMIT_XML_DECLARATION, config.get(PROPERTY_OMIT_XML_DECLARATION)); + setProperty(PROPERTY_OMIT_XML_DECLARATION, omitXmlDeclaration); } final String omitOriginalXmlDeclaration = getConfigAttributeValue(serializer, OMIT_ORIGINAL_XML_DECLARATION_ATTRIBUTE); if (omitOriginalXmlDeclaration != null) { - config.put(PROPERTY_OMIT_ORIGINAL_XML_DECLARATION, omitOriginalXmlDeclaration); - LOG.debug(PRP_DETAILS, PROPERTY_OMIT_ORIGINAL_XML_DECLARATION, config.get(PROPERTY_OMIT_ORIGINAL_XML_DECLARATION)); + setProperty(PROPERTY_OMIT_ORIGINAL_XML_DECLARATION, omitOriginalXmlDeclaration); } final String outputDocType = getConfigAttributeValue(serializer, OUTPUT_DOCTYPE_ATTRIBUTE); if (outputDocType != null) { - config.put(PROPERTY_OUTPUT_DOCTYPE, outputDocType); - LOG.debug(PRP_DETAILS, PROPERTY_OUTPUT_DOCTYPE, config.get(PROPERTY_OUTPUT_DOCTYPE)); + setProperty(PROPERTY_OUTPUT_DOCTYPE, outputDocType); } final String xinclude = getConfigAttributeValue(serializer, ENABLE_XINCLUDE_ATTRIBUTE); if (xinclude != null) { - config.put(PROPERTY_ENABLE_XINCLUDE, xinclude); - LOG.debug(PRP_DETAILS, PROPERTY_ENABLE_XINCLUDE, config.get(PROPERTY_ENABLE_XINCLUDE)); + setProperty(PROPERTY_ENABLE_XINCLUDE, xinclude); } final String xsl = getConfigAttributeValue(serializer, ENABLE_XSL_ATTRIBUTE); if (xsl != null) { - config.put(PROPERTY_ENABLE_XSL, xsl); - LOG.debug(PRP_DETAILS, PROPERTY_ENABLE_XSL, config.get(PROPERTY_ENABLE_XSL)); + setProperty(PROPERTY_ENABLE_XSL, xsl); } final String indent = getConfigAttributeValue(serializer, INDENT_ATTRIBUTE); if (indent != null) { - config.put(PROPERTY_INDENT, indent); - LOG.debug(PRP_DETAILS, PROPERTY_INDENT, config.get(PROPERTY_INDENT)); + setProperty(PROPERTY_INDENT, indent); } final String compress = getConfigAttributeValue(serializer, COMPRESS_OUTPUT_ATTRIBUTE); if (compress != null) { - config.put(PROPERTY_COMPRESS_OUTPUT, compress); - LOG.debug(PRP_DETAILS, PROPERTY_COMPRESS_OUTPUT, config.get(PROPERTY_COMPRESS_OUTPUT)); + setProperty(PROPERTY_COMPRESS_OUTPUT, compress); } final String internalId = getConfigAttributeValue(serializer, ADD_EXIST_ID_ATTRIBUTE); if (internalId != null) { - config.put(PROPERTY_ADD_EXIST_ID, internalId); - LOG.debug(PRP_DETAILS, PROPERTY_ADD_EXIST_ID, config.get(PROPERTY_ADD_EXIST_ID)); + setProperty(PROPERTY_ADD_EXIST_ID, internalId); } final String tagElementMatches = getConfigAttributeValue(serializer, TAG_MATCHING_ELEMENTS_ATTRIBUTE); if (tagElementMatches != null) { - config.put(PROPERTY_TAG_MATCHING_ELEMENTS, tagElementMatches); - LOG.debug(PRP_DETAILS, PROPERTY_TAG_MATCHING_ELEMENTS, config.get(PROPERTY_TAG_MATCHING_ELEMENTS)); + setProperty(PROPERTY_TAG_MATCHING_ELEMENTS, tagElementMatches); } final String tagAttributeMatches = getConfigAttributeValue(serializer, TAG_MATCHING_ATTRIBUTES_ATTRIBUTE); if (tagAttributeMatches != null) { - config.put(PROPERTY_TAG_MATCHING_ATTRIBUTES, tagAttributeMatches); - LOG.debug(PRP_DETAILS, PROPERTY_TAG_MATCHING_ATTRIBUTES, config.get(PROPERTY_TAG_MATCHING_ATTRIBUTES)); + setProperty(PROPERTY_TAG_MATCHING_ATTRIBUTES, tagAttributeMatches); } final NodeList nlFilters = serializer.getElementsByTagName(CustomMatchListenerFactory.CONFIGURATION_ELEMENT); @@ -810,7 +781,7 @@ private void configureSerializer(final Element serializer) { LOG.warn("Configuration element " + CustomMatchListenerFactory.CONFIGURATION_ELEMENT + " needs an attribute 'class'"); } } - config.put(CustomMatchListenerFactory.CONFIG_MATCH_LISTENERS, filters); + setProperty(CustomMatchListenerFactory.CONFIG_MATCH_LISTENERS, filters); } final NodeList backupFilters = serializer.getElementsByTagName(SystemExport.CONFIGURATION_ELEMENT); @@ -828,7 +799,7 @@ private void configureSerializer(final Element serializer) { LOG.warn("Configuration element " + SystemExport.CONFIGURATION_ELEMENT + " needs an attribute 'class'"); } if (!filters.isEmpty()) { - config.put(SystemExport.CONFIG_FILTERS, filters); + setProperty(SystemExport.CONFIG_FILTERS, filters); } } } @@ -858,7 +829,7 @@ private void configureScheduler(final Element scheduler) { for (int i = 0; i < jobList.size(); i++) { jobConfigs[i] = jobList.get(i); } - config.put(PROPERTY_SCHEDULER_JOBS, jobConfigs); + setProperty(PROPERTY_SCHEDULER_JOBS, jobConfigs); } private void addJobToList(final List jobList, final Element job) { @@ -939,8 +910,7 @@ private void addJobToList(final List jobList, final Element job) { private void configureBackend(final Optional dbHome, Element con) throws DatabaseConfigurationException { final String database = getConfigAttributeValue(con, PROPERTY_DATABASE); if (database != null) { - config.put(PROPERTY_DATABASE, database); - LOG.debug(PRP_DETAILS, PROPERTY_DATABASE, config.get(PROPERTY_DATABASE)); + setProperty(PROPERTY_DATABASE, database); } // directory for database files @@ -955,8 +925,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D throw new DatabaseConfigurationException("cannot read data directory: " + df, ioe); } } - config.put(PROPERTY_DATA_DIR, df); - LOG.debug(PRP_DETAILS, PROPERTY_DATA_DIR, config.get(PROPERTY_DATA_DIR)); + setProperty(PROPERTY_DATA_DIR, df); } String cacheMem = getConfigAttributeValue(con, CACHE_SIZE_ATTRIBUTE); @@ -968,8 +937,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D } try { - config.put(PROPERTY_CACHE_SIZE, Integer.valueOf(cacheMem)); - LOG.debug(PROPERTY_CACHE_SIZE + ": {}m", config.get(PROPERTY_CACHE_SIZE)); + setProperty(PROPERTY_CACHE_SIZE, Integer.valueOf(cacheMem)); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + PROPERTY_CACHE_SIZE + " value to integer: {}", cacheMem, nfe); } @@ -983,8 +951,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D checkMaxCache = DEFAULT_CACHE_CHECK_MAX_SIZE_STRING; } - config.put(PROPERTY_CACHE_CHECK_MAX_SIZE, parseBoolean(checkMaxCache, true)); - LOG.debug(PRP_DETAILS, PROPERTY_CACHE_CHECK_MAX_SIZE, config.get(PROPERTY_CACHE_CHECK_MAX_SIZE)); + setProperty(PROPERTY_CACHE_CHECK_MAX_SIZE, parseBoolean(checkMaxCache, true)); String cacheShrinkThreshold = getConfigAttributeValue(con, SHRINK_THRESHOLD_ATTRIBUTE); @@ -993,8 +960,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D } try { - config.put(SHRINK_THRESHOLD_PROPERTY, Integer.valueOf(cacheShrinkThreshold)); - LOG.debug(PRP_DETAILS, SHRINK_THRESHOLD_PROPERTY, config.get(SHRINK_THRESHOLD_PROPERTY)); + setProperty(SHRINK_THRESHOLD_PROPERTY, Integer.valueOf(cacheShrinkThreshold)); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + SHRINK_THRESHOLD_PROPERTY + " value to integer: {}", cacheShrinkThreshold, nfe); } @@ -1021,8 +987,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D collectionCacheBytes = Integer.parseInt(collectionCache); } - config.put(PROPERTY_CACHE_SIZE_BYTES, collectionCacheBytes); - LOG.debug(PRP_DETAILS, PROPERTY_CACHE_SIZE_BYTES, config.get(PROPERTY_CACHE_SIZE_BYTES)); + setProperty(PROPERTY_CACHE_SIZE_BYTES, collectionCacheBytes); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + PROPERTY_CACHE_SIZE_BYTES + " value to integer: {}", collectionCache, nfe); } @@ -1031,8 +996,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D final String pageSize = getConfigAttributeValue(con, NativeBroker.PAGE_SIZE_ATTRIBUTE); if (pageSize != null) { try { - config.put(PROPERTY_PAGE_SIZE, Integer.valueOf(pageSize)); - LOG.debug(PRP_DETAILS, PROPERTY_PAGE_SIZE, config.get(PROPERTY_PAGE_SIZE)); + setProperty(PROPERTY_PAGE_SIZE, Integer.valueOf(pageSize)); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + PROPERTY_PAGE_SIZE + " value to integer: {}", pageSize, nfe); } @@ -1042,8 +1006,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D final String collCacheSize = getConfigAttributeValue(con, BrokerPool.COLLECTION_CACHE_SIZE_ATTRIBUTE); if (collCacheSize != null) { try { - config.put(PROPERTY_COLLECTION_CACHE_SIZE, Integer.valueOf(collCacheSize)); - LOG.debug(PRP_DETAILS, PROPERTY_COLLECTION_CACHE_SIZE, config.get(PROPERTY_COLLECTION_CACHE_SIZE)); + setProperty(PROPERTY_COLLECTION_CACHE_SIZE, Integer.valueOf(collCacheSize)); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + PROPERTY_COLLECTION_CACHE_SIZE + " value to integer: {}", collCacheSize, nfe); } @@ -1052,8 +1015,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D final String nodesBuffer = getConfigAttributeValue(con, BrokerPool.NODES_BUFFER_ATTRIBUTE); if (nodesBuffer != null) { try { - config.put(PROPERTY_NODES_BUFFER, Integer.valueOf(nodesBuffer)); - LOG.debug(PRP_DETAILS, PROPERTY_NODES_BUFFER, config.get(PROPERTY_NODES_BUFFER)); + setProperty(PROPERTY_NODES_BUFFER, Integer.valueOf(nodesBuffer)); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + PROPERTY_NODES_BUFFER + " value to integer: {}", nodesBuffer, nfe); } @@ -1066,7 +1028,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D } try { - config.put(DISK_SPACE_MIN_PROPERTY, Short.valueOf(diskSpace)); + setProperty(DISK_SPACE_MIN_PROPERTY, Short.valueOf(diskSpace)); } catch (final NumberFormatException nfe) { LOG.warn("Cannot convert " + DISK_SPACE_MIN_PROPERTY + " value to integer: {}", diskSpace, nfe); } @@ -1074,14 +1036,14 @@ private void configureBackend(final Optional dbHome, Element con) throws D final String posixChownRestrictedStr = getConfigAttributeValue(con, POSIX_CHOWN_RESTRICTED_ATTRIBUTE); final boolean posixChownRestricted = posixChownRestrictedStr == null || Boolean.parseBoolean(posixChownRestrictedStr); - config.put(POSIX_CHOWN_RESTRICTED_PROPERTY, posixChownRestricted); + setProperty(POSIX_CHOWN_RESTRICTED_PROPERTY, posixChownRestricted); final String preserveOnCopyStr = getConfigAttributeValue(con, PRESERVE_ON_COPY_ATTRIBUTE); // default or configuration explicitly specifies that attributes should be preserved on copy final PreserveType preserveOnCopy = Boolean.parseBoolean(preserveOnCopyStr) ? PreserveType.PRESERVE : PreserveType.NO_PRESERVE; - config.put(PRESERVE_ON_COPY_PROPERTY, preserveOnCopy); + setProperty(PRESERVE_ON_COPY_PROPERTY, preserveOnCopy); final NodeList startupConf = con.getElementsByTagName(BrokerPool.CONFIGURATION_STARTUP_ELEMENT_NAME); if (startupConf.getLength() > 0) { @@ -1089,7 +1051,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D } else { // Prevent NPE final List startupTriggers = new ArrayList<>(); - config.put(PROPERTY_STARTUP_TRIGGERS, startupTriggers); + setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); } final NodeList poolConf = con.getElementsByTagName(BrokerPool.CONFIGURATION_POOL_ELEMENT_NAME); @@ -1116,15 +1078,12 @@ private void configureBackend(final Optional dbHome, Element con) throws D private void configureRecovery(final Optional dbHome, final Element recovery) throws DatabaseConfigurationException { final String enabled = getConfigAttributeValue(recovery, RECOVERY_ENABLED_ATTRIBUTE); setProperty(PROPERTY_RECOVERY_ENABLED, parseBoolean(enabled, true)); - LOG.debug(PRP_DETAILS, PROPERTY_RECOVERY_ENABLED, config.get(PROPERTY_RECOVERY_ENABLED)); final String syncOnCommit = getConfigAttributeValue(recovery, RECOVERY_SYNC_ON_COMMIT_ATTRIBUTE); setProperty(PROPERTY_RECOVERY_SYNC_ON_COMMIT, parseBoolean(syncOnCommit, true)); - LOG.debug(PRP_DETAILS, PROPERTY_RECOVERY_SYNC_ON_COMMIT, config.get(PROPERTY_RECOVERY_SYNC_ON_COMMIT)); final String groupCommit = getConfigAttributeValue(recovery, RECOVERY_GROUP_COMMIT_ATTRIBUTE); setProperty(PROPERTY_RECOVERY_GROUP_COMMIT, parseBoolean(groupCommit, false)); - LOG.debug(PRP_DETAILS, PROPERTY_RECOVERY_GROUP_COMMIT, config.get(PROPERTY_RECOVERY_GROUP_COMMIT)); final String journalDir = getConfigAttributeValue(recovery, RECOVERY_JOURNAL_DIR_ATTRIBUTE); if (journalDir != null) { @@ -1134,7 +1093,6 @@ private void configureRecovery(final Optional dbHome, final Element recove throw new DatabaseConfigurationException("cannot read data directory: " + rf); } setProperty(PROPERTY_RECOVERY_JOURNAL_DIR, rf); - LOG.debug(PRP_DETAILS, PROPERTY_RECOVERY_JOURNAL_DIR, config.get(PROPERTY_RECOVERY_JOURNAL_DIR)); } final String sizeLimit = getConfigAttributeValue(recovery, RECOVERY_SIZE_LIMIT_ATTRIBUTE); @@ -1147,7 +1105,6 @@ private void configureRecovery(final Optional dbHome, final Element recove size = Integer.parseInt(sizeLimit); } setProperty(PROPERTY_RECOVERY_SIZE_LIMIT, size); - LOG.debug(PROPERTY_RECOVERY_SIZE_LIMIT + ": {}m", config.get(PROPERTY_RECOVERY_SIZE_LIMIT)); } catch (final NumberFormatException e) { throw (new DatabaseConfigurationException("size attribute in recovery section needs to be a number")); } @@ -1156,12 +1113,10 @@ private void configureRecovery(final Optional dbHome, final Element recove final String forceRestart = getConfigAttributeValue(recovery, RECOVERY_FORCE_RESTART_ATTRIBUTE); final boolean forceRestartValue = "yes".equals(forceRestart); setProperty(PROPERTY_RECOVERY_FORCE_RESTART, forceRestartValue); - LOG.debug(PRP_DETAILS, PROPERTY_RECOVERY_FORCE_RESTART, config.get(PROPERTY_RECOVERY_FORCE_RESTART)); final String postRecoveryCheck = getConfigAttributeValue(recovery, RECOVERY_POST_RECOVERY_CHECK); final boolean postRecoveryCheckValue = "yes".equals(postRecoveryCheck); setProperty(PROPERTY_RECOVERY_CHECK, postRecoveryCheckValue); - LOG.debug(PRP_DETAILS, PROPERTY_RECOVERY_CHECK, config.get(PROPERTY_RECOVERY_CHECK)); } /** @@ -1174,8 +1129,7 @@ private void configureWatchdog(final Element watchDog) { if (timeout != null) { try { - config.put(PROPERTY_QUERY_TIMEOUT, Long.valueOf(timeout)); - LOG.debug(PRP_DETAILS, PROPERTY_QUERY_TIMEOUT, config.get(PROPERTY_QUERY_TIMEOUT)); + setProperty(PROPERTY_QUERY_TIMEOUT, Long.valueOf(timeout)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1185,8 +1139,7 @@ private void configureWatchdog(final Element watchDog) { if (maxOutput != null) { try { - config.put(PROPERTY_OUTPUT_SIZE_LIMIT, Integer.valueOf(maxOutput)); - LOG.debug(PRP_DETAILS, PROPERTY_OUTPUT_SIZE_LIMIT, config.get(PROPERTY_OUTPUT_SIZE_LIMIT)); + setProperty(PROPERTY_OUTPUT_SIZE_LIMIT, Integer.valueOf(maxOutput)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1203,8 +1156,7 @@ private void configureXQueryPool(final Element queryPool) { if (maxStackSize != null) { try { - config.put(PROPERTY_MAX_STACK_SIZE, Integer.valueOf(maxStackSize)); - LOG.debug(PRP_DETAILS, PROPERTY_MAX_STACK_SIZE, config.get(PROPERTY_MAX_STACK_SIZE)); + setProperty(PROPERTY_MAX_STACK_SIZE, Integer.valueOf(maxStackSize)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1214,8 +1166,7 @@ private void configureXQueryPool(final Element queryPool) { if (maxPoolSize != null) { try { - config.put(XQueryPool.PROPERTY_POOL_SIZE, Integer.valueOf(maxPoolSize)); - LOG.debug(PRP_DETAILS, XQueryPool.PROPERTY_POOL_SIZE, config.get(XQueryPool.PROPERTY_POOL_SIZE)); + setProperty(XQueryPool.PROPERTY_POOL_SIZE, Integer.valueOf(maxPoolSize)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1245,7 +1196,7 @@ private void configureStartup(final Element startup) { List startupTriggers = (List) config.get(PROPERTY_STARTUP_TRIGGERS); if (startupTriggers == null) { startupTriggers = new ArrayList<>(); - config.put(PROPERTY_STARTUP_TRIGGERS, startupTriggers); + setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); } // Iterate over elements @@ -1297,8 +1248,7 @@ private void configurePool(final Element pool) { final String min = getConfigAttributeValue(pool, MIN_CONNECTIONS_ATTRIBUTE); if (min != null) { try { - config.put(PROPERTY_MIN_CONNECTIONS, Integer.valueOf(min)); - LOG.debug(PRP_DETAILS, PROPERTY_MIN_CONNECTIONS, config.get(PROPERTY_MIN_CONNECTIONS)); + setProperty(PROPERTY_MIN_CONNECTIONS, Integer.valueOf(min)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1307,8 +1257,7 @@ private void configurePool(final Element pool) { final String max = getConfigAttributeValue(pool, MAX_CONNECTIONS_ATTRIBUTE); if (max != null) { try { - config.put(PROPERTY_MAX_CONNECTIONS, Integer.valueOf(max)); - LOG.debug(PRP_DETAILS, PROPERTY_MAX_CONNECTIONS, config.get(PROPERTY_MAX_CONNECTIONS)); + setProperty(PROPERTY_MAX_CONNECTIONS, Integer.valueOf(max)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1317,8 +1266,7 @@ private void configurePool(final Element pool) { final String sync = getConfigAttributeValue(pool, SYNC_PERIOD_ATTRIBUTE); if (sync != null) { try { - config.put(PROPERTY_SYNC_PERIOD, Long.valueOf(sync)); - LOG.debug(PRP_DETAILS, PROPERTY_SYNC_PERIOD, config.get(PROPERTY_SYNC_PERIOD)); + setProperty(PROPERTY_SYNC_PERIOD, Long.valueOf(sync)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1327,8 +1275,7 @@ private void configurePool(final Element pool) { final String maxShutdownWait = getConfigAttributeValue(pool, SHUTDOWN_DELAY_ATTRIBUTE); if (maxShutdownWait != null) { try { - config.put(PROPERTY_SHUTDOWN_DELAY, Long.valueOf(maxShutdownWait)); - LOG.debug(PRP_DETAILS, PROPERTY_SHUTDOWN_DELAY, config.get(PROPERTY_SHUTDOWN_DELAY)); + setProperty(PROPERTY_SHUTDOWN_DELAY, Long.valueOf(maxShutdownWait)); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1339,8 +1286,7 @@ private void configureIndexer(final Document doc, final Element indexer) throws final String caseSensitive = getConfigAttributeValue(indexer, INDEX_CASE_SENSITIVE_ATTRIBUTE); if (caseSensitive != null) { - config.put(PROPERTY_INDEX_CASE_SENSITIVE, parseBoolean(caseSensitive, false)); - LOG.debug(PRP_DETAILS, PROPERTY_INDEX_CASE_SENSITIVE, config.get(PROPERTY_INDEX_CASE_SENSITIVE)); + setProperty(PROPERTY_INDEX_CASE_SENSITIVE, parseBoolean(caseSensitive, false)); } int depth = 3; @@ -1355,8 +1301,7 @@ private void configureIndexer(final Document doc, final Element indexer) throws + "performance loss for node updates (XUpdate or XQuery update extensions)"); depth = 3; } - config.put(PROPERTY_INDEX_DEPTH, depth); - LOG.debug(PRP_DETAILS, PROPERTY_INDEX_DEPTH, config.get(PROPERTY_INDEX_DEPTH)); + setProperty(PROPERTY_INDEX_DEPTH, depth); } catch (final NumberFormatException e) { LOG.warn(e); } @@ -1365,15 +1310,13 @@ private void configureIndexer(final Document doc, final Element indexer) throws final String suppressWS = getConfigAttributeValue(indexer, SUPPRESS_WHITESPACE_ATTRIBUTE); if (suppressWS != null) { - config.put(PROPERTY_SUPPRESS_WHITESPACE, suppressWS); - LOG.debug(PRP_DETAILS, PROPERTY_SUPPRESS_WHITESPACE, config.get(PROPERTY_SUPPRESS_WHITESPACE)); + setProperty(PROPERTY_SUPPRESS_WHITESPACE, suppressWS); } final String suppressWSmixed = getConfigAttributeValue(indexer, PRESERVE_WS_MIXED_CONTENT_ATTRIBUTE); if (suppressWSmixed != null) { - config.put(PROPERTY_PRESERVE_WS_MIXED_CONTENT, parseBoolean(suppressWSmixed, false)); - LOG.debug(PRP_DETAILS, PROPERTY_PRESERVE_WS_MIXED_CONTENT, config.get(PROPERTY_PRESERVE_WS_MIXED_CONTENT)); + setProperty(PROPERTY_PRESERVE_WS_MIXED_CONTENT, parseBoolean(suppressWSmixed, false)); } // index settings @@ -1382,7 +1325,7 @@ private void configureIndexer(final Document doc, final Element indexer) throws if (cl.getLength() > 0) { final Element elem = (Element) cl.item(0); final IndexSpec spec = new IndexSpec(null, elem); - config.put(PROPERTY_INDEXER_CONFIG, spec); + setProperty(PROPERTY_INDEXER_CONFIG, spec); } // index modules @@ -1409,22 +1352,19 @@ private void configureIndexer(final Document doc, final Element indexer) throws modConfig[i] = new IndexModuleConfig(id, className, elem); } - config.put(IndexManager.PROPERTY_INDEXER_MODULES, modConfig); + setProperty(IndexManager.PROPERTY_INDEXER_MODULES, modConfig); } private void configureValidation(final Optional dbHome, final Element validation) { // Determine validation mode final String mode = getConfigAttributeValue(validation, XMLReaderObjectFactory.VALIDATION_MODE_ATTRIBUTE); if (mode != null) { - config.put(PROPERTY_VALIDATION_MODE, mode); - if (LOG.isDebugEnabled()) { - LOG.debug(PRP_DETAILS, PROPERTY_VALIDATION_MODE, config.get(PROPERTY_VALIDATION_MODE)); - } + setProperty(PROPERTY_VALIDATION_MODE, mode); } // cache final GrammarPool gp = new GrammarPool(); - config.put(XMLReaderObjectFactory.GRAMMAR_POOL, gp); + setProperty(XMLReaderObjectFactory.GRAMMAR_POOL, gp); // Configure the Entity Resolver final NodeList entityResolver = validation.getElementsByTagName(XMLReaderObjectFactory.CONFIGURATION_ENTITY_RESOLVER_ELEMENT_NAME); @@ -1475,7 +1415,7 @@ private void configureValidation(final Optional dbHome, final Element vali } // Store all configured URIs - config.put(XMLReaderObjectFactory.CATALOG_URIS, catalogUris); + setProperty(XMLReaderObjectFactory.CATALOG_URIS, catalogUris); // Create and Store the resolver try { @@ -1483,7 +1423,7 @@ private void configureValidation(final Optional dbHome, final Element vali .map(catalogUri -> Tuple(catalogUri, Optional.empty())) .collect(Collectors.toList()); final Resolver resolver = ResolverFactory.newResolver(catalogs); - config.put(XMLReaderObjectFactory.CATALOG_RESOLVER, resolver); + setProperty(XMLReaderObjectFactory.CATALOG_RESOLVER, resolver); } catch (final URISyntaxException e) { LOG.error("Unable to parse catalog uri: {}", e.getMessage(), e); } @@ -1494,18 +1434,15 @@ private void configureRpcServer(final Element validation) { if (contentFile.getLength() > 0) { final String inMemorySize = ((Element) contentFile.item(0)).getAttribute("in-memory-size"); if (inMemorySize != null) { - config.put(PROPERTY_IN_MEMORY_SIZE, parseInt(inMemorySize, DEFAULT_IN_MEMORY_SIZE)); - LOG.debug(PRP_DETAILS, PROPERTY_IN_MEMORY_SIZE, config.get(PROPERTY_IN_MEMORY_SIZE)); + setProperty(PROPERTY_IN_MEMORY_SIZE, parseInt(inMemorySize, DEFAULT_IN_MEMORY_SIZE)); } } final NodeList contentFilePool = validation.getElementsByTagName("content-file-pool"); if (contentFilePool.getLength() > 0) { final String size = ((Element) contentFilePool.item(0)).getAttribute("size"); - config.put(ContentFilePool.PROPERTY_POOL_SIZE, parseInt(size, -1)); - LOG.debug(PRP_DETAILS, ContentFilePool.PROPERTY_POOL_SIZE, config.get(ContentFilePool.PROPERTY_POOL_SIZE)); + setProperty(ContentFilePool.PROPERTY_POOL_SIZE, parseInt(size, -1)); final String maxIdle = ((Element) contentFilePool.item(0)).getAttribute("max-idle"); - config.put(ContentFilePool.PROPERTY_POOL_MAX_IDLE, parseInt(maxIdle, 5)); - LOG.debug(PRP_DETAILS, ContentFilePool.PROPERTY_POOL_MAX_IDLE, config.get(ContentFilePool.PROPERTY_POOL_MAX_IDLE)); + setProperty(ContentFilePool.PROPERTY_POOL_MAX_IDLE, parseInt(maxIdle, 5)); } } @@ -1587,6 +1524,7 @@ public boolean hasProperty(final String name) { public void setProperty(final String name, final Object obj) { config.put(name, obj); + LOG.debug(PRP_DETAILS, name, obj); } public void removeProperty(final String name) { From 83c5f73d08186f13606004398e00897d35d11c03 Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Tue, 6 Feb 2024 22:23:16 +0100 Subject: [PATCH 2/7] Extracted duplicate logic --- .../java/org/exist/util/Configuration.java | 436 +++++++----------- 1 file changed, 173 insertions(+), 263 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index 99071c1e05d..f1c5b686f79 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -151,7 +151,8 @@ public Configuration(@Nullable String configFilename) throws DatabaseConfigurati this(configFilename, Optional.empty()); } - public Configuration(@Nullable String configFilename, Optional existHomeDirname) throws DatabaseConfigurationException { + public Configuration(@Nullable String configFilename, Optional existHomeDirname) + throws DatabaseConfigurationException { InputStream is = null; try { if (configFilename == null) { @@ -218,7 +219,7 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi // set dbHome to parent of the conf file found, to resolve relative // path from conf file - existHomeDirname = configFilePath.map(Path::getParent); + final Optional existHome = configFilePath.map(Path::getParent); // initialize xml parser // we use eXist's in-memory DOM implementation to work @@ -242,88 +243,33 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi final Document doc = adapter.getDocument(); //indexer settings - final NodeList indexers = doc.getElementsByTagName(Indexer.CONFIGURATION_ELEMENT_NAME); - if (indexers.getLength() > 0) { - configureIndexer(doc, (Element) indexers.item(0)); - } - + configureElement(doc, Indexer.CONFIGURATION_ELEMENT_NAME, element -> configureIndexer(doc, element)); //scheduler settings - final NodeList schedulers = doc.getElementsByTagName(JobConfig.CONFIGURATION_ELEMENT_NAME); - if (schedulers.getLength() > 0) { - configureScheduler((Element) schedulers.item(0)); - } - + configureElement(doc, JobConfig.CONFIGURATION_ELEMENT_NAME, this::configureScheduler); //db connection settings - final NodeList dbConnection = doc.getElementsByTagName(CONFIGURATION_CONNECTION_ELEMENT_NAME); - if (dbConnection.getLength() > 0) { - configureBackend(existHomeDirname, (Element) dbConnection.item(0)); - } - + configureElement(doc, CONFIGURATION_CONNECTION_ELEMENT_NAME, element -> configureBackend(existHome, element)); // lock-table settings - final NodeList lockManager = doc.getElementsByTagName("lock-manager"); - if (lockManager.getLength() > 0) { - configureLockManager((Element) lockManager.item(0)); - } - + configureElement(doc, "lock-manager", this::configureLockManager); // repository settings - final NodeList repository = doc.getElementsByTagName("repository"); - if (repository.getLength() > 0) { - configureRepository((Element) repository.item(0)); - } - + configureElement(doc, "repository", this::configureRepository); // binary manager settings - final NodeList binaryManager = doc.getElementsByTagName("binary-manager"); - if (binaryManager.getLength() > 0) { - configureBinaryManager((Element) binaryManager.item(0)); - } - - //transformer settings - final NodeList transformers = doc.getElementsByTagName(TransformerFactoryAllocator.CONFIGURATION_ELEMENT_NAME); - if (transformers.getLength() > 0) { - configureTransformer((Element) transformers.item(0)); - } - - //saxon settings (most importantly license file for PE or EE features) - final NodeList saxon = doc.getElementsByTagName(SaxonConfiguration.SAXON_CONFIGURATION_ELEMENT_NAME); - if (saxon.getLength() > 0) { - configureSaxon((Element)saxon.item(0)); - } - - //parser settings - final NodeList parsers = doc.getElementsByTagName(HtmlToXmlParser.PARSER_ELEMENT_NAME); - if (parsers.getLength() > 0) { - configureParser((Element) parsers.item(0)); - } - - //serializer settings - final NodeList serializers = doc.getElementsByTagName(Serializer.CONFIGURATION_ELEMENT_NAME); - if (serializers.getLength() > 0) { - configureSerializer((Element) serializers.item(0)); - } - - //XUpdate settings - final NodeList xupdates = doc.getElementsByTagName(DBBroker.CONFIGURATION_ELEMENT_NAME); - if (xupdates.getLength() > 0) { - configureXUpdate((Element) xupdates.item(0)); - } - - //XQuery settings - final NodeList xquery = doc.getElementsByTagName(XQUERY_CONFIGURATION_ELEMENT_NAME); - if (xquery.getLength() > 0) { - configureXQuery((Element) xquery.item(0)); - } - - //Validation - final NodeList validations = doc.getElementsByTagName(XMLReaderObjectFactory.CONFIGURATION_ELEMENT_NAME); - if (validations.getLength() > 0) { - configureValidation(existHomeDirname, (Element) validations.item(0)); - } - - //RPC server - final NodeList rpcServer = doc.getElementsByTagName("rpc-server"); - if (rpcServer.getLength() > 0) { - configureRpcServer((Element) rpcServer.item(0)); - } + configureElement(doc, "binary-manager", this::configureBinaryManager); + // transformer settings + configureElement(doc, TransformerFactoryAllocator.CONFIGURATION_ELEMENT_NAME, this::configureTransformer); + // saxon settings (most importantly license file for PE or EE features) + configureElement(doc, SaxonConfiguration.SAXON_CONFIGURATION_ELEMENT_NAME, this::configureSaxon); + // parser settings + configureElement(doc, HtmlToXmlParser.PARSER_ELEMENT_NAME, this::configureParser); + // serializer settings + configureElement(doc, Serializer.CONFIGURATION_ELEMENT_NAME, this::configureSerializer); + // XUpdate settings + configureElement(doc, DBBroker.CONFIGURATION_ELEMENT_NAME, this::configureXUpdate); + // XQuery settings + configureElement(doc, XQUERY_CONFIGURATION_ELEMENT_NAME, this::configureXQuery); + // Validation + configureElement(doc, XMLReaderObjectFactory.CONFIGURATION_ELEMENT_NAME, element -> configureValidation(existHome, element)); + // RPC server + configureElement(doc, "rpc-server", this::configureRpcServer); } catch (final SAXException | IOException | ParserConfigurationException e) { LOG.error("error while reading config file: {}", configFilename, e); throw new DatabaseConfigurationException(e.getMessage(), e); @@ -338,6 +284,27 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi } } + @FunctionalInterface + interface ElementConfigurationAction { + void apply(Element element) throws DatabaseConfigurationException; + } + void configureElement(Document doc, String elementName, ElementConfigurationAction action) + throws DatabaseConfigurationException { + configureFirstElement(doc.getElementsByTagName(elementName), action); + } + + void configureElement(Element parent, String elementName, ElementConfigurationAction action) + throws DatabaseConfigurationException { + configureFirstElement(parent.getElementsByTagName(elementName), action); + } + + void configureFirstElement(NodeList nodeList, ElementConfigurationAction action) + throws DatabaseConfigurationException { + if (nodeList.getLength() > 0) { + action.apply((Element)nodeList.item(0)); + } + } + /** * Takes the passed string and converts it to a non-null Boolean object. If value is null, the specified default value is used. * Otherwise, Boolean.TRUE is returned if and only if the passed string equals "yes" or "true", ignoring case. @@ -373,7 +340,7 @@ public static int parseInt(@Nullable final String value, final int defaultValue) } } - private void configureLockManager(final Element lockManager) { + private void configureLockManager(final Element lockManager) throws DatabaseConfigurationException { final boolean upgradeCheck = parseBoolean(getConfigAttributeValue(lockManager, "upgrade-check"), false); final boolean warnWaitOnReadForWrite = parseBoolean(getConfigAttributeValue(lockManager, "warn-wait-on-read-for-write"), false); final boolean pathsMultiWriter = parseBoolean(getConfigAttributeValue(lockManager, "paths-multi-writer"), false); @@ -382,23 +349,19 @@ private void configureLockManager(final Element lockManager) { setProperty(LockManager.CONFIGURATION_WARN_WAIT_ON_READ_FOR_WRITE, warnWaitOnReadForWrite); setProperty(LockManager.CONFIGURATION_PATHS_MULTI_WRITER, pathsMultiWriter); - final NodeList nlLockTable = lockManager.getElementsByTagName("lock-table"); - if (nlLockTable.getLength() > 0) { - final Element lockTable = (Element) nlLockTable.item(0); + configureElement(lockManager, "lock-table", lockTable -> { final boolean lockTableDisabled = parseBoolean(getConfigAttributeValue(lockTable, "disabled"), false); final int lockTableTraceStackDepth = parseInt(getConfigAttributeValue(lockTable, "trace-stack-depth"), 0); setProperty(LockTable.CONFIGURATION_DISABLED, lockTableDisabled); setProperty(LockTable.CONFIGURATION_TRACE_STACK_DEPTH, lockTableTraceStackDepth); - } + }); - final NodeList nlDocument = lockManager.getElementsByTagName("document"); - if (nlDocument.getLength() > 0) { - final Element document = (Element) nlDocument.item(0); + configureElement(lockManager, "document", document -> { final boolean documentUsePathLocks = parseBoolean(getConfigAttributeValue(document, "use-path-locks"), false); setProperty(LockManager.CONFIGURATION_PATH_LOCKS_FOR_DOCUMENTS, documentUsePathLocks); - } + }); } private void configureRepository(final Element element) { @@ -414,15 +377,11 @@ private void configureRepository(final Element element) { setProperty(Deployment.PROPERTY_APP_ROOT, root); } - private void configureBinaryManager(final Element binaryManager) { - final NodeList nlCache = binaryManager.getElementsByTagName("cache"); - if (nlCache.getLength() == 0) { - return; - } - - final Element cache = (Element) nlCache.item(0); - final String binaryCacheClass = getConfigAttributeValue(cache, "class"); - setProperty(BINARY_CACHE_CLASS_PROPERTY, binaryCacheClass); + private void configureBinaryManager(final Element binaryManager) throws DatabaseConfigurationException { + configureElement(binaryManager, "cache", cache -> { + final String binaryCacheClass = getConfigAttributeValue(cache, "class"); + setProperty(BINARY_CACHE_CLASS_PROPERTY, binaryCacheClass); + }); } private void configureXQuery(final Element xquery) throws DatabaseConfigurationException { @@ -490,60 +449,55 @@ private void loadModuleClasses(final Element xquery, modulesClassMap.put(XPATH_FUNCTIONS_NS, org.exist.xquery.functions.fn.FnModule.class); // add other modules specified in configuration - final NodeList builtIns = xquery.getElementsByTagName(XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULES_ELEMENT_NAME); + configureElement(xquery, XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULES_ELEMENT_NAME, builtIn -> { - // search under - if (builtIns.getLength() == 0) { - return; - } + final NodeList modules = builtIn.getElementsByTagName(XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULE_ELEMENT_NAME); - final Element builtIn = (Element) builtIns.item(0); - final NodeList modules = builtIn.getElementsByTagName(XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULE_ELEMENT_NAME); + // iterate over all entries + for (int i = 0; i < modules.getLength(); i++) { + // Get element. + final Element elem = (Element) modules.item(i); - // iterate over all entries - for (int i = 0; i < modules.getLength(); i++) { - // Get element. - final Element elem = (Element) modules.item(i); + // Get attributes uri class and src + final String uri = elem.getAttribute(BUILT_IN_MODULE_URI_ATTRIBUTE); + final String clazz = elem.getAttribute(BUILT_IN_MODULE_CLASS_ATTRIBUTE); + final String source = elem.getAttribute(BUILT_IN_MODULE_SOURCE_ATTRIBUTE); - // Get attributes uri class and src - final String uri = elem.getAttribute(BUILT_IN_MODULE_URI_ATTRIBUTE); - final String clazz = elem.getAttribute(BUILT_IN_MODULE_CLASS_ATTRIBUTE); - final String source = elem.getAttribute(BUILT_IN_MODULE_SOURCE_ATTRIBUTE); + // uri attribute is the identifier and is always required + if (uri == null) { + throw (new DatabaseConfigurationException("element 'module' requires an attribute 'uri'")); + } - // uri attribute is the identifier and is always required - if (uri == null) { - throw (new DatabaseConfigurationException("element 'module' requires an attribute 'uri'")); - } + // either class or source attribute must be present + if (clazz == null && source == null) { + throw (new DatabaseConfigurationException("element 'module' requires either an attribute " + "'class' or 'src'")); + } - // either class or source attribute must be present - if (clazz == null && source == null) { - throw (new DatabaseConfigurationException("element 'module' requires either an attribute " + "'class' or 'src'")); - } + if (source != null) { + // Store src attribute info - if (source != null) { - // Store src attribute info + modulesSourceMap.put(uri, source); - modulesSourceMap.put(uri, source); + LOG.debug("Registered mapping for module '{}' to '{}'", uri, source); + } else { + // source class attribute info - LOG.debug("Registered mapping for module '{}' to '{}'", uri, source); - } else { - // source class attribute info + // Get class of module + final Class moduleClass = lookupModuleClass(uri, clazz); - // Get class of module - final Class moduleClass = lookupModuleClass(uri, clazz); + // Store class if thw module class actually exists + if (moduleClass != null) { + modulesClassMap.put(uri, moduleClass); + } - // Store class if thw module class actually exists - if (moduleClass != null) { - modulesClassMap.put(uri, moduleClass); + LOG.debug("Configured module '{}' implemented in '{}'", uri, clazz); } - LOG.debug("Configured module '{}' implemented in '{}'", uri, clazz); + //parse any module parameters + moduleParameters.put(uri, ParametersExtractor.extract( + elem.getElementsByTagName(PARAMETER_ELEMENT_NAME))); } - - //parse any module parameters - moduleParameters.put(uri, ParametersExtractor.extract( - elem.getElementsByTagName(PARAMETER_ELEMENT_NAME))); - } + }); } /** @@ -651,63 +605,46 @@ private void configureTransformer(final Element transformer) { } } - private void configureParser(final Element parser) { + private void configureParser(final Element parser) throws DatabaseConfigurationException { configureXmlParser(parser); configureHtmlToXmlParser(parser); } - private void configureXmlParser(final Element parser) { - final NodeList nlXml = parser.getElementsByTagName(XML_PARSER_ELEMENT); - if (nlXml.getLength() == 0) { - return; - } - - final Element xml = (Element) nlXml.item(0); - final NodeList nlFeatures = xml.getElementsByTagName(XML_PARSER_FEATURES_ELEMENT); - if (nlFeatures.getLength() == 0) { - return; - } - - final Properties pFeatures = ParametersExtractor.parseFeatures(nlFeatures.item(0)); + private void configureXmlParser(final Element parser) throws DatabaseConfigurationException { + configureElement(parser, XML_PARSER_ELEMENT, xml -> { + configureElement(xml, XML_PARSER_FEATURES_ELEMENT, nlFeature -> { + final Properties pFeatures = ParametersExtractor.parseFeatures(nlFeature); - if (pFeatures.isEmpty()) { - return; - } + if (pFeatures.isEmpty()) { + return; + } - final Map features = new HashMap<>(); - pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); - setProperty(XML_PARSER_FEATURES_PROPERTY, features); + final Map features = new HashMap<>(); + pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); + setProperty(XML_PARSER_FEATURES_PROPERTY, features); + }); + }); } - private void configureHtmlToXmlParser(final Element parser) { - final NodeList nlHtmlToXml = parser.getElementsByTagName(HTML_TO_XML_PARSER_ELEMENT); - if (nlHtmlToXml.getLength() == 0) { - return; - } - - final Element htmlToXml = (Element) nlHtmlToXml.item(0); - if (htmlToXml == null) { - return; - } - - final String htmlToXmlParserClass = getConfigAttributeValue(htmlToXml, HTML_TO_XML_PARSER_CLASS_ATTRIBUTE); - setProperty(HTML_TO_XML_PARSER_PROPERTY, htmlToXmlParserClass); - - final NodeList nlProperties = htmlToXml.getElementsByTagName(HTML_TO_XML_PARSER_PROPERTIES_ELEMENT); - if (nlProperties.getLength() > 0) { - final Properties pProperties = ParametersExtractor.parseProperties(nlProperties.item(0)); - final Map properties = new HashMap<>(); - pProperties.forEach((k, v) -> properties.put(k.toString(), v)); - setProperty(HTML_TO_XML_PARSER_PROPERTIES_PROPERTY, properties); - } - - final NodeList nlFeatures = htmlToXml.getElementsByTagName(HTML_TO_XML_PARSER_FEATURES_ELEMENT); - if (nlFeatures.getLength() > 0) { - final Properties pFeatures = ParametersExtractor.parseFeatures(nlFeatures.item(0)); - final Map features = new HashMap<>(); - pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); - setProperty(HTML_TO_XML_PARSER_FEATURES_PROPERTY, features); - } + private void configureHtmlToXmlParser(final Element parser) throws DatabaseConfigurationException { + configureElement(parser, HTML_TO_XML_PARSER_ELEMENT, htmlToXml -> { + final String htmlToXmlParserClass = getConfigAttributeValue(htmlToXml, HTML_TO_XML_PARSER_CLASS_ATTRIBUTE); + setProperty(HTML_TO_XML_PARSER_PROPERTY, htmlToXmlParserClass); + + configureElement(htmlToXml, HTML_TO_XML_PARSER_PROPERTIES_ELEMENT, nlProperties -> { + final Properties pProperties = ParametersExtractor.parseProperties(nlProperties); + final Map properties = new HashMap<>(); + pProperties.forEach((k, v) -> properties.put(k.toString(), v)); + setProperty(HTML_TO_XML_PARSER_PROPERTIES_PROPERTY, properties); + }); + + configureElement(htmlToXml, HTML_TO_XML_PARSER_FEATURES_ELEMENT, nlFeatures -> { + final Properties pFeatures = ParametersExtractor.parseFeatures(nlFeatures); + final Map features = new HashMap<>(); + pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); + setProperty(HTML_TO_XML_PARSER_FEATURES_PROPERTY, features); + }); + }); } /** @@ -878,8 +815,8 @@ private void addJobToList(final List jobList, final Element job) { final NodeList nlParam = job.getElementsByTagName(PARAMETER_ELEMENT_NAME); final Map> params = ParametersExtractor.extract(nlParam); - for (final Entry> param : params.entrySet()) { - final List values = param.getValue(); + for (final Entry> param : params.entrySet()) { + final List values = param.getValue(); if (values != null && !values.isEmpty()) { jobConfig.addParameter(param.getKey(), values.get(0).toString()); @@ -1054,25 +991,10 @@ private void configureBackend(final Optional dbHome, Element con) throws D setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); } - final NodeList poolConf = con.getElementsByTagName(BrokerPool.CONFIGURATION_POOL_ELEMENT_NAME); - if (poolConf.getLength() > 0) { - configurePool((Element) poolConf.item(0)); - } - - final NodeList queryPoolConf = con.getElementsByTagName(XQueryPool.CONFIGURATION_ELEMENT_NAME); - if (queryPoolConf.getLength() > 0) { - configureXQueryPool((Element) queryPoolConf.item(0)); - } - - final NodeList watchConf = con.getElementsByTagName(XQueryWatchDog.CONFIGURATION_ELEMENT_NAME); - if (watchConf.getLength() > 0) { - configureWatchdog((Element) watchConf.item(0)); - } - - final NodeList recoveries = con.getElementsByTagName(BrokerPool.CONFIGURATION_RECOVERY_ELEMENT_NAME); - if (recoveries.getLength() > 0) { - configureRecovery(dbHome, (Element) recoveries.item(0)); - } + configureElement(con, BrokerPool.CONFIGURATION_POOL_ELEMENT_NAME, this::configurePool); + configureElement(con, XQueryPool.CONFIGURATION_ELEMENT_NAME, this::configureXQueryPool); + configureElement(con, XQueryWatchDog.CONFIGURATION_ELEMENT_NAME, this::configureWatchdog); + configureElement(con, BrokerPool.CONFIGURATION_RECOVERY_ELEMENT_NAME, element -> configureRecovery(dbHome, element)); } private void configureRecovery(final Optional dbHome, final Element recovery) throws DatabaseConfigurationException { @@ -1173,77 +1095,65 @@ private void configureXQueryPool(final Element queryPool) { } } - private void configureStartup(final Element startup) { + private void configureStartup(final Element startup) throws DatabaseConfigurationException { // Retrieve - final NodeList nlTriggers = startup.getElementsByTagName("triggers"); - - // If exists - if (nlTriggers.getLength() == 0) { - return; - } - // Get - final Element triggers = (Element) nlTriggers.item(0); - - // Get - final NodeList nlTrigger = triggers.getElementsByTagName("trigger"); + configureElement(startup, "triggers", triggers -> { + // Get + final NodeList nlTrigger = triggers.getElementsByTagName("trigger"); - // If exists and there are more than 0 - if (nlTrigger.getLength() == 0) { - return; - } + // If exists and there are more than 0 + if (nlTrigger.getLength() == 0) { + return; + } - // Initialize trigger configuration - List startupTriggers = (List) config.get(PROPERTY_STARTUP_TRIGGERS); - if (startupTriggers == null) { - startupTriggers = new ArrayList<>(); - setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); - } + // Initialize trigger configuration + List startupTriggers = (List) config.get(PROPERTY_STARTUP_TRIGGERS); + if (startupTriggers == null) { + startupTriggers = new ArrayList<>(); + setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); + } - // Iterate over elements - for (int i = 0; i < nlTrigger.getLength(); i++) { + // Iterate over elements + for (int i = 0; i < nlTrigger.getLength(); i++) { - // Get element - final Element trigger = (Element) nlTrigger.item(i); + // Get element + final Element trigger = (Element) nlTrigger.item(i); - // Get @class - final String startupTriggerClass = trigger.getAttribute("class"); + // Get @class + final String startupTriggerClass = trigger.getAttribute("class"); - boolean isStartupTrigger = false; - try { - // Verify if class is StartupTrigger - for (final Class iface : Class.forName(startupTriggerClass).getInterfaces()) { - if ("org.exist.storage.StartupTrigger".equals(iface.getName())) { - isStartupTrigger = true; - break; + boolean isStartupTrigger = false; + try { + // Verify if class is StartupTrigger + for (final Class iface : Class.forName(startupTriggerClass).getInterfaces()) { + if ("org.exist.storage.StartupTrigger".equals(iface.getName())) { + isStartupTrigger = true; + break; + } } - } - // if it actually is a StartupTrigger - if (isStartupTrigger) { - // Parse additional parameters - final Map> params = ParametersExtractor.extract(trigger.getElementsByTagName(PARAMETER_ELEMENT_NAME)); + // if it actually is a StartupTrigger + if (isStartupTrigger) { + // Parse additional parameters + final Map> params = ParametersExtractor.extract(trigger.getElementsByTagName(PARAMETER_ELEMENT_NAME)); - // Register trigger - startupTriggers.add(new StartupTriggerConfig(startupTriggerClass, params)); + // Register trigger + startupTriggers.add(new StartupTriggerConfig(startupTriggerClass, params)); - // Done - LOG.info("Registered StartupTrigger: {}", startupTriggerClass); + // Done + LOG.info("Registered StartupTrigger: {}", startupTriggerClass); - } else { - LOG.warn("StartupTrigger: {} does not implement org.exist.storage.StartupTrigger. IGNORING!", startupTriggerClass); - } + } else { + LOG.warn("StartupTrigger: {} does not implement org.exist.storage.StartupTrigger. IGNORING!", startupTriggerClass); + } - } catch (final ClassNotFoundException cnfe) { - LOG.error("Could not find StartupTrigger class: {}. {}", startupTriggerClass, cnfe.getMessage(), cnfe); + } catch (final ClassNotFoundException cnfe) { + LOG.error("Could not find StartupTrigger class: {}. {}", startupTriggerClass, cnfe.getMessage(), cnfe); + } } - } + }); } - /** - * DOCUMENT ME! - * - * @param pool - */ private void configurePool(final Element pool) { final String min = getConfigAttributeValue(pool, MIN_CONNECTIONS_ATTRIBUTE); if (min != null) { @@ -1581,7 +1491,7 @@ public void warning(SAXParseException exception) throws SAXException { exception.getLineNumber(), exception.getMessage(), exception); } - public record StartupTriggerConfig(String clazz, Map> params) { + public record StartupTriggerConfig(String clazz, Map> params) { } public record IndexModuleConfig(String id, String className, Element config) { From 29bae7234c73f72eedeff338ab0c8ef0a596a40c Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Wed, 7 Feb 2024 18:29:11 +0100 Subject: [PATCH 3/7] Removes code dupplication for property handling --- .../java/org/exist/util/Configuration.java | 424 ++++++------------ 1 file changed, 129 insertions(+), 295 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index f1c5b686f79..8bf39809999 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -79,6 +79,7 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Properties; +import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -91,6 +92,8 @@ import org.xmlresolver.Resolver; import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; import static javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING; import static org.exist.Namespaces.XPATH_FUNCTIONS_NS; import static org.exist.scheduler.JobConfig.*; @@ -288,17 +291,17 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi interface ElementConfigurationAction { void apply(Element element) throws DatabaseConfigurationException; } - void configureElement(Document doc, String elementName, ElementConfigurationAction action) + private void configureElement(final Document doc, final String elementName, final ElementConfigurationAction action) throws DatabaseConfigurationException { configureFirstElement(doc.getElementsByTagName(elementName), action); } - void configureElement(Element parent, String elementName, ElementConfigurationAction action) + private void configureElement(final Element parent, final String elementName, final ElementConfigurationAction action) throws DatabaseConfigurationException { configureFirstElement(parent.getElementsByTagName(elementName), action); } - void configureFirstElement(NodeList nodeList, ElementConfigurationAction action) + private void configureFirstElement(final NodeList nodeList, final ElementConfigurationAction action) throws DatabaseConfigurationException { if (nodeList.getLength() > 0) { action.apply((Element)nodeList.item(0)); @@ -314,9 +317,40 @@ void configureFirstElement(NodeList nodeList, ElementConfigurationAction action) * @return The parsed Boolean */ public static boolean parseBoolean(@Nullable final String value, final boolean defaultValue) { - return Optional.ofNullable(value) - .map(v -> v.equalsIgnoreCase("yes") || v.equalsIgnoreCase("true")) - .orElse(defaultValue); + Boolean booleanValue = asBoolean(value); + if (booleanValue == null) { + return defaultValue; + } + return booleanValue.booleanValue(); + } + + private static Boolean asBoolean(@Nullable final String value) { + if (value != null) { + return Boolean.valueOf("yes".equalsIgnoreCase(value) || "true".equalsIgnoreCase(value)); + } + return null; + } + + private static Integer asInteger(@Nullable final String value) { + if (value != null) { + try { + return Integer.valueOf(value); + } catch (NumberFormatException nfe) { + LOG.warn("Cannot convert {} value to Integer", value, nfe); + } + } + return null; + } + + private static Long asLong(@Nullable final String value) { + if (value != null) { + try { + return Long.valueOf(value); + } catch (NumberFormatException nfe) { + LOG.warn("Cannot convert {} value to Long", value, nfe); + } + } + return null; } /** @@ -331,7 +365,6 @@ public static int parseInt(@Nullable final String value, final int defaultValue) if (value == null || value.isEmpty()) { return defaultValue; } - try { return Integer.parseInt(value); } catch (final NumberFormatException e) { @@ -341,13 +374,9 @@ public static int parseInt(@Nullable final String value, final int defaultValue) } private void configureLockManager(final Element lockManager) throws DatabaseConfigurationException { - final boolean upgradeCheck = parseBoolean(getConfigAttributeValue(lockManager, "upgrade-check"), false); - final boolean warnWaitOnReadForWrite = parseBoolean(getConfigAttributeValue(lockManager, "warn-wait-on-read-for-write"), false); - final boolean pathsMultiWriter = parseBoolean(getConfigAttributeValue(lockManager, "paths-multi-writer"), false); - - setProperty(LockManager.CONFIGURATION_UPGRADE_CHECK, upgradeCheck); - setProperty(LockManager.CONFIGURATION_WARN_WAIT_ON_READ_FOR_WRITE, warnWaitOnReadForWrite); - setProperty(LockManager.CONFIGURATION_PATHS_MULTI_WRITER, pathsMultiWriter); + configureProperty(lockManager, "upgrade-check", LockManager.CONFIGURATION_UPGRADE_CHECK, Configuration::asBoolean, FALSE); + configureProperty(lockManager, "warn-wait-on-read-for-write", LockManager.CONFIGURATION_WARN_WAIT_ON_READ_FOR_WRITE, Configuration::asBoolean, FALSE); + configureProperty(lockManager, "paths-multi-writer", LockManager.CONFIGURATION_PATHS_MULTI_WRITER, Configuration::asBoolean, FALSE); configureElement(lockManager, "lock-table", lockTable -> { final boolean lockTableDisabled = parseBoolean(getConfigAttributeValue(lockTable, "disabled"), false); @@ -365,16 +394,15 @@ private void configureLockManager(final Element lockManager) throws DatabaseConf } private void configureRepository(final Element element) { - String root = getConfigAttributeValue(element, "root"); - if (root == null || root.isEmpty()) { - return; - } - - if (!root.endsWith("/")) { - root += "/"; - } - - setProperty(Deployment.PROPERTY_APP_ROOT, root); + configureProperty(element, "root", Deployment.PROPERTY_APP_ROOT, root -> { + if (root.isEmpty()) { + return null; + } + if (root.endsWith("/")) { + return root; + } + return root + "/"; + }, null); } private void configureBinaryManager(final Element binaryManager) throws DatabaseConfigurationException { @@ -386,40 +414,13 @@ private void configureBinaryManager(final Element binaryManager) throws Database private void configureXQuery(final Element xquery) throws DatabaseConfigurationException { //java binding - final String javabinding = getConfigAttributeValue(xquery, ENABLE_JAVA_BINDING_ATTRIBUTE); - - if (javabinding != null) { - setProperty(PROPERTY_ENABLE_JAVA_BINDING, javabinding); - } - - final String disableDeprecated = getConfigAttributeValue(xquery, DISABLE_DEPRECATED_FUNCTIONS_ATTRIBUTE); - setProperty(PROPERTY_DISABLE_DEPRECATED_FUNCTIONS, - Configuration.parseBoolean(disableDeprecated, DISABLE_DEPRECATED_FUNCTIONS_BY_DEFAULT)); - - final String optimize = getConfigAttributeValue(xquery, ENABLE_QUERY_REWRITING_ATTRIBUTE); - - if (optimize != null && !optimize.isEmpty()) { - setProperty(PROPERTY_ENABLE_QUERY_REWRITING, optimize); - } - - final String enforceIndexUse = getConfigAttributeValue(xquery, ENFORCE_INDEX_USE_ATTRIBUTE); - if (enforceIndexUse != null) { - setProperty(PROPERTY_ENFORCE_INDEX_USE, enforceIndexUse); - } - - final String backwardCompatible = getConfigAttributeValue(xquery, XQUERY_BACKWARD_COMPATIBLE_ATTRIBUTE); - - if ((backwardCompatible != null) && (!backwardCompatible.isEmpty())) { - setProperty(PROPERTY_XQUERY_BACKWARD_COMPATIBLE, backwardCompatible); - } - - final String raiseErrorOnFailedRetrieval = getConfigAttributeValue(xquery, - XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_ATTRIBUTE); - setProperty(PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL, - Configuration.parseBoolean(raiseErrorOnFailedRetrieval, XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_DEFAULT)); - - final String trace = getConfigAttributeValue(xquery, PerformanceStats.CONFIG_ATTR_TRACE); - setProperty(PerformanceStats.CONFIG_PROPERTY_TRACE, trace); + configureProperty(xquery, ENABLE_JAVA_BINDING_ATTRIBUTE, PROPERTY_ENABLE_JAVA_BINDING); + configureProperty(xquery, DISABLE_DEPRECATED_FUNCTIONS_ATTRIBUTE, PROPERTY_DISABLE_DEPRECATED_FUNCTIONS, Configuration::asBoolean, DISABLE_DEPRECATED_FUNCTIONS_BY_DEFAULT); + configureProperty(xquery, ENABLE_QUERY_REWRITING_ATTRIBUTE, PROPERTY_ENABLE_QUERY_REWRITING); + configureProperty(xquery, ENFORCE_INDEX_USE_ATTRIBUTE, PROPERTY_ENFORCE_INDEX_USE); + configureProperty(xquery, XQUERY_BACKWARD_COMPATIBLE_ATTRIBUTE, PROPERTY_XQUERY_BACKWARD_COMPATIBLE); + configureProperty(xquery, XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_ATTRIBUTE, PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL, Configuration::asBoolean, XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_DEFAULT); + configureProperty(xquery, PerformanceStats.CONFIG_ATTR_TRACE, PerformanceStats.CONFIG_PROPERTY_TRACE); // built-in-modules final Map> classMap = new HashMap<>(); @@ -443,7 +444,7 @@ private void configureXQuery(final Element xquery) throws DatabaseConfigurationE private void loadModuleClasses(final Element xquery, final Map> modulesClassMap, final Map modulesSourceMap, - final Map>> moduleParameters + final Map>> moduleParameters ) throws DatabaseConfigurationException { // add the standard function module modulesClassMap.put(XPATH_FUNCTIONS_NS, org.exist.xquery.functions.fn.FnModule.class); @@ -539,25 +540,12 @@ private Class lookupModuleClass(final String uri, final String clazz) throws * @throws NumberFormatException if one of the settings is not parseable */ private void configureXUpdate(final Element xupdate) throws NumberFormatException { - final String fragmentation = getConfigAttributeValue(xupdate, XUPDATE_FRAGMENTATION_FACTOR_ATTRIBUTE); - - if (fragmentation != null) { - setProperty(PROPERTY_XUPDATE_FRAGMENTATION_FACTOR, Integer.valueOf(fragmentation)); - } - - final String consistencyCheck = getConfigAttributeValue(xupdate, XUPDATE_CONSISTENCY_CHECKS_ATTRIBUTE); - - if (consistencyCheck != null) { - setProperty(PROPERTY_XUPDATE_CONSISTENCY_CHECKS, parseBoolean(consistencyCheck, false)); - } + configureProperty(xupdate, XUPDATE_FRAGMENTATION_FACTOR_ATTRIBUTE, PROPERTY_XUPDATE_FRAGMENTATION_FACTOR, Configuration::asInteger, null); + configureProperty(xupdate, XUPDATE_CONSISTENCY_CHECKS_ATTRIBUTE, PROPERTY_XUPDATE_CONSISTENCY_CHECKS, Configuration::asBoolean, FALSE); } private void configureSaxon(final Element saxon) { - final String configurationFile = getConfigAttributeValue( saxon, - SaxonConfiguration.SAXON_CONFIGURATION_FILE_ATTRIBUTE); - if (configurationFile != null) { - setProperty(SaxonConfiguration.SAXON_CONFIGURATION_FILE_PROPERTY, configurationFile); - } + configureProperty(saxon, SaxonConfiguration.SAXON_CONFIGURATION_FILE_ATTRIBUTE, SaxonConfiguration.SAXON_CONFIGURATION_FILE_PROPERTY); } private void configureTransformer(final Element transformer) { @@ -598,11 +586,7 @@ private void configureTransformer(final Element transformer) { setProperty(PROPERTY_TRANSFORMER_ATTRIBUTES, attributes); } - final String cachingValue = getConfigAttributeValue(transformer, TRANSFORMER_CACHING_ATTRIBUTE); - - if (cachingValue != null) { - setProperty(PROPERTY_CACHING_ATTRIBUTE, parseBoolean(cachingValue, false)); - } + configureProperty(transformer, TRANSFORMER_CACHING_ATTRIBUTE, PROPERTY_CACHING_ATTRIBUTE, Configuration::asBoolean, FALSE); } private void configureParser(final Element parser) throws DatabaseConfigurationException { @@ -653,55 +637,16 @@ private void configureHtmlToXmlParser(final Element parser) throws DatabaseConfi * @param serializer element with serializer settings */ private void configureSerializer(final Element serializer) { - final String omitXmlDeclaration = getConfigAttributeValue(serializer, OMIT_XML_DECLARATION_ATTRIBUTE); - if (omitXmlDeclaration != null) { - setProperty(PROPERTY_OMIT_XML_DECLARATION, omitXmlDeclaration); - } - - final String omitOriginalXmlDeclaration = getConfigAttributeValue(serializer, OMIT_ORIGINAL_XML_DECLARATION_ATTRIBUTE); - if (omitOriginalXmlDeclaration != null) { - setProperty(PROPERTY_OMIT_ORIGINAL_XML_DECLARATION, omitOriginalXmlDeclaration); - } - - final String outputDocType = getConfigAttributeValue(serializer, OUTPUT_DOCTYPE_ATTRIBUTE); - if (outputDocType != null) { - setProperty(PROPERTY_OUTPUT_DOCTYPE, outputDocType); - } - - final String xinclude = getConfigAttributeValue(serializer, ENABLE_XINCLUDE_ATTRIBUTE); - if (xinclude != null) { - setProperty(PROPERTY_ENABLE_XINCLUDE, xinclude); - } - - final String xsl = getConfigAttributeValue(serializer, ENABLE_XSL_ATTRIBUTE); - if (xsl != null) { - setProperty(PROPERTY_ENABLE_XSL, xsl); - } - - final String indent = getConfigAttributeValue(serializer, INDENT_ATTRIBUTE); - if (indent != null) { - setProperty(PROPERTY_INDENT, indent); - } - - final String compress = getConfigAttributeValue(serializer, COMPRESS_OUTPUT_ATTRIBUTE); - if (compress != null) { - setProperty(PROPERTY_COMPRESS_OUTPUT, compress); - } - - final String internalId = getConfigAttributeValue(serializer, ADD_EXIST_ID_ATTRIBUTE); - if (internalId != null) { - setProperty(PROPERTY_ADD_EXIST_ID, internalId); - } - - final String tagElementMatches = getConfigAttributeValue(serializer, TAG_MATCHING_ELEMENTS_ATTRIBUTE); - if (tagElementMatches != null) { - setProperty(PROPERTY_TAG_MATCHING_ELEMENTS, tagElementMatches); - } - - final String tagAttributeMatches = getConfigAttributeValue(serializer, TAG_MATCHING_ATTRIBUTES_ATTRIBUTE); - if (tagAttributeMatches != null) { - setProperty(PROPERTY_TAG_MATCHING_ATTRIBUTES, tagAttributeMatches); - } + configureProperty(serializer, OMIT_XML_DECLARATION_ATTRIBUTE, PROPERTY_OMIT_XML_DECLARATION); + configureProperty(serializer, OMIT_ORIGINAL_XML_DECLARATION_ATTRIBUTE, PROPERTY_OMIT_ORIGINAL_XML_DECLARATION); + configureProperty(serializer, OUTPUT_DOCTYPE_ATTRIBUTE, PROPERTY_OUTPUT_DOCTYPE); + configureProperty(serializer, ENABLE_XINCLUDE_ATTRIBUTE, PROPERTY_ENABLE_XINCLUDE); + configureProperty(serializer, ENABLE_XSL_ATTRIBUTE, PROPERTY_ENABLE_XSL); + configureProperty(serializer, INDENT_ATTRIBUTE, PROPERTY_INDENT); + configureProperty(serializer, COMPRESS_OUTPUT_ATTRIBUTE, PROPERTY_COMPRESS_OUTPUT); + configureProperty(serializer, ADD_EXIST_ID_ATTRIBUTE, PROPERTY_ADD_EXIST_ID); + configureProperty(serializer, TAG_MATCHING_ELEMENTS_ATTRIBUTE, PROPERTY_TAG_MATCHING_ELEMENTS); + configureProperty(serializer, TAG_MATCHING_ATTRIBUTES_ATTRIBUTE, PROPERTY_TAG_MATCHING_ATTRIBUTES); final NodeList nlFilters = serializer.getElementsByTagName(CustomMatchListenerFactory.CONFIGURATION_ELEMENT); if (nlFilters.getLength() > 0) { @@ -779,9 +724,6 @@ private void addJobToList(final List jobList, final Element job) { } else { jobType = JobType.valueOf(strJobType.toUpperCase(Locale.ENGLISH)); } - - final String jobName = getConfigAttributeValue(job, JOB_NAME_ATTRIBUTE); - //get the job resource String jobResource = getConfigAttributeValue(job, JOB_CLASS_ATTRIBUTE); if (jobResource == null) { @@ -794,10 +736,10 @@ private void addJobToList(final List jobList, final Element job) { jobSchedule = getConfigAttributeValue(job, JOB_PERIOD_ATTRIBUTE); } - final String jobUnschedule = getConfigAttributeValue(job, JOB_UNSCHEDULE_ON_EXCEPTION); - //create the job config try { + final String jobName = getConfigAttributeValue(job, JOB_NAME_ATTRIBUTE); + final String jobUnschedule = getConfigAttributeValue(job, JOB_UNSCHEDULE_ON_EXCEPTION); final JobConfig jobConfig = new JobConfig(jobType, jobName, jobResource, jobSchedule, jobUnschedule); //get and set the job delay @@ -845,10 +787,7 @@ private void addJobToList(final List jobList, final Element job) { * @throws DatabaseConfigurationException */ private void configureBackend(final Optional dbHome, Element con) throws DatabaseConfigurationException { - final String database = getConfigAttributeValue(con, PROPERTY_DATABASE); - if (database != null) { - setProperty(PROPERTY_DATABASE, database); - } + configureProperty(con, PROPERTY_DATABASE, PROPERTY_DATABASE); // directory for database files final String dataFiles = getConfigAttributeValue(con, DATA_DIR_ATTRIBUTE); @@ -930,33 +869,12 @@ private void configureBackend(final Optional dbHome, Element con) throws D } } - final String pageSize = getConfigAttributeValue(con, NativeBroker.PAGE_SIZE_ATTRIBUTE); - if (pageSize != null) { - try { - setProperty(PROPERTY_PAGE_SIZE, Integer.valueOf(pageSize)); - } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + PROPERTY_PAGE_SIZE + " value to integer: {}", pageSize, nfe); - } - } + configureProperty(con, NativeBroker.PAGE_SIZE_ATTRIBUTE, PROPERTY_PAGE_SIZE, Configuration::asInteger, null); //Not clear : rather looks like a buffers count - final String collCacheSize = getConfigAttributeValue(con, BrokerPool.COLLECTION_CACHE_SIZE_ATTRIBUTE); - if (collCacheSize != null) { - try { - setProperty(PROPERTY_COLLECTION_CACHE_SIZE, Integer.valueOf(collCacheSize)); - } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + PROPERTY_COLLECTION_CACHE_SIZE + " value to integer: {}", collCacheSize, nfe); - } - } + configureProperty(con, BrokerPool.COLLECTION_CACHE_SIZE_ATTRIBUTE, PROPERTY_COLLECTION_CACHE_SIZE, Configuration::asInteger, null); - final String nodesBuffer = getConfigAttributeValue(con, BrokerPool.NODES_BUFFER_ATTRIBUTE); - if (nodesBuffer != null) { - try { - setProperty(PROPERTY_NODES_BUFFER, Integer.valueOf(nodesBuffer)); - } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + PROPERTY_NODES_BUFFER + " value to integer: {}", nodesBuffer, nfe); - } - } + configureProperty(con, BrokerPool.NODES_BUFFER_ATTRIBUTE, PROPERTY_NODES_BUFFER, Configuration::asInteger, null); String diskSpace = getConfigAttributeValue(con, BrokerPool.DISK_SPACE_MIN_ATTRIBUTE); if (diskSpace != null) { @@ -971,16 +889,12 @@ private void configureBackend(final Optional dbHome, Element con) throws D } } - final String posixChownRestrictedStr = getConfigAttributeValue(con, POSIX_CHOWN_RESTRICTED_ATTRIBUTE); - final boolean posixChownRestricted = posixChownRestrictedStr == null || Boolean.parseBoolean(posixChownRestrictedStr); - setProperty(POSIX_CHOWN_RESTRICTED_PROPERTY, posixChownRestricted); + configureProperty(con, POSIX_CHOWN_RESTRICTED_ATTRIBUTE, POSIX_CHOWN_RESTRICTED_PROPERTY, Configuration::asBoolean, TRUE); - final String preserveOnCopyStr = getConfigAttributeValue(con, PRESERVE_ON_COPY_ATTRIBUTE); // default or configuration explicitly specifies that attributes should be preserved on copy - final PreserveType preserveOnCopy = Boolean.parseBoolean(preserveOnCopyStr) - ? PreserveType.PRESERVE - : PreserveType.NO_PRESERVE; - setProperty(PRESERVE_ON_COPY_PROPERTY, preserveOnCopy); + configureProperty(con, PRESERVE_ON_COPY_ATTRIBUTE, PRESERVE_ON_COPY_PROPERTY, + preserveOnCopyStr -> Boolean.parseBoolean(preserveOnCopyStr) ? PreserveType.PRESERVE : PreserveType.NO_PRESERVE, + PreserveType.NO_PRESERVE); final NodeList startupConf = con.getElementsByTagName(BrokerPool.CONFIGURATION_STARTUP_ELEMENT_NAME); if (startupConf.getLength() > 0) { @@ -998,14 +912,9 @@ private void configureBackend(final Optional dbHome, Element con) throws D } private void configureRecovery(final Optional dbHome, final Element recovery) throws DatabaseConfigurationException { - final String enabled = getConfigAttributeValue(recovery, RECOVERY_ENABLED_ATTRIBUTE); - setProperty(PROPERTY_RECOVERY_ENABLED, parseBoolean(enabled, true)); - - final String syncOnCommit = getConfigAttributeValue(recovery, RECOVERY_SYNC_ON_COMMIT_ATTRIBUTE); - setProperty(PROPERTY_RECOVERY_SYNC_ON_COMMIT, parseBoolean(syncOnCommit, true)); - - final String groupCommit = getConfigAttributeValue(recovery, RECOVERY_GROUP_COMMIT_ATTRIBUTE); - setProperty(PROPERTY_RECOVERY_GROUP_COMMIT, parseBoolean(groupCommit, false)); + configureProperty(recovery, RECOVERY_ENABLED_ATTRIBUTE, PROPERTY_RECOVERY_ENABLED, Configuration::asBoolean, TRUE); + configureProperty(recovery, RECOVERY_SYNC_ON_COMMIT_ATTRIBUTE, PROPERTY_RECOVERY_SYNC_ON_COMMIT, Configuration::asBoolean, TRUE); + configureProperty(recovery, RECOVERY_GROUP_COMMIT_ATTRIBUTE, PROPERTY_RECOVERY_GROUP_COMMIT, Configuration::asBoolean, FALSE); final String journalDir = getConfigAttributeValue(recovery, RECOVERY_JOURNAL_DIR_ATTRIBUTE); if (journalDir != null) { @@ -1032,13 +941,8 @@ private void configureRecovery(final Optional dbHome, final Element recove } } - final String forceRestart = getConfigAttributeValue(recovery, RECOVERY_FORCE_RESTART_ATTRIBUTE); - final boolean forceRestartValue = "yes".equals(forceRestart); - setProperty(PROPERTY_RECOVERY_FORCE_RESTART, forceRestartValue); - - final String postRecoveryCheck = getConfigAttributeValue(recovery, RECOVERY_POST_RECOVERY_CHECK); - final boolean postRecoveryCheckValue = "yes".equals(postRecoveryCheck); - setProperty(PROPERTY_RECOVERY_CHECK, postRecoveryCheckValue); + configureProperty(recovery, RECOVERY_FORCE_RESTART_ATTRIBUTE, PROPERTY_RECOVERY_FORCE_RESTART, Configuration::asBoolean, FALSE); + configureProperty(recovery, RECOVERY_POST_RECOVERY_CHECK, PROPERTY_RECOVERY_CHECK, Configuration::asBoolean, FALSE); } /** @@ -1047,25 +951,8 @@ private void configureRecovery(final Optional dbHome, final Element recove * @param watchDog element with watchDog settings */ private void configureWatchdog(final Element watchDog) { - final String timeout = getConfigAttributeValue(watchDog, "query-timeout"); - - if (timeout != null) { - try { - setProperty(PROPERTY_QUERY_TIMEOUT, Long.valueOf(timeout)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } - - final String maxOutput = getConfigAttributeValue(watchDog, "output-size-limit"); - - if (maxOutput != null) { - try { - setProperty(PROPERTY_OUTPUT_SIZE_LIMIT, Integer.valueOf(maxOutput)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } + configureProperty(watchDog, "query-timeout", PROPERTY_QUERY_TIMEOUT, Configuration::asLong, null); + configureProperty(watchDog, "output-size-limit", PROPERTY_OUTPUT_SIZE_LIMIT, Configuration::asInteger, null); } /** @@ -1074,25 +961,8 @@ private void configureWatchdog(final Element watchDog) { * @param queryPool element with queryPool settings */ private void configureXQueryPool(final Element queryPool) { - final String maxStackSize = getConfigAttributeValue(queryPool, MAX_STACK_SIZE_ATTRIBUTE); - - if (maxStackSize != null) { - try { - setProperty(PROPERTY_MAX_STACK_SIZE, Integer.valueOf(maxStackSize)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } - - final String maxPoolSize = getConfigAttributeValue(queryPool, POOL_SIZE_ATTTRIBUTE); - - if (maxPoolSize != null) { - try { - setProperty(XQueryPool.PROPERTY_POOL_SIZE, Integer.valueOf(maxPoolSize)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } + configureProperty(queryPool, MAX_STACK_SIZE_ATTRIBUTE, PROPERTY_MAX_STACK_SIZE, Configuration::asInteger, null); + configureProperty(queryPool, POOL_SIZE_ATTTRIBUTE, XQueryPool.PROPERTY_POOL_SIZE, Configuration::asInteger, null); } private void configureStartup(final Element startup) throws DatabaseConfigurationException { @@ -1155,49 +1025,14 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio } private void configurePool(final Element pool) { - final String min = getConfigAttributeValue(pool, MIN_CONNECTIONS_ATTRIBUTE); - if (min != null) { - try { - setProperty(PROPERTY_MIN_CONNECTIONS, Integer.valueOf(min)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } - - final String max = getConfigAttributeValue(pool, MAX_CONNECTIONS_ATTRIBUTE); - if (max != null) { - try { - setProperty(PROPERTY_MAX_CONNECTIONS, Integer.valueOf(max)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } - - final String sync = getConfigAttributeValue(pool, SYNC_PERIOD_ATTRIBUTE); - if (sync != null) { - try { - setProperty(PROPERTY_SYNC_PERIOD, Long.valueOf(sync)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } - - final String maxShutdownWait = getConfigAttributeValue(pool, SHUTDOWN_DELAY_ATTRIBUTE); - if (maxShutdownWait != null) { - try { - setProperty(PROPERTY_SHUTDOWN_DELAY, Long.valueOf(maxShutdownWait)); - } catch (final NumberFormatException e) { - LOG.warn(e); - } - } + configureProperty(pool, MIN_CONNECTIONS_ATTRIBUTE, PROPERTY_MIN_CONNECTIONS, Configuration::asInteger, null); + configureProperty(pool, MAX_CONNECTIONS_ATTRIBUTE, PROPERTY_MAX_CONNECTIONS, Configuration::asInteger, null); + configureProperty(pool, SYNC_PERIOD_ATTRIBUTE, PROPERTY_SYNC_PERIOD, Configuration::asInteger, null); + configureProperty(pool, SHUTDOWN_DELAY_ATTRIBUTE, PROPERTY_SHUTDOWN_DELAY, Configuration::asInteger, null); } private void configureIndexer(final Document doc, final Element indexer) throws DatabaseConfigurationException { - final String caseSensitive = getConfigAttributeValue(indexer, INDEX_CASE_SENSITIVE_ATTRIBUTE); - - if (caseSensitive != null) { - setProperty(PROPERTY_INDEX_CASE_SENSITIVE, parseBoolean(caseSensitive, false)); - } + configureProperty(indexer, INDEX_CASE_SENSITIVE_ATTRIBUTE, PROPERTY_INDEX_CASE_SENSITIVE, Configuration::asBoolean, FALSE); int depth = 3; final String indexDepth = getConfigAttributeValue(indexer, INDEX_DEPTH_ATTRIBUTE); @@ -1217,17 +1052,8 @@ private void configureIndexer(final Document doc, final Element indexer) throws } } - final String suppressWS = getConfigAttributeValue(indexer, SUPPRESS_WHITESPACE_ATTRIBUTE); - - if (suppressWS != null) { - setProperty(PROPERTY_SUPPRESS_WHITESPACE, suppressWS); - } - - final String suppressWSmixed = getConfigAttributeValue(indexer, PRESERVE_WS_MIXED_CONTENT_ATTRIBUTE); - - if (suppressWSmixed != null) { - setProperty(PROPERTY_PRESERVE_WS_MIXED_CONTENT, parseBoolean(suppressWSmixed, false)); - } + configureProperty(indexer, SUPPRESS_WHITESPACE_ATTRIBUTE, PROPERTY_SUPPRESS_WHITESPACE); + configureProperty(indexer, PRESERVE_WS_MIXED_CONTENT_ATTRIBUTE, PROPERTY_PRESERVE_WS_MIXED_CONTENT, Configuration::asBoolean, FALSE); // index settings final NodeList cl = doc.getElementsByTagName(CONFIGURATION_INDEX_ELEMENT_NAME); @@ -1267,14 +1093,10 @@ private void configureIndexer(final Document doc, final Element indexer) throws private void configureValidation(final Optional dbHome, final Element validation) { // Determine validation mode - final String mode = getConfigAttributeValue(validation, XMLReaderObjectFactory.VALIDATION_MODE_ATTRIBUTE); - if (mode != null) { - setProperty(PROPERTY_VALIDATION_MODE, mode); - } + configureProperty(validation, XMLReaderObjectFactory.VALIDATION_MODE_ATTRIBUTE, PROPERTY_VALIDATION_MODE); // cache - final GrammarPool gp = new GrammarPool(); - setProperty(XMLReaderObjectFactory.GRAMMAR_POOL, gp); + setProperty(XMLReaderObjectFactory.GRAMMAR_POOL, new GrammarPool()); // Configure the Entity Resolver final NodeList entityResolver = validation.getElementsByTagName(XMLReaderObjectFactory.CONFIGURATION_ENTITY_RESOLVER_ELEMENT_NAME); @@ -1339,21 +1161,14 @@ private void configureValidation(final Optional dbHome, final Element vali } } - private void configureRpcServer(final Element validation) { - final NodeList contentFile = validation.getElementsByTagName("content-file"); - if (contentFile.getLength() > 0) { - final String inMemorySize = ((Element) contentFile.item(0)).getAttribute("in-memory-size"); - if (inMemorySize != null) { - setProperty(PROPERTY_IN_MEMORY_SIZE, parseInt(inMemorySize, DEFAULT_IN_MEMORY_SIZE)); - } - } - final NodeList contentFilePool = validation.getElementsByTagName("content-file-pool"); - if (contentFilePool.getLength() > 0) { - final String size = ((Element) contentFilePool.item(0)).getAttribute("size"); - setProperty(ContentFilePool.PROPERTY_POOL_SIZE, parseInt(size, -1)); - final String maxIdle = ((Element) contentFilePool.item(0)).getAttribute("max-idle"); - setProperty(ContentFilePool.PROPERTY_POOL_MAX_IDLE, parseInt(maxIdle, 5)); - } + private void configureRpcServer(final Element validation) throws DatabaseConfigurationException { + configureElement(validation, "content-file", element -> { + configureProperty(element, "in-memory-size", PROPERTY_IN_MEMORY_SIZE, Configuration::asInteger, DEFAULT_IN_MEMORY_SIZE); + }); + configureElement(validation, "content-file-pool", element -> { + configureProperty(element, "size", ContentFilePool.PROPERTY_POOL_SIZE, Configuration::asInteger, -1); + configureProperty(element, "max-idle", ContentFilePool.PROPERTY_POOL_MAX_IDLE, Configuration::asInteger, 5); + }); } /** @@ -1381,6 +1196,25 @@ private String getConfigAttributeValue(final Element element, final String attri return element.getAttribute(attributeName); } + private void configureProperty(final Element element, final String attributeName, final String propertyName, + final Function valueConverter, final T defaultValue) { + final String attributeValue = getConfigAttributeValue(element, attributeName); + if (attributeValue != null) { + T value = valueConverter.apply(attributeValue); + if (value != null) { + setProperty(propertyName, value); + return; + } + } + if (defaultValue != null) { + setProperty(propertyName, defaultValue); + } + } + + private void configureProperty(final Element element, final String attributeName, final String propertyName) { + configureProperty(element, attributeName, propertyName, Function.identity(), null); + } + /** * Generates a suitable system property name from the given config attribute and parent element. *

From de156176fc417066c19ed8bb94c9c7e546e0d143 Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Mon, 18 Mar 2024 21:04:00 +0100 Subject: [PATCH 4/7] Removes more warnings douplicated code --- .../java/org/exist/util/Configuration.java | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index 8bf39809999..4abbdbd7d18 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -31,6 +31,7 @@ import org.exist.resolver.ResolverFactory; import org.exist.start.Main; +import org.exist.storage.BrokerPoolConstants; import org.exist.storage.lock.LockManager; import org.exist.storage.lock.LockTable; import org.exist.util.io.ContentFilePool; @@ -51,7 +52,6 @@ import org.exist.dom.memtree.SAXAdapter; import org.exist.scheduler.JobConfig; import org.exist.scheduler.JobException; -import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.DefaultCacheManager; import org.exist.storage.IndexSpec; @@ -71,7 +71,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Hashtable; import java.util.List; import java.util.Locale; import java.util.HashMap; @@ -80,7 +79,6 @@ import java.util.Optional; import java.util.Properties; import java.util.function.Function; -import java.util.stream.Collectors; import javax.annotation.Nullable; import javax.xml.parsers.ParserConfigurationException; @@ -142,6 +140,8 @@ public class Configuration implements ErrorHandler { private static final String XQUERY_CONFIGURATION_ELEMENT_NAME = "xquery"; private static final String XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULES_ELEMENT_NAME = "builtin-modules"; private static final String XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULE_ELEMENT_NAME = "module"; + private static final String CANNOT_CONVERT_VALUE_TO_INTEGER = "Cannot convert {} value to integer: {}"; + private static final String ORG_EXIST_STORAGE_STARTUP_TRIGGER = "org.exist.storage.StartupTrigger"; private final Map config = new HashMap<>(); //Configuration protected Optional configFilePath = Optional.empty(); protected Optional existHome = Optional.empty(); @@ -222,7 +222,7 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi // set dbHome to parent of the conf file found, to resolve relative // path from conf file - final Optional existHome = configFilePath.map(Path::getParent); + final Optional existHomePath = configFilePath.map(Path::getParent); // initialize xml parser // we use eXist's in-memory DOM implementation to work @@ -250,7 +250,7 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi //scheduler settings configureElement(doc, JobConfig.CONFIGURATION_ELEMENT_NAME, this::configureScheduler); //db connection settings - configureElement(doc, CONFIGURATION_CONNECTION_ELEMENT_NAME, element -> configureBackend(existHome, element)); + configureElement(doc, CONFIGURATION_CONNECTION_ELEMENT_NAME, element -> configureBackend(existHomePath, element)); // lock-table settings configureElement(doc, "lock-manager", this::configureLockManager); // repository settings @@ -270,7 +270,7 @@ public Configuration(@Nullable String configFilename, Optional existHomeDi // XQuery settings configureElement(doc, XQUERY_CONFIGURATION_ELEMENT_NAME, this::configureXQuery); // Validation - configureElement(doc, XMLReaderObjectFactory.CONFIGURATION_ELEMENT_NAME, element -> configureValidation(existHome, element)); + configureElement(doc, XMLReaderObjectFactory.CONFIGURATION_ELEMENT_NAME, element -> configureValidation(existHomePath, element)); // RPC server configureElement(doc, "rpc-server", this::configureRpcServer); } catch (final SAXException | IOException | ParserConfigurationException e) { @@ -444,7 +444,7 @@ private void configureXQuery(final Element xquery) throws DatabaseConfigurationE private void loadModuleClasses(final Element xquery, final Map> modulesClassMap, final Map modulesSourceMap, - final Map>> moduleParameters + final Map>> moduleParameters ) throws DatabaseConfigurationException { // add the standard function module modulesClassMap.put(XPATH_FUNCTIONS_NS, org.exist.xquery.functions.fn.FnModule.class); @@ -461,14 +461,14 @@ private void loadModuleClasses(final Element xquery, // Get attributes uri class and src final String uri = elem.getAttribute(BUILT_IN_MODULE_URI_ATTRIBUTE); - final String clazz = elem.getAttribute(BUILT_IN_MODULE_CLASS_ATTRIBUTE); - final String source = elem.getAttribute(BUILT_IN_MODULE_SOURCE_ATTRIBUTE); // uri attribute is the identifier and is always required if (uri == null) { throw (new DatabaseConfigurationException("element 'module' requires an attribute 'uri'")); } + final String clazz = elem.getAttribute(BUILT_IN_MODULE_CLASS_ATTRIBUTE); + final String source = elem.getAttribute(BUILT_IN_MODULE_SOURCE_ATTRIBUTE); // either class or source attribute must be present if (clazz == null && source == null) { throw (new DatabaseConfigurationException("element 'module' requires either an attribute " + "'class' or 'src'")); @@ -557,7 +557,7 @@ private void configureTransformer(final Element transformer) { // Process any specified attributes that should be passed to the transformer factory final NodeList attrs = transformer.getElementsByTagName(CONFIGURATION_TRANSFORMER_ATTRIBUTE_ELEMENT_NAME); - final Hashtable attributes = new Properties(); + final Properties attributes = new Properties(); for (int a = 0; a < attrs.getLength(); a++) { final Element attr = (Element) attrs.item(a); @@ -595,7 +595,7 @@ private void configureParser(final Element parser) throws DatabaseConfigurationE } private void configureXmlParser(final Element parser) throws DatabaseConfigurationException { - configureElement(parser, XML_PARSER_ELEMENT, xml -> { + configureElement(parser, XML_PARSER_ELEMENT, xml -> configureElement(xml, XML_PARSER_FEATURES_ELEMENT, nlFeature -> { final Properties pFeatures = ParametersExtractor.parseFeatures(nlFeature); @@ -606,8 +606,8 @@ private void configureXmlParser(final Element parser) throws DatabaseConfigurati final Map features = new HashMap<>(); pFeatures.forEach((k, v) -> features.put(k.toString(), Boolean.valueOf(v.toString()))); setProperty(XML_PARSER_FEATURES_PROPERTY, features); - }); - }); + }) + ); } private void configureHtmlToXmlParser(final Element parser) throws DatabaseConfigurationException { @@ -815,7 +815,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D try { setProperty(PROPERTY_CACHE_SIZE, Integer.valueOf(cacheMem)); } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + PROPERTY_CACHE_SIZE + " value to integer: {}", cacheMem, nfe); + LOG.warn(CANNOT_CONVERT_VALUE_TO_INTEGER, PROPERTY_CACHE_SIZE, cacheMem, nfe); } } @@ -838,7 +838,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D try { setProperty(SHRINK_THRESHOLD_PROPERTY, Integer.valueOf(cacheShrinkThreshold)); } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + SHRINK_THRESHOLD_PROPERTY + " value to integer: {}", cacheShrinkThreshold, nfe); + LOG.warn(CANNOT_CONVERT_VALUE_TO_INTEGER, SHRINK_THRESHOLD_PROPERTY, cacheShrinkThreshold, nfe); } String collectionCache = getConfigAttributeValue(con, CollectionCache.CACHE_SIZE_ATTRIBUTE); @@ -865,18 +865,18 @@ private void configureBackend(final Optional dbHome, Element con) throws D setProperty(PROPERTY_CACHE_SIZE_BYTES, collectionCacheBytes); } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + PROPERTY_CACHE_SIZE_BYTES + " value to integer: {}", collectionCache, nfe); + LOG.warn(CANNOT_CONVERT_VALUE_TO_INTEGER, PROPERTY_CACHE_SIZE_BYTES, collectionCache, nfe); } } configureProperty(con, NativeBroker.PAGE_SIZE_ATTRIBUTE, PROPERTY_PAGE_SIZE, Configuration::asInteger, null); //Not clear : rather looks like a buffers count - configureProperty(con, BrokerPool.COLLECTION_CACHE_SIZE_ATTRIBUTE, PROPERTY_COLLECTION_CACHE_SIZE, Configuration::asInteger, null); + configureProperty(con, BrokerPoolConstants.COLLECTION_CACHE_SIZE_ATTRIBUTE, PROPERTY_COLLECTION_CACHE_SIZE, Configuration::asInteger, null); - configureProperty(con, BrokerPool.NODES_BUFFER_ATTRIBUTE, PROPERTY_NODES_BUFFER, Configuration::asInteger, null); + configureProperty(con, BrokerPoolConstants.NODES_BUFFER_ATTRIBUTE, PROPERTY_NODES_BUFFER, Configuration::asInteger, null); - String diskSpace = getConfigAttributeValue(con, BrokerPool.DISK_SPACE_MIN_ATTRIBUTE); + String diskSpace = getConfigAttributeValue(con, BrokerPoolConstants.DISK_SPACE_MIN_ATTRIBUTE); if (diskSpace != null) { if (diskSpace.endsWith("M") || diskSpace.endsWith("m")) { diskSpace = diskSpace.substring(0, diskSpace.length() - 1); @@ -885,7 +885,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D try { setProperty(DISK_SPACE_MIN_PROPERTY, Short.valueOf(diskSpace)); } catch (final NumberFormatException nfe) { - LOG.warn("Cannot convert " + DISK_SPACE_MIN_PROPERTY + " value to integer: {}", diskSpace, nfe); + LOG.warn(CANNOT_CONVERT_VALUE_TO_INTEGER, DISK_SPACE_MIN_PROPERTY, diskSpace, nfe); } } @@ -896,7 +896,7 @@ private void configureBackend(final Optional dbHome, Element con) throws D preserveOnCopyStr -> Boolean.parseBoolean(preserveOnCopyStr) ? PreserveType.PRESERVE : PreserveType.NO_PRESERVE, PreserveType.NO_PRESERVE); - final NodeList startupConf = con.getElementsByTagName(BrokerPool.CONFIGURATION_STARTUP_ELEMENT_NAME); + final NodeList startupConf = con.getElementsByTagName(BrokerPoolConstants.CONFIGURATION_STARTUP_ELEMENT_NAME); if (startupConf.getLength() > 0) { configureStartup((Element) startupConf.item(0)); } else { @@ -905,10 +905,10 @@ private void configureBackend(final Optional dbHome, Element con) throws D setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); } - configureElement(con, BrokerPool.CONFIGURATION_POOL_ELEMENT_NAME, this::configurePool); + configureElement(con, BrokerPoolConstants.CONFIGURATION_POOL_ELEMENT_NAME, this::configurePool); configureElement(con, XQueryPool.CONFIGURATION_ELEMENT_NAME, this::configureXQueryPool); configureElement(con, XQueryWatchDog.CONFIGURATION_ELEMENT_NAME, this::configureWatchdog); - configureElement(con, BrokerPool.CONFIGURATION_RECOVERY_ELEMENT_NAME, element -> configureRecovery(dbHome, element)); + configureElement(con, BrokerPoolConstants.CONFIGURATION_RECOVERY_ELEMENT_NAME, element -> configureRecovery(dbHome, element)); } private void configureRecovery(final Optional dbHome, final Element recovery) throws DatabaseConfigurationException { @@ -995,8 +995,8 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio boolean isStartupTrigger = false; try { // Verify if class is StartupTrigger - for (final Class iface : Class.forName(startupTriggerClass).getInterfaces()) { - if ("org.exist.storage.StartupTrigger".equals(iface.getName())) { + for (final Class iface : Class.forName(startupTriggerClass).getInterfaces()) { + if (ORG_EXIST_STORAGE_STARTUP_TRIGGER.equals(iface.getName())) { isStartupTrigger = true; break; } @@ -1034,12 +1034,11 @@ private void configurePool(final Element pool) { private void configureIndexer(final Document doc, final Element indexer) throws DatabaseConfigurationException { configureProperty(indexer, INDEX_CASE_SENSITIVE_ATTRIBUTE, PROPERTY_INDEX_CASE_SENSITIVE, Configuration::asBoolean, FALSE); - int depth = 3; final String indexDepth = getConfigAttributeValue(indexer, INDEX_DEPTH_ATTRIBUTE); if (indexDepth != null) { try { - depth = Integer.parseInt(indexDepth); + int depth = Integer.parseInt(indexDepth); if (depth < 3) { LOG.warn("parameter index-depth should be >= 3 or you will experience a severe " @@ -1133,9 +1132,9 @@ private void configureValidation(final Optional dbHome, final Element vali final String uri; // Substitute string, creating an uri from a local file if (uriAttributeValue.contains("${WEBAPP_HOME}")) { - uri = uriAttributeValue.replaceAll("\\$\\{WEBAPP_HOME}", webappHome.toUri().toString()); + uri = uriAttributeValue.replace("${WEBAPP_HOME}", webappHome.toUri().toString()); } else if (uriAttributeValue.contains("${EXIST_HOME}")) { - uri = uriAttributeValue.replaceAll("\\$\\{EXIST_HOME}", dbHome.toString()); + uri = uriAttributeValue.replace("${EXIST_HOME}", dbHome.toString()); } else { uri = uriAttributeValue; } @@ -1153,7 +1152,7 @@ private void configureValidation(final Optional dbHome, final Element vali try { final List>> catalogs = catalogUris.stream() .map(catalogUri -> Tuple(catalogUri, Optional.empty())) - .collect(Collectors.toList()); + .toList(); final Resolver resolver = ResolverFactory.newResolver(catalogs); setProperty(XMLReaderObjectFactory.CATALOG_RESOLVER, resolver); } catch (final URISyntaxException e) { @@ -1162,9 +1161,9 @@ private void configureValidation(final Optional dbHome, final Element vali } private void configureRpcServer(final Element validation) throws DatabaseConfigurationException { - configureElement(validation, "content-file", element -> { - configureProperty(element, "in-memory-size", PROPERTY_IN_MEMORY_SIZE, Configuration::asInteger, DEFAULT_IN_MEMORY_SIZE); - }); + configureElement(validation, "content-file", element -> + configureProperty(element, "in-memory-size", PROPERTY_IN_MEMORY_SIZE, Configuration::asInteger, DEFAULT_IN_MEMORY_SIZE) + ); configureElement(validation, "content-file-pool", element -> { configureProperty(element, "size", ContentFilePool.PROPERTY_POOL_SIZE, Configuration::asInteger, -1); configureProperty(element, "max-idle", ContentFilePool.PROPERTY_POOL_MAX_IDLE, Configuration::asInteger, 5); @@ -1325,7 +1324,7 @@ public void warning(SAXParseException exception) throws SAXException { exception.getLineNumber(), exception.getMessage(), exception); } - public record StartupTriggerConfig(String clazz, Map> params) { + public record StartupTriggerConfig(String clazz, Map> params) { } public record IndexModuleConfig(String id, String className, Element config) { From e7120a37098981f00d9ecef00b7a1ccac5047b07 Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Mon, 25 Mar 2024 21:39:51 +0100 Subject: [PATCH 5/7] Fixes class cast problems --- .../java/org/exist/util/Configuration.java | 136 +++++++++++++++--- 1 file changed, 118 insertions(+), 18 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index 4abbdbd7d18..ba0daed2477 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -94,9 +94,17 @@ import static java.lang.Boolean.TRUE; import static javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING; import static org.exist.Namespaces.XPATH_FUNCTIONS_NS; -import static org.exist.scheduler.JobConfig.*; +import static org.exist.scheduler.JobConfig.JOB_CLASS_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_CRON_TRIGGER_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_DELAY_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_NAME_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_PERIOD_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_REPEAT_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_TYPE_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.JOB_UNSCHEDULE_ON_EXCEPTION; +import static org.exist.scheduler.JobConfig.JOB_XQUERY_ATTRIBUTE; +import static org.exist.scheduler.JobConfig.PROPERTY_SCHEDULER_JOBS; import static org.exist.storage.BrokerFactory.PROPERTY_DATABASE; -import static org.exist.storage.BrokerPoolConstants.*; import static org.exist.Indexer.CONFIGURATION_INDEX_ELEMENT_NAME; import static org.exist.Indexer.PRESERVE_WS_MIXED_CONTENT_ATTRIBUTE; import static org.exist.Indexer.PROPERTY_INDEXER_CONFIG; @@ -104,8 +112,46 @@ import static org.exist.Indexer.PROPERTY_SUPPRESS_WHITESPACE; import static org.exist.Indexer.SUPPRESS_WHITESPACE_ATTRIBUTE; import static org.exist.collections.CollectionCache.PROPERTY_CACHE_SIZE_BYTES; -import static org.exist.storage.DBBroker.*; -import static org.exist.storage.DefaultCacheManager.*; +import static org.exist.storage.BrokerPoolConstants.CONFIGURATION_CONNECTION_ELEMENT_NAME; +import static org.exist.storage.BrokerPoolConstants.DATA_DIR_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.DISK_SPACE_MIN_PROPERTY; +import static org.exist.storage.BrokerPoolConstants.MAX_CONNECTIONS_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.MIN_CONNECTIONS_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_COLLECTION_CACHE_SIZE; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_DATA_DIR; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_MAX_CONNECTIONS; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_MIN_CONNECTIONS; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_NODES_BUFFER; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_PAGE_SIZE; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_RECOVERY_CHECK; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_RECOVERY_ENABLED; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_RECOVERY_FORCE_RESTART; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_RECOVERY_GROUP_COMMIT; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_SHUTDOWN_DELAY; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_STARTUP_TRIGGERS; +import static org.exist.storage.BrokerPoolConstants.PROPERTY_SYNC_PERIOD; +import static org.exist.storage.BrokerPoolConstants.RECOVERY_ENABLED_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.RECOVERY_FORCE_RESTART_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.RECOVERY_GROUP_COMMIT_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.RECOVERY_POST_RECOVERY_CHECK; +import static org.exist.storage.BrokerPoolConstants.SHUTDOWN_DELAY_ATTRIBUTE; +import static org.exist.storage.BrokerPoolConstants.SYNC_PERIOD_ATTRIBUTE; +import static org.exist.storage.DBBroker.POSIX_CHOWN_RESTRICTED_ATTRIBUTE; +import static org.exist.storage.DBBroker.POSIX_CHOWN_RESTRICTED_PROPERTY; +import static org.exist.storage.DBBroker.PRESERVE_ON_COPY_ATTRIBUTE; +import static org.exist.storage.DBBroker.PRESERVE_ON_COPY_PROPERTY; +import static org.exist.storage.DBBroker.PROPERTY_XUPDATE_CONSISTENCY_CHECKS; +import static org.exist.storage.DBBroker.PROPERTY_XUPDATE_FRAGMENTATION_FACTOR; +import static org.exist.storage.DBBroker.PreserveType; +import static org.exist.storage.DBBroker.XUPDATE_CONSISTENCY_CHECKS_ATTRIBUTE; +import static org.exist.storage.DBBroker.XUPDATE_FRAGMENTATION_FACTOR_ATTRIBUTE; +import static org.exist.storage.DefaultCacheManager.CACHE_CHECK_MAX_SIZE_ATTRIBUTE; +import static org.exist.storage.DefaultCacheManager.CACHE_SIZE_ATTRIBUTE; +import static org.exist.storage.DefaultCacheManager.DEFAULT_CACHE_CHECK_MAX_SIZE_STRING; +import static org.exist.storage.DefaultCacheManager.PROPERTY_CACHE_CHECK_MAX_SIZE; +import static org.exist.storage.DefaultCacheManager.PROPERTY_CACHE_SIZE; +import static org.exist.storage.DefaultCacheManager.SHRINK_THRESHOLD_ATTRIBUTE; +import static org.exist.storage.DefaultCacheManager.SHRINK_THRESHOLD_PROPERTY; import static org.exist.storage.NativeBroker.INDEX_DEPTH_ATTRIBUTE; import static org.exist.storage.NativeBroker.PROPERTY_INDEX_DEPTH; import static org.exist.storage.NativeValueIndex.INDEX_CASE_SENSITIVE_ATTRIBUTE; @@ -119,18 +165,68 @@ import static org.exist.storage.journal.Journal.RECOVERY_JOURNAL_DIR_ATTRIBUTE; import static org.exist.storage.journal.Journal.RECOVERY_SIZE_LIMIT_ATTRIBUTE; import static org.exist.storage.journal.Journal.RECOVERY_SYNC_ON_COMMIT_ATTRIBUTE; -import static org.exist.storage.serializers.Serializer.*; -import static org.exist.util.HtmlToXmlParser.*; +import static org.exist.storage.serializers.Serializer.ADD_EXIST_ID_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.COMPRESS_OUTPUT_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.ENABLE_XINCLUDE_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.ENABLE_XSL_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.INDENT_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.OMIT_ORIGINAL_XML_DECLARATION_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.OMIT_XML_DECLARATION_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.OUTPUT_DOCTYPE_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.PROPERTY_ADD_EXIST_ID; +import static org.exist.storage.serializers.Serializer.PROPERTY_COMPRESS_OUTPUT; +import static org.exist.storage.serializers.Serializer.PROPERTY_ENABLE_XINCLUDE; +import static org.exist.storage.serializers.Serializer.PROPERTY_ENABLE_XSL; +import static org.exist.storage.serializers.Serializer.PROPERTY_INDENT; +import static org.exist.storage.serializers.Serializer.PROPERTY_OMIT_ORIGINAL_XML_DECLARATION; +import static org.exist.storage.serializers.Serializer.PROPERTY_OMIT_XML_DECLARATION; +import static org.exist.storage.serializers.Serializer.PROPERTY_OUTPUT_DOCTYPE; +import static org.exist.storage.serializers.Serializer.PROPERTY_TAG_MATCHING_ATTRIBUTES; +import static org.exist.storage.serializers.Serializer.PROPERTY_TAG_MATCHING_ELEMENTS; +import static org.exist.storage.serializers.Serializer.TAG_MATCHING_ATTRIBUTES_ATTRIBUTE; +import static org.exist.storage.serializers.Serializer.TAG_MATCHING_ELEMENTS_ATTRIBUTE; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_CLASS_ATTRIBUTE; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_ELEMENT; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_FEATURES_ELEMENT; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_FEATURES_PROPERTY; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_PROPERTIES_ELEMENT; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_PROPERTIES_PROPERTY; +import static org.exist.util.HtmlToXmlParser.HTML_TO_XML_PARSER_PROPERTY; import static org.exist.util.ParametersExtractor.PARAMETER_ELEMENT_NAME; import static org.exist.util.XMLReaderObjectFactory.PROPERTY_VALIDATION_MODE; -import static org.exist.util.XMLReaderPool.XmlParser.*; +import static org.exist.util.XMLReaderPool.XmlParser.XML_PARSER_ELEMENT; +import static org.exist.util.XMLReaderPool.XmlParser.XML_PARSER_FEATURES_ELEMENT; +import static org.exist.util.XMLReaderPool.XmlParser.XML_PARSER_FEATURES_PROPERTY; import static org.exist.util.io.ContentFilePool.PROPERTY_IN_MEMORY_SIZE; import static org.exist.util.io.VirtualTempPath.DEFAULT_IN_MEMORY_SIZE; -import static org.exist.xquery.FunctionFactory.*; -import static org.exist.xquery.XQueryContext.*; +import static org.exist.xquery.FunctionFactory.DISABLE_DEPRECATED_FUNCTIONS_ATTRIBUTE; +import static org.exist.xquery.FunctionFactory.DISABLE_DEPRECATED_FUNCTIONS_BY_DEFAULT; +import static org.exist.xquery.FunctionFactory.ENABLE_JAVA_BINDING_ATTRIBUTE; +import static org.exist.xquery.FunctionFactory.PROPERTY_DISABLE_DEPRECATED_FUNCTIONS; +import static org.exist.xquery.FunctionFactory.PROPERTY_ENABLE_JAVA_BINDING; +import static org.exist.xquery.XQueryContext.BUILT_IN_MODULE_CLASS_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.BUILT_IN_MODULE_SOURCE_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.BUILT_IN_MODULE_URI_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.ENABLE_QUERY_REWRITING_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.ENFORCE_INDEX_USE_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.PROPERTY_BUILT_IN_MODULES; +import static org.exist.xquery.XQueryContext.PROPERTY_ENABLE_QUERY_REWRITING; +import static org.exist.xquery.XQueryContext.PROPERTY_ENFORCE_INDEX_USE; +import static org.exist.xquery.XQueryContext.PROPERTY_MODULE_PARAMETERS; +import static org.exist.xquery.XQueryContext.PROPERTY_STATIC_MODULE_MAP; +import static org.exist.xquery.XQueryContext.PROPERTY_XQUERY_BACKWARD_COMPATIBLE; +import static org.exist.xquery.XQueryContext.PROPERTY_XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL; +import static org.exist.xquery.XQueryContext.XQUERY_BACKWARD_COMPATIBLE_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_ATTRIBUTE; +import static org.exist.xquery.XQueryContext.XQUERY_RAISE_ERROR_ON_FAILED_RETRIEVAL_DEFAULT; import static org.exist.xquery.XQueryWatchDog.PROPERTY_OUTPUT_SIZE_LIMIT; import static org.exist.xquery.XQueryWatchDog.PROPERTY_QUERY_TIMEOUT; -import static org.exist.xslt.TransformerFactoryAllocator.*; +import static org.exist.xslt.TransformerFactoryAllocator.CONFIGURATION_TRANSFORMER_ATTRIBUTE_ELEMENT_NAME; +import static org.exist.xslt.TransformerFactoryAllocator.PROPERTY_CACHING_ATTRIBUTE; +import static org.exist.xslt.TransformerFactoryAllocator.PROPERTY_TRANSFORMER_ATTRIBUTES; +import static org.exist.xslt.TransformerFactoryAllocator.PROPERTY_TRANSFORMER_CLASS; +import static org.exist.xslt.TransformerFactoryAllocator.TRANSFORMER_CACHING_ATTRIBUTE; +import static org.exist.xslt.TransformerFactoryAllocator.TRANSFORMER_CLASS_ATTRIBUTE; public class Configuration implements ErrorHandler { @@ -365,6 +461,7 @@ public static int parseInt(@Nullable final String value, final int defaultValue) if (value == null || value.isEmpty()) { return defaultValue; } + try { return Integer.parseInt(value); } catch (final NumberFormatException e) { @@ -977,11 +1074,8 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio } // Initialize trigger configuration - List startupTriggers = (List) config.get(PROPERTY_STARTUP_TRIGGERS); - if (startupTriggers == null) { - startupTriggers = new ArrayList<>(); - setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); - } + List startupTriggers = (List) config. + computeIfAbsent(PROPERTY_STARTUP_TRIGGERS, this::initializetStartupTriggerConfigs); // Iterate over elements for (int i = 0; i < nlTrigger.getLength(); i++) { @@ -1005,7 +1099,7 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio // if it actually is a StartupTrigger if (isStartupTrigger) { // Parse additional parameters - final Map> params = ParametersExtractor.extract(trigger.getElementsByTagName(PARAMETER_ELEMENT_NAME)); + final Map> params = ParametersExtractor.extract(trigger.getElementsByTagName(PARAMETER_ELEMENT_NAME)); // Register trigger startupTriggers.add(new StartupTriggerConfig(startupTriggerClass, params)); @@ -1024,11 +1118,17 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio }); } + private List initializetStartupTriggerConfigs(String key) { + List startupTriggerConfigs = new ArrayList<>(); + setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggerConfigs); + return startupTriggerConfigs; + } + private void configurePool(final Element pool) { configureProperty(pool, MIN_CONNECTIONS_ATTRIBUTE, PROPERTY_MIN_CONNECTIONS, Configuration::asInteger, null); configureProperty(pool, MAX_CONNECTIONS_ATTRIBUTE, PROPERTY_MAX_CONNECTIONS, Configuration::asInteger, null); - configureProperty(pool, SYNC_PERIOD_ATTRIBUTE, PROPERTY_SYNC_PERIOD, Configuration::asInteger, null); - configureProperty(pool, SHUTDOWN_DELAY_ATTRIBUTE, PROPERTY_SHUTDOWN_DELAY, Configuration::asInteger, null); + configureProperty(pool, SYNC_PERIOD_ATTRIBUTE, PROPERTY_SYNC_PERIOD, Configuration::asLong, null); + configureProperty(pool, SHUTDOWN_DELAY_ATTRIBUTE, PROPERTY_SHUTDOWN_DELAY, Configuration::asLong, null); } private void configureIndexer(final Document doc, final Element indexer) throws DatabaseConfigurationException { From 4c52f5bd9d64bfe274598f09328d523b6d1d1122 Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Mon, 25 Mar 2024 22:33:37 +0100 Subject: [PATCH 6/7] Try to fix concurrent modification --- .../java/org/exist/util/Configuration.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index ba0daed2477..672ec76d922 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -35,7 +35,9 @@ import org.exist.storage.lock.LockManager; import org.exist.storage.lock.LockTable; import org.exist.util.io.ContentFilePool; -import org.exist.xquery.*; +import org.exist.xquery.Expression; +import org.exist.xquery.PerformanceStats; +import org.exist.xquery.XQueryWatchDog; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -78,6 +80,7 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import javax.annotation.Nullable; @@ -238,7 +241,9 @@ public class Configuration implements ErrorHandler { private static final String XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULE_ELEMENT_NAME = "module"; private static final String CANNOT_CONVERT_VALUE_TO_INTEGER = "Cannot convert {} value to integer: {}"; private static final String ORG_EXIST_STORAGE_STARTUP_TRIGGER = "org.exist.storage.StartupTrigger"; + private final Map config = new HashMap<>(); //Configuration + protected Optional configFilePath = Optional.empty(); protected Optional existHome = Optional.empty(); @@ -1074,8 +1079,11 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio } // Initialize trigger configuration - List startupTriggers = (List) config. - computeIfAbsent(PROPERTY_STARTUP_TRIGGERS, this::initializetStartupTriggerConfigs); + List startupTriggers = (List) config.get(PROPERTY_STARTUP_TRIGGERS); + if (startupTriggers == null) { + startupTriggers = new ArrayList<>(); + setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); + } // Iterate over elements for (int i = 0; i < nlTrigger.getLength(); i++) { @@ -1118,12 +1126,6 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio }); } - private List initializetStartupTriggerConfigs(String key) { - List startupTriggerConfigs = new ArrayList<>(); - setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggerConfigs); - return startupTriggerConfigs; - } - private void configurePool(final Element pool) { configureProperty(pool, MIN_CONNECTIONS_ATTRIBUTE, PROPERTY_MIN_CONNECTIONS, Configuration::asInteger, null); configureProperty(pool, MAX_CONNECTIONS_ATTRIBUTE, PROPERTY_MAX_CONNECTIONS, Configuration::asInteger, null); From 8c7bea2530d72571bdc1da66969b9172cea7423e Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Tue, 26 Mar 2024 07:10:00 +0100 Subject: [PATCH 7/7] Extracted constant values, more clean ups --- .../java/org/exist/util/Configuration.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/exist-core/src/main/java/org/exist/util/Configuration.java b/exist-core/src/main/java/org/exist/util/Configuration.java index 672ec76d922..ab0e90814f3 100644 --- a/exist-core/src/main/java/org/exist/util/Configuration.java +++ b/exist-core/src/main/java/org/exist/util/Configuration.java @@ -80,7 +80,6 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import javax.annotation.Nullable; @@ -241,6 +240,7 @@ public class Configuration implements ErrorHandler { private static final String XQUERY_BUILTIN_MODULES_CONFIGURATION_MODULE_ELEMENT_NAME = "module"; private static final String CANNOT_CONVERT_VALUE_TO_INTEGER = "Cannot convert {} value to integer: {}"; private static final String ORG_EXIST_STORAGE_STARTUP_TRIGGER = "org.exist.storage.StartupTrigger"; + private static final String ERROR_READING_CONFIGURATION_FILE_LINE = "Error occurred while reading configuration file [line: {}]:{}"; private final Map config = new HashMap<>(); //Configuration @@ -425,6 +425,7 @@ public static boolean parseBoolean(@Nullable final String value, final boolean d return booleanValue.booleanValue(); } + @Nullable private static Boolean asBoolean(@Nullable final String value) { if (value != null) { return Boolean.valueOf("yes".equalsIgnoreCase(value) || "true".equalsIgnoreCase(value)); @@ -432,6 +433,7 @@ private static Boolean asBoolean(@Nullable final String value) { return null; } + @Nullable private static Integer asInteger(@Nullable final String value) { if (value != null) { try { @@ -443,6 +445,7 @@ private static Integer asInteger(@Nullable final String value) { return null; } + @Nullable private static Long asLong(@Nullable final String value) { if (value != null) { try { @@ -1079,11 +1082,8 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio } // Initialize trigger configuration - List startupTriggers = (List) config.get(PROPERTY_STARTUP_TRIGGERS); - if (startupTriggers == null) { - startupTriggers = new ArrayList<>(); - setProperty(PROPERTY_STARTUP_TRIGGERS, startupTriggers); - } + var startupTriggers = (List) config + .computeIfAbsent(PROPERTY_STARTUP_TRIGGERS, key -> new ArrayList()); // Iterate over elements for (int i = 0; i < nlTrigger.getLength(); i++) { @@ -1094,15 +1094,9 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio // Get @class final String startupTriggerClass = trigger.getAttribute("class"); - boolean isStartupTrigger = false; try { // Verify if class is StartupTrigger - for (final Class iface : Class.forName(startupTriggerClass).getInterfaces()) { - if (ORG_EXIST_STORAGE_STARTUP_TRIGGER.equals(iface.getName())) { - isStartupTrigger = true; - break; - } - } + final boolean isStartupTrigger = isStartupTrigger(startupTriggerClass); // if it actually is a StartupTrigger if (isStartupTrigger) { @@ -1126,6 +1120,15 @@ private void configureStartup(final Element startup) throws DatabaseConfiguratio }); } + private static boolean isStartupTrigger(String startupTriggerClass) throws ClassNotFoundException { + for (final Class iface : Class.forName(startupTriggerClass).getInterfaces()) { + if (ORG_EXIST_STORAGE_STARTUP_TRIGGER.equals(iface.getName())) { + return true; + } + } + return false; + } + private void configurePool(final Element pool) { configureProperty(pool, MIN_CONNECTIONS_ATTRIBUTE, PROPERTY_MIN_CONNECTIONS, Configuration::asInteger, null); configureProperty(pool, MAX_CONNECTIONS_ATTRIBUTE, PROPERTY_MAX_CONNECTIONS, Configuration::asInteger, null); @@ -1328,11 +1331,11 @@ private void configureProperty(final Element element, final String attributeName */ private String getAttributeSystemPropertyName(Element element, String attributeName) { final StringBuilder property = new StringBuilder(attributeName); - Node parent = element.getParentNode(); property.insert(0, "."); property.insert(0, element.getLocalName()); + Node parent = element.getParentNode(); while (parent instanceof Element) { final String parentName = parent.getLocalName(); @@ -1382,7 +1385,7 @@ public int getInteger(final String name) { public int getInteger(final String name, final int defaultValue) { return Optional.ofNullable(getProperty(name)) - .filter(v -> v instanceof Integer) + .filter(Integer.class::isInstance) .map(v -> (int) v) .orElse(defaultValue); } @@ -1396,8 +1399,7 @@ public int getInteger(final String name, final int defaultValue) { */ @Override public void error(SAXParseException exception) throws SAXException { - LOG.error("error occurred while reading configuration file [line: {}]:{}", - exception.getLineNumber(), exception.getMessage(), exception); + LOG.error(ERROR_READING_CONFIGURATION_FILE_LINE, exception.getLineNumber(), exception.getMessage(), exception); } /** @@ -1409,8 +1411,7 @@ public void error(SAXParseException exception) throws SAXException { */ @Override public void fatalError(SAXParseException exception) throws SAXException { - LOG.error("error occurred while reading configuration file [line: {}]:{}", - exception.getLineNumber(), exception.getMessage(), exception); + LOG.error(ERROR_READING_CONFIGURATION_FILE_LINE, exception.getLineNumber(), exception.getMessage(), exception); } /** @@ -1422,8 +1423,7 @@ public void fatalError(SAXParseException exception) throws SAXException { */ @Override public void warning(SAXParseException exception) throws SAXException { - LOG.error("error occurred while reading configuration file [line: {}]:{}", - exception.getLineNumber(), exception.getMessage(), exception); + LOG.error(ERROR_READING_CONFIGURATION_FILE_LINE, exception.getLineNumber(), exception.getMessage(), exception); } public record StartupTriggerConfig(String clazz, Map> params) {