/* * 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 org.apache.sling.resourceresolver.impl.mapping.MapEntries; import org.osgi.service.metatype.annotations.AttributeDefinition; import org.osgi.service.metatype.annotations.ObjectClassDefinition; @ObjectClassDefinition(name = "Apache Sling Resource Resolver Factory", description = "Configures the Resource Resolver for request URL and resource path rewriting.") public @interface ResourceResolverFactoryConfig { String LEGACY_REQUIRED_PROVIDER_PID = "org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory"; String REQUIRED_PROVIDER_NAME = "JCR"; @AttributeDefinition(name = "Resource Search Path", description = "The list of absolute path prefixes " + "applied to find resources whose path is just specified with a relative path. " + "The default value is [ \"/apps\", \"/libs\" ]. If an empty path is specified a " + "single entry path of [ \"/\" ] is assumed.") String[] resource_resolver_searchpath() default {"/apps", "/libs"}; /** * Defines whether namespace prefixes of resource names inside the path * (e.g. <code>jcr:</code> in <code>/home/path/jcr:content</code>) are * mangled or not. * <p> * Mangling means that any namespace prefix contained in the path is replaced as per the generic * substitution pattern <code>/([^:]+):/_$1_/</code> when calling the <code>map</code> method of * the resource resolver. Likewise the <code>resolve</code> methods will unmangle such namespace * prefixes according to the substitution pattern <code>/_([^_]+)_/$1:/</code>. * <p> * This feature is provided since there may be systems out there in the wild which cannot cope * with URLs containing colons, even though they are perfectly valid characters in the path part * of URI references with a scheme. * <p> * The default value of this property if no configuration is provided is <code>true</code>. * */ @AttributeDefinition(name = "Namespace Mangling", description = "Defines whether namespace " + "prefixes of resource names inside the path (e.g. \"jcr:\" in \"/home/path/jcr:content\") " + "are mangled or not. Mangling means that any namespace prefix contained in the " + "path is replaced as per the generic substitution pattern \"/([^:]+):/_$1_/\" " + "when calling the \"map\" method of the resource resolver. Likewise the " + "\"resolve\" methods will unmangle such namespace prefixes according to the " + "substituation pattern \"/_([^_]+)_/$1:/\". This feature is provided since " + "there may be systems out there in the wild which cannot cope with URLs " + "containing colons, even though they are perfectly valid characters in the " + "path part of URI references with a scheme. The default value of this property " + "if no configuration is provided is \"true\".") boolean resource_resolver_manglenamespaces() default true; @AttributeDefinition(name = "Allow Direct Mapping", description = "Whether to add a direct URL mapping to the front of the mapping list.") boolean resource_resolver_allowDirect() default true; @AttributeDefinition(name = "Required Providers (Deprecated)", description = "A resource resolver factory is only " + "available (registered) if all resource providers mentioned in this configuration " + "are available. Each entry is either a service PID or a filter expression. " + "Invalid filters are ignored.") String[] resource_resolver_required_providers(); @AttributeDefinition(name = "Required Providers ", description = "A resource resolver factory is only " + "available (registered) if all resource providers mentioned in this configuration " + "are available. Each entry is refers to the name of a registered provider.") String[] resource_resolver_required_providernames() default {REQUIRED_PROVIDER_NAME}; /** * The resolver.virtual property has no default configuration. But the Sling * maven plugin and the sling management console cannot handle empty * multivalue properties at the moment. So we just add a dummy direct * mapping. */ @AttributeDefinition(name = "Virtual URLs", description = "List of virtual URLs and there mappings to real URLs. " + "Format is <externalURL>:<internalURL>. Mappings are " + "applied on the complete request URL only.") String[] resource_resolver_virtual() default {"/:/"}; @AttributeDefinition(name = "URL Mappings", description = "List of mappings to apply to paths. Incoming mappings are " + "applied to request paths to map to resource paths, " + "outgoing mappings are applied to map resource paths to paths used on subsequent " + "requests. Form is <internalPathPrefix><op><externalPathPrefix> where <op> is " + "\">\" for incoming mappings, \"<\" for outgoing mappings and \":\" for mappings " + "applied in both directions. Mappings are applied in configuration order by " + "comparing and replacing URL prefixes. Note: The use of \"-\" as the <op> value " + "indicating a mapping in both directions is deprecated.") String[] resource_resolver_mapping() default {"/:/", "/content/:/", "/system/docroot/:/"}; @AttributeDefinition(name = "Mapping Location", description = "The path to the root of the configuration to setup and configure " + "the ResourceResolver mapping. The default value is /etc/map.") String resource_resolver_map_location() default MapEntries.DEFAULT_MAP_ROOT; @AttributeDefinition(name = "Mapping Observation", description = "The paths where vanity paths or aliases can be found. These paths are used to " + "listen for resource events.") String[] resource_resolver_map_observation() default "/"; @AttributeDefinition(name = "Default Vanity Path Redirect Status", description = "The default status code used when a sling:vanityPath is configured to redirect " + "and does not have a specific status code associated with it " + "(via a sling:redirectStatus property)") int resource_resolver_default_vanity_redirect_status() default MapEntries.DEFAULT_DEFAULT_VANITY_PATH_REDIRECT_STATUS; @AttributeDefinition(name = "Enable Vanity Paths", description = "This flag controls whether all resources with a sling:vanityPath property " + "are processed and added to the mappoing table.") boolean resource_resolver_enable_vanitypath() default true; @AttributeDefinition(name = "Maximum number of cached vanity path entries", description = "The maximum number of cached vanity path entries. " + "Default is -1 (no limit)") int resource_resolver_vanitypath_maxEntries() default -1; @AttributeDefinition(name = "Limit the maximum number of cached vanity path entries only at startup", description = "Limit the maximum number of cached vanity path entries only at startup. " + "Default is true") boolean resource_resolver_vanitypath_maxEntries_startup() default true; @AttributeDefinition(name = "Maximum number of vanity bloom filter bytes", description = "The maximum number of vanity bloom filter bytes. " + "Changing this value is subject to vanity bloom filter rebuild") int resource_resolver_vanitypath_bloomfilter_maxBytes() default 1024000; @AttributeDefinition(name = "Optimize alias resolution", description ="This flag controls whether to optimize" + " the alias resolution by creating an internal cache of aliases. This might have an impact on the startup time"+ " and on the alias update time if the number of aliases is huge (over 10000).") boolean resource_resolver_optimize_alias_resolution() default true; @AttributeDefinition(name = "Allowed Vanity Path Location", description ="This setting can contain a list of path prefixes, e.g. /libs/, /content/. If " + "such a list is configured, only vanity paths from resources starting with this prefix " + " are considered. If the list is empty, all vanity paths are used.") String[] resource_resolver_vanitypath_whitelist(); @AttributeDefinition(name = "Denied Vanity Path Location", description ="This setting can contain a list of path prefixes, e.g. /misc/. If " + "such a list is configured,vanity paths from resources starting with this prefix " + " are not considered. If the list is empty, all vanity paths are used.") String[] resource_resolver_vanitypath_blacklist(); @AttributeDefinition(name = "Vanity Path Precedence", description ="This flag controls whether vanity paths" + " will have precedence over existing /etc/map mapping") boolean resource_resolver_vanity_precedence() default false; @AttributeDefinition(name = "Paranoid Provider Handling", description = "If this flag is enabled, an unregistration of a resource provider (not factory), " + "is causing the resource resolver factory to restart, potentially cleaning up " + "for memory leaks caused by objects hold from that resource provider.") boolean resource_resolver_providerhandling_paranoid() default false; @AttributeDefinition(name = "Log resource resolver closing", description = "When enabled CRUD operations with a closed resource resolver will log a stack trace " + "with the point where the used resolver was closed. It's advisable to not enable this feature on " + "production systems.") boolean resource_resolver_log_closing() default false; @AttributeDefinition(name = "Log unclosed resource resolvers", description = "When enabled unclosed resource resolvers will be logged. Not closing " + "a resource resolver is a bug in the code using the resolver and should be fixed.") boolean resource_resolver_log_unclosed() default true; }