You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "cziegeler (via GitHub)" <gi...@apache.org> on 2023/06/03 09:10:53 UTC

[GitHub] [sling-org-apache-sling-resourceresolver] cziegeler opened a new pull request, #97: Issues/sling 11742

cziegeler opened a new pull request, #97:
URL: https://github.com/apache/sling-org-apache-sling-resourceresolver/pull/97

   This is an updated version of #89 , incorporating all the suggestions we did there


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@sling.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [sling-org-apache-sling-resourceresolver] cziegeler merged pull request #97: Issues/sling 11742

Posted by "cziegeler (via GitHub)" <gi...@apache.org>.
cziegeler merged PR #97:
URL: https://github.com/apache/sling-org-apache-sling-resourceresolver/pull/97


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@sling.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [sling-org-apache-sling-resourceresolver] jsedding commented on a diff in pull request #97: Issues/sling 11742

Posted by "jsedding (via GitHub)" <gi...@apache.org>.
jsedding commented on code in PR #97:
URL: https://github.com/apache/sling-org-apache-sling-resourceresolver/pull/97#discussion_r1221565468


##########
src/main/java/org/apache/sling/resourceresolver/impl/VanityPathConfigurer.java:
##########
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resourceresolver.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.VanityPathConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class VanityPathConfigurer {

Review Comment:
   Why not `VanityPathConfiguration` or `AggregateVanityPathConfiguration`? `Configurer` sounds like it sets the configuration (at least it does to me), which it doesn't. It only provides an aggregated view of the configuration that is already set.



##########
src/main/java/org/apache/sling/resourceresolver/impl/VanityPathConfigurer.java:
##########
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resourceresolver.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.VanityPathConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class VanityPathConfigurer {
+
+    public @interface DeprecatedVanityConfig {
+
+        /** This is the deprecated fallback configuration for resource_resolver_vanitypath_allowlist() */
+        String[] resource_resolver_vanitypath_whitelist();
+
+        /** This is the deprecated fallback configuration for resource_resolver_vanitypath_denylist() */
+        String[] resource_resolver_vanitypath_blacklist();
+    }
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private volatile ResourceResolverFactoryConfig config;
+
+    private volatile List<VanityPathConfig> vanityPathConfig;
+
+    public void setConfiguration(final ResourceResolverFactoryConfig c, final DeprecatedVanityConfig deprecatedConfig) {
+        this.config = c;
+        this.vanityPathConfig = null;
+
+        final List<String> includes = this.configureVanityPathPrefixes(c.resource_resolver_vanitypath_allowlist(),
+            deprecatedConfig == null ? null : deprecatedConfig.resource_resolver_vanitypath_whitelist(),
+            "resource.resolver.vanitypath.allowlist",
+            "resource.resolver.vanitypath.whitelist");
+
+        final List<String> excludes = this.configureVanityPathPrefixes(c.resource_resolver_vanitypath_denylist(),
+            deprecatedConfig == null ? null : deprecatedConfig.resource_resolver_vanitypath_blacklist(),
+            "resource.resolver.vanitypath.denylist",
+            "resource.resolver.vanitypath.blacklist");
+        if ( includes != null || excludes != null ) {
+            this.vanityPathConfig = new ArrayList<>();
+            if ( includes != null ) {
+                for(final String val : includes) {
+                    this.vanityPathConfig.add(new VanityPathConfig(val, false));
+                }
+            }
+            if ( excludes != null ) {
+                for(final String val : excludes) {
+                    this.vanityPathConfig.add(new VanityPathConfig(val, true));
+                }
+            }
+            Collections.sort(this.vanityPathConfig);
+        }
+    }
+
+    public int getDefaultVanityPathRedirectStatus() {
+        return config.resource_resolver_default_vanity_redirect_status();
+    }
+
+    public boolean isVanityPathEnabled() {
+        return this.config.resource_resolver_enable_vanitypath();
+    }
+
+    public boolean isVanityPathCacheInitInBackground() {
+        return this.config.resource_resolver_vanitypath_cache_in_background();
+    }
+
+    public List<VanityPathConfig> getVanityPathConfig() {
+        return this.vanityPathConfig;
+    }
+
+
+    public boolean hasVanityPathPrecedence() {
+        return this.config.resource_resolver_vanity_precedence();
+    }
+
+    public long getMaxCachedVanityPathEntries() {
+        return this.config.resource_resolver_vanitypath_maxEntries();
+    }
+
+    public boolean isMaxCachedVanityPathEntriesStartup() {
+        return this.config.resource_resolver_vanitypath_maxEntries_startup();
+    }
+
+    public int getVanityBloomFilterMaxBytes() {
+        return this.config.resource_resolver_vanitypath_bloomfilter_maxBytes();
+    }
+
+    private boolean isDefined(final String[] value) {
+        return value != null && value.length > 0;
+    }
+
+    List<String> configureVanityPathPrefixes(final String[] pathPrefixes, final String[] pathPrefixesFallback,
+                                     String pathPrefixesPropertyName, String pathPrefixesFallbackPropertyName) {
+        if (isDefined(pathPrefixes) && isDefined(pathPrefixesFallback) ) {
+            logger.error("Both properties, " + pathPrefixesPropertyName + " and " + pathPrefixesFallbackPropertyName
+                + ", were defined. Using " + pathPrefixesPropertyName + " for configuring vanity paths. "
+                + "Please remove the other property from your configuration.");

Review Comment:
   ```suggestion
               logger.error("Both properties, \"{}\" and the deprecated \"{}\""
                   + ", were defined. Using \"{}\" for configuring vanity paths. "
                   + "Please remove the other property from your configuration.", pathPrefixesPropertyName, pathPrefixesFallbackPropertyName, pathPrefixesPropertyName);
   ```



##########
src/main/java/org/apache/sling/resourceresolver/impl/VanityPathConfigurer.java:
##########
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resourceresolver.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.VanityPathConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class VanityPathConfigurer {
+
+    public @interface DeprecatedVanityConfig {
+
+        /** This is the deprecated fallback configuration for resource_resolver_vanitypath_allowlist() */
+        String[] resource_resolver_vanitypath_whitelist();
+
+        /** This is the deprecated fallback configuration for resource_resolver_vanitypath_denylist() */
+        String[] resource_resolver_vanitypath_blacklist();
+    }
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private volatile ResourceResolverFactoryConfig config;
+
+    private volatile List<VanityPathConfig> vanityPathConfig;
+
+    public void setConfiguration(final ResourceResolverFactoryConfig c, final DeprecatedVanityConfig deprecatedConfig) {
+        this.config = c;
+        this.vanityPathConfig = null;
+
+        final List<String> includes = this.configureVanityPathPrefixes(c.resource_resolver_vanitypath_allowlist(),
+            deprecatedConfig == null ? null : deprecatedConfig.resource_resolver_vanitypath_whitelist(),
+            "resource.resolver.vanitypath.allowlist",
+            "resource.resolver.vanitypath.whitelist");
+
+        final List<String> excludes = this.configureVanityPathPrefixes(c.resource_resolver_vanitypath_denylist(),
+            deprecatedConfig == null ? null : deprecatedConfig.resource_resolver_vanitypath_blacklist(),
+            "resource.resolver.vanitypath.denylist",
+            "resource.resolver.vanitypath.blacklist");
+        if ( includes != null || excludes != null ) {
+            this.vanityPathConfig = new ArrayList<>();
+            if ( includes != null ) {
+                for(final String val : includes) {
+                    this.vanityPathConfig.add(new VanityPathConfig(val, false));
+                }
+            }
+            if ( excludes != null ) {
+                for(final String val : excludes) {
+                    this.vanityPathConfig.add(new VanityPathConfig(val, true));
+                }
+            }
+            Collections.sort(this.vanityPathConfig);
+        }
+    }
+
+    public int getDefaultVanityPathRedirectStatus() {
+        return config.resource_resolver_default_vanity_redirect_status();
+    }
+
+    public boolean isVanityPathEnabled() {
+        return this.config.resource_resolver_enable_vanitypath();
+    }
+
+    public boolean isVanityPathCacheInitInBackground() {
+        return this.config.resource_resolver_vanitypath_cache_in_background();
+    }
+
+    public List<VanityPathConfig> getVanityPathConfig() {
+        return this.vanityPathConfig;
+    }
+
+
+    public boolean hasVanityPathPrecedence() {
+        return this.config.resource_resolver_vanity_precedence();
+    }
+
+    public long getMaxCachedVanityPathEntries() {
+        return this.config.resource_resolver_vanitypath_maxEntries();
+    }
+
+    public boolean isMaxCachedVanityPathEntriesStartup() {
+        return this.config.resource_resolver_vanitypath_maxEntries_startup();
+    }
+
+    public int getVanityBloomFilterMaxBytes() {
+        return this.config.resource_resolver_vanitypath_bloomfilter_maxBytes();
+    }
+
+    private boolean isDefined(final String[] value) {
+        return value != null && value.length > 0;
+    }
+
+    List<String> configureVanityPathPrefixes(final String[] pathPrefixes, final String[] pathPrefixesFallback,
+                                     String pathPrefixesPropertyName, String pathPrefixesFallbackPropertyName) {
+        if (isDefined(pathPrefixes) && isDefined(pathPrefixesFallback) ) {
+            logger.error("Both properties, " + pathPrefixesPropertyName + " and " + pathPrefixesFallbackPropertyName
+                + ", were defined. Using " + pathPrefixesPropertyName + " for configuring vanity paths. "
+                + "Please remove the other property from your configuration.");
+            return filterVanityPathPrefixes(pathPrefixes);
+        } else if (isDefined(pathPrefixes)) {
+            return filterVanityPathPrefixes(pathPrefixes);
+        } else if (isDefined(pathPrefixesFallback)) {
+            logger.warn("The property " + pathPrefixesPropertyName + " was not set. Using the " +
+                pathPrefixesFallbackPropertyName + " instead. Please update your configuration to use " + pathPrefixesPropertyName);

Review Comment:
   ```suggestion
               logger.warn("The property \"{}\" was not set. Using the deprecated property \"{}\""
                    + " instead. Please update your configuration to use \"{}\".", pathPrefixesPropertyName, pathPrefixesFallbackPropertyName, pathPrefixesPropertyName);
   ```



##########
src/main/java/org/apache/sling/resourceresolver/impl/VanityPathConfigurer.java:
##########
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resourceresolver.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.VanityPathConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class VanityPathConfigurer {
+
+    public @interface DeprecatedVanityConfig {
+
+        /** This is the deprecated fallback configuration for resource_resolver_vanitypath_allowlist() */
+        String[] resource_resolver_vanitypath_whitelist();
+
+        /** This is the deprecated fallback configuration for resource_resolver_vanitypath_denylist() */
+        String[] resource_resolver_vanitypath_blacklist();
+    }
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private volatile ResourceResolverFactoryConfig config;
+
+    private volatile List<VanityPathConfig> vanityPathConfig;
+
+    public void setConfiguration(final ResourceResolverFactoryConfig c, final DeprecatedVanityConfig deprecatedConfig) {
+        this.config = c;
+        this.vanityPathConfig = null;
+
+        final List<String> includes = this.configureVanityPathPrefixes(c.resource_resolver_vanitypath_allowlist(),
+            deprecatedConfig == null ? null : deprecatedConfig.resource_resolver_vanitypath_whitelist(),
+            "resource.resolver.vanitypath.allowlist",
+            "resource.resolver.vanitypath.whitelist");
+
+        final List<String> excludes = this.configureVanityPathPrefixes(c.resource_resolver_vanitypath_denylist(),
+            deprecatedConfig == null ? null : deprecatedConfig.resource_resolver_vanitypath_blacklist(),
+            "resource.resolver.vanitypath.denylist",
+            "resource.resolver.vanitypath.blacklist");
+        if ( includes != null || excludes != null ) {
+            this.vanityPathConfig = new ArrayList<>();
+            if ( includes != null ) {
+                for(final String val : includes) {
+                    this.vanityPathConfig.add(new VanityPathConfig(val, false));
+                }
+            }
+            if ( excludes != null ) {
+                for(final String val : excludes) {
+                    this.vanityPathConfig.add(new VanityPathConfig(val, true));
+                }
+            }
+            Collections.sort(this.vanityPathConfig);
+        }
+    }
+
+    public int getDefaultVanityPathRedirectStatus() {
+        return config.resource_resolver_default_vanity_redirect_status();
+    }
+
+    public boolean isVanityPathEnabled() {
+        return this.config.resource_resolver_enable_vanitypath();
+    }
+
+    public boolean isVanityPathCacheInitInBackground() {
+        return this.config.resource_resolver_vanitypath_cache_in_background();
+    }
+
+    public List<VanityPathConfig> getVanityPathConfig() {
+        return this.vanityPathConfig;
+    }
+
+
+    public boolean hasVanityPathPrecedence() {
+        return this.config.resource_resolver_vanity_precedence();
+    }
+
+    public long getMaxCachedVanityPathEntries() {
+        return this.config.resource_resolver_vanitypath_maxEntries();
+    }
+
+    public boolean isMaxCachedVanityPathEntriesStartup() {
+        return this.config.resource_resolver_vanitypath_maxEntries_startup();
+    }
+
+    public int getVanityBloomFilterMaxBytes() {
+        return this.config.resource_resolver_vanitypath_bloomfilter_maxBytes();
+    }
+
+    private boolean isDefined(final String[] value) {
+        return value != null && value.length > 0;
+    }
+
+    List<String> configureVanityPathPrefixes(final String[] pathPrefixes, final String[] pathPrefixesFallback,
+                                     String pathPrefixesPropertyName, String pathPrefixesFallbackPropertyName) {
+        if (isDefined(pathPrefixes) && isDefined(pathPrefixesFallback) ) {
+            logger.error("Both properties, " + pathPrefixesPropertyName + " and " + pathPrefixesFallbackPropertyName
+                + ", were defined. Using " + pathPrefixesPropertyName + " for configuring vanity paths. "
+                + "Please remove the other property from your configuration.");
+            return filterVanityPathPrefixes(pathPrefixes);
+        } else if (isDefined(pathPrefixes)) {
+            return filterVanityPathPrefixes(pathPrefixes);
+        } else if (isDefined(pathPrefixesFallback)) {
+            logger.warn("The property " + pathPrefixesPropertyName + " was not set. Using the " +
+                pathPrefixesFallbackPropertyName + " instead. Please update your configuration to use " + pathPrefixesPropertyName);
+            return filterVanityPathPrefixes(pathPrefixesFallback);
+        }
+        return null;
+    }
+
+    private static List<String> filterVanityPathPrefixes(final String[] vanityPathPrefixes) {
+        final List<String> prefixList = new ArrayList<>();
+        for (final String value : vanityPathPrefixes) {
+            if (value.trim().length() > 0) {
+                if (value.trim().endsWith("/")) {
+                    prefixList.add(value.trim());
+                } else {
+                    prefixList.add(value.trim().concat("/"));
+                }
+            }
+        }
+        return prefixList.isEmpty() ? null : prefixList;

Review Comment:
   I bet this could look nicer with `Stream`s and `Optional`! But, of course, that's a matter of taste.



##########
src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java:
##########
@@ -256,13 +225,20 @@ public Path[] getObservationPaths() {
         return this.observationPaths;
     }
 
+    public VanityPathConfigurer getVanityPathConfigurer() {
+        return this.vanityPathConfigurer;
+    }
+
     // ---------- SCR Integration ---------------------------------------------
 
     /**
      * Activates this component (called by SCR before)
      */
     @Activate
-    protected void activate(final BundleContext bundleContext, final ResourceResolverFactoryConfig config) {
+    protected void activate(final BundleContext bundleContext, 
+        final ResourceResolverFactoryConfig config,
+        final VanityPathConfigurer.DeprecatedVanityConfig deprecatedVanityConfig) {

Review Comment:
   +1 - I like the second annotation-class being injected. It's a creative, and not entirely obvious, application of the spec. Also, it saves us from clumsily dealing with maps.



##########
src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java:
##########
@@ -145,6 +145,11 @@ private static final class FactoryRegistration {
     /** Factory registration. */
     private volatile FactoryRegistration factoryRegistration;
 
+    private final VanityPathConfigurer vanityPathConfigurer = new VanityPathConfigurer();

Review Comment:
   Why don't we make this a volatile field and `VanityPathConfigurer` (or preferably  `VanityPathConfiguration`) immutable?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@sling.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [sling-org-apache-sling-resourceresolver] sonarcloud[bot] commented on pull request #97: Issues/sling 11742

Posted by "sonarcloud[bot] (via GitHub)" <gi...@apache.org>.
sonarcloud[bot] commented on PR #97:
URL: https://github.com/apache/sling-org-apache-sling-resourceresolver/pull/97#issuecomment-1717470972

   SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97)
   
   [![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=BUG) [![B](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/B-16px.png 'B')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=BUG) [2 Bugs](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=BUG)  
   [![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=VULNERABILITY)  
   [![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=SECURITY_HOTSPOT)  
   [![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=CODE_SMELL) [10 Code Smells](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=CODE_SMELL)
   
   [![69.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '69.1%')](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_coverage&view=list) [69.1% Coverage](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_coverage&view=list)  
   [![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_duplicated_lines_density&view=list)
   
   
   
   ![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@sling.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [sling-org-apache-sling-resourceresolver] sonarcloud[bot] commented on pull request #97: Issues/sling 11742

Posted by "sonarcloud[bot] (via GitHub)" <gi...@apache.org>.
sonarcloud[bot] commented on PR #97:
URL: https://github.com/apache/sling-org-apache-sling-resourceresolver/pull/97#issuecomment-1712791958

   SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97)
   
   [![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=BUG) [![B](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/B-16px.png 'B')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=BUG) [2 Bugs](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=BUG)  
   [![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=VULNERABILITY)  
   [![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=SECURITY_HOTSPOT)  
   [![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=CODE_SMELL) [10 Code Smells](https://sonarcloud.io/project/issues?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&resolved=false&types=CODE_SMELL)
   
   [![69.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/60-16px.png '69.1%')](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_coverage&view=list) [69.1% Coverage](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_coverage&view=list)  
   [![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=apache_sling-org-apache-sling-resourceresolver&pullRequest=97&metric=new_duplicated_lines_density&view=list)
   
   
   
   ![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@sling.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org