Class ResourceProvider<T>
- java.lang.Object
-
- org.apache.sling.spi.resource.provider.ResourceProvider<T>
-
@ConsumerType public abstract class ResourceProvider<T> extends Object
API for providers of resources. Used by theResourceResolverto transparently access resources from different locations such as a JCR repository, a database, or bundle resources.This extension point is defined by an abstract class (in contrast to an interface) as this allows to add new functionality in new versions without breaking any implementation.
This service is intended to be implemented by providers of resource instances on behalf of the
ResourceResolver. It is not intended to be used by client applications directly. A resource provider implements this service by extending this class.A resource provider must set the
PROPERTY_ROOTproperty with an absolute path. This is the mount point of the resource provider. If there is more than one provider registering for the same root, only the one with the highest service ranking is used.If a provider is used in the resource tree, it gets activated through a call of the
start(ProviderContext)method. If the provider is not used anymore within the resource tree, thestop()method is called. Whenever information concerning the provider is changed while the provider is used, theupdate(long)method is called. The provider context instance which is passed to thestart(ProviderContext)method contains the updated state.Some resource providers might require (user) authentication. For example the JCR resource provider uses authenticated sessions. If a provider requires authentication it must indicate this by setting the service registration property
PROPERTY_AUTHENTICATEto eitherAUTHENTICATE_LAZYorAUTHENTICATE_REQUIRED. In these cases, the resource resolver callsauthenticate(Map)and on successful authentication the provider returns a state object for the current user. This object is passed into the provider with every method throughResolveContext.getProviderState(). If a provider requires authentication, thelogout(Object)method is called, when the resource resolver is closed. If the provider does not set this service property or sets it toAUTHENTICATE_NOtheauthenticate(Map)andlogout(Object)method are never called and thereforeResolveContext.getProviderState()will returnnull.Each method gets the
ResourceContextwhich gives access to further functionality.- Since:
- 1.0.0 (Sling API Bundle 2.11.0)
-
-
Field Summary
Fields Modifier and Type Field Description static StringAUTH_ADMINThe authentication information property indicating to use an administrative login.static StringAUTH_CLONEThe authentication information property indicating that an existing resource resolver is being cloned.static StringAUTH_SERVICE_BUNDLEThe authentication information property referring to the bundle providing a service for which a resource provider is to be retrieved.static StringAUTHENTICATE_LAZYValue forPROPERTY_AUTHENTICATEindicating authentication is needed and will be done on demand.static StringAUTHENTICATE_NODefault value forPROPERTY_AUTHENTICATEstatic StringAUTHENTICATE_REQUIREDValue forPROPERTY_AUTHENTICATEindicating authentication is required.static StringPROPERTY_ADAPTABLEIf this flag is set totrue, the resource resolver will use this provider for the adaptTo() operation.static StringPROPERTY_ATTRIBUTABLEIf this flag is set totrue, the resource resolver will try to get the attribute names and the attribute values from this provider.static StringPROPERTY_AUTHENTICATEIf a resource provider needs the user to be authenticated this property must be set to eitherAUTHENTICATE_LAZYorAUTHENTICATE_REQUIRED.static StringPROPERTY_MODIFIABLEA modifiable resource provider is capable of creating, changing and deleting resources.static StringPROPERTY_NAMEOptional service registration property setting a name for the provider.static StringPROPERTY_REFRESHABLEIf this flag is set totrue, the resource resolver will callrefresh(ResolveContext)when it's refreshed itself.static StringPROPERTY_ROOTThe name of the service registration property containing the root path of the resources provided by this provider.static StringPROPERTY_USE_RESOURCE_ACCESS_SECURITYThe name of the service registration property containing a boolean flag indicating if the ResourceAccessSecurity service should be used for this provider or not.static StringRESOURCE_TYPE_SYNTHETICThe resource type be set on resources returned by thelistChildren(ResolveContext, Resource)method to enable traversing the resource tree down to a deeply nested provided resource which has no concrete parent hierarchy (value is"sling:syntheticResourceProviderResource").
-
Constructor Summary
Constructors Constructor Description ResourceProvider()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description <AdapterType>
AdapterTypeadaptTo(@NotNull ResolveContext<T> ctx, @NotNull Class<AdapterType> type)Adapts the provider to another type.Tauthenticate(@NotNull Map<String,Object> authenticationInfo)Authenticate against the resource provider.voidcommit(@NotNull ResolveContext<T> ctx)Commit all transient changes: create, delete and updatesbooleancopy(@NotNull ResolveContext<T> ctx, @NotNull String srcAbsPath, @NotNull String destAbsPath)This method copies the subgraph rooted at, and including, the resource atsrcAbsPathto the new location atdestAbsPathand adds it as a child node of the resource atdestAbsPath.@NotNull Resourcecreate(@NotNull ResolveContext<T> ctx, String path, Map<String,Object> properties)Create a new resource at the given path.voiddelete(@NotNull ResolveContext<T> ctx, @NotNull Resource resource)Delete the resource at the given path.@Nullable ObjectgetAttribute(@NotNull ResolveContext<T> ctx, @NotNull String name)Returns the value of the given resource provider attribute ornullif the attribute is not set or not visible (as e.g.@Nullable Collection<String>getAttributeNames(@NotNull ResolveContext<T> ctx)Returns a collection of attribute names whose value can be retrieved calling thegetAttribute(ResolveContext, String)method.@Nullable ResourcegetParent(@NotNull ResolveContext<T> ctx, @NotNull Resource child)Returns the parent resource from this resource provider ornullif the resource provider cannot find it.protected @Nullable ProviderContextgetProviderContext()Get the current provider context.@Nullable QueryLanguageProvider<T>getQueryLanguageProvider()Get the optional query language provider.abstract @Nullable ResourcegetResource(@NotNull ResolveContext<T> ctx, @NotNull String path, @NotNull ResourceContext resourceContext, @Nullable Resource parent)Returns a resource from this resource provider ornullif the resource provider cannot find it.booleanhasChanges(@NotNull ResolveContext<T> ctx)Are there any transient changes?booleanisLive(@NotNull ResolveContext<T> ctx)Returnstrueif this resource provider has not been closed yet and can still be used.abstract @Nullable Iterator<Resource>listChildren(@NotNull ResolveContext<T> ctx, @NotNull Resource parent)voidlogout(T state)If the provider requires authentication, this method is called with the state of the user returned byauthenticate(Map)once the resource resolver is closed.booleanmove(@NotNull ResolveContext<T> ctx, @NotNull String srcAbsPath, @NotNull String destAbsPath)This method moves the subgraph rooted at, and including, the resource atsrcAbsPathto the new location atdestAbsPathand adds it as a child node of the resource atdestAbsPath.voidrefresh(@NotNull ResolveContext<T> ctx)The provider is updated to reflect the latest state.voidrevert(@NotNull ResolveContext<T> ctx)Revert all transient changes: create, delete and updates.voidstart(@NotNull ProviderContext ctx)With a call to this method, the provider implementation is notified that it is used in the resource tree.voidstop()With a call to this method, the provider implementation is notified that it is not used anymore in the resource tree.voidupdate(long changeSet)With a call to this method, the provider implementation is notified that any information regarding the registration of the provider has changed.
-
-
-
Field Detail
-
PROPERTY_ROOT
public static final String PROPERTY_ROOT
The name of the service registration property containing the root path of the resources provided by this provider. If this property is missing, empty or invalid, the provider is ignored. (value is "provider.root")- See Also:
- Constant Field Values
-
PROPERTY_NAME
public static final String PROPERTY_NAME
Optional service registration property setting a name for the provider. The name must not be unique. The name in combination with the root can be used to identify a resource provider.- See Also:
- Constant Field Values
-
PROPERTY_USE_RESOURCE_ACCESS_SECURITY
public static final String PROPERTY_USE_RESOURCE_ACCESS_SECURITY
The name of the service registration property containing a boolean flag indicating if the ResourceAccessSecurity service should be used for this provider or not. ResourceAccessSecurity should only be used if the underlying storage does not provide access control The default for this value isfalse. (value is "provider.useResourceAccessSecurity")- See Also:
- Constant Field Values
-
AUTHENTICATE_NO
public static final String AUTHENTICATE_NO
Default value forPROPERTY_AUTHENTICATE- See Also:
PROPERTY_AUTHENTICATE, Constant Field Values
-
AUTHENTICATE_REQUIRED
public static final String AUTHENTICATE_REQUIRED
Value forPROPERTY_AUTHENTICATEindicating authentication is required.- See Also:
PROPERTY_AUTHENTICATE, Constant Field Values
-
AUTHENTICATE_LAZY
public static final String AUTHENTICATE_LAZY
Value forPROPERTY_AUTHENTICATEindicating authentication is needed and will be done on demand.- See Also:
PROPERTY_AUTHENTICATE, Constant Field Values
-
PROPERTY_AUTHENTICATE
public static final String PROPERTY_AUTHENTICATE
If a resource provider needs the user to be authenticated this property must be set to eitherAUTHENTICATE_LAZYorAUTHENTICATE_REQUIRED. If it is set toAUTHENTICATE_REQUIRED, theauthenticate(Map)method is called when the resource resolver is created and only if authentication against all resource providers marked as required is successful, a resource resolver is created. Otherwise the creation fails. If a provider sets this property toAUTHENTICATE_LAZY, the authenticate method is only invoked if a resource from this provider is requested. This might also happen for traversal or queries. If the authentication fails, resources from this provider are not accessible. If this property is not set or set toAUTHENTICATE_NO, no authentication is required for this provider and theauthenticate(Map)is never invoked. String service property, default value isAUTHENTICATE_NO. (value is "provider.authenticate")- See Also:
- Constant Field Values
-
PROPERTY_MODIFIABLE
public static final String PROPERTY_MODIFIABLE
A modifiable resource provider is capable of creating, changing and deleting resources. This means the methodscreate(ResolveContext, String, Map),delete(ResolveContext, Resource)and adapting a resource to a modifiable value map is supported. If this flag is set tofalse, the resource resolver does not take this provider into account for modifications and modification operations to this provider always result in an exception. If this is set totrue, the propertyPROPERTY_AUTHENTICATEmust require authentication, otherwise this provider registration is considered invalid and the provider is not used. Boolean service property, default value isfalse. (value is "provider.modifiable")- See Also:
- Constant Field Values
-
PROPERTY_ADAPTABLE
public static final String PROPERTY_ADAPTABLE
If this flag is set totrue, the resource resolver will use this provider for the adaptTo() operation. Boolean service property, default value isfalse. (value is "provider.adaptable")- See Also:
- Constant Field Values
-
PROPERTY_REFRESHABLE
public static final String PROPERTY_REFRESHABLE
If this flag is set totrue, the resource resolver will callrefresh(ResolveContext)when it's refreshed itself. Boolean service property, default value isfalse. (value is "provider.refreshable")- See Also:
- Constant Field Values
-
PROPERTY_ATTRIBUTABLE
public static final String PROPERTY_ATTRIBUTABLE
If this flag is set totrue, the resource resolver will try to get the attribute names and the attribute values from this provider. Boolean service property, default value isfalse. (value is "provider.attributable")- See Also:
- Constant Field Values
-
AUTH_SERVICE_BUNDLE
public static final String AUTH_SERVICE_BUNDLE
The authentication information property referring to the bundle providing a service for which a resource provider is to be retrieved. If this property is provided, theResourceResolverFactory.SUBSERVICEproperty may also be present.ResourceResolverFactoryimplementations must provide this property if their implementation of theResourceResolverFactory.getServiceResourceResolver(Map)method use a resource provider factory.The type of this property, if present, is
org.osgi.framework.Bundle.- See Also:
- Constant Field Values
-
AUTH_ADMIN
public static final String AUTH_ADMIN
The authentication information property indicating to use an administrative login. This property must be set if the resource resolver is created throughResourceResolverFactory.getAdministrativeResourceResolver(Map).- See Also:
- Constant Field Values
-
AUTH_CLONE
public static final String AUTH_CLONE
The authentication information property indicating that an existing resource resolver is being cloned. Providers that receive stateful objects as authentication information must deep-clone those objects when this property is present, to avoid inadvertent state sharing with the existing resolver.- Since:
- 1.2.0
- See Also:
- Constant Field Values
-
RESOURCE_TYPE_SYNTHETIC
public static final String RESOURCE_TYPE_SYNTHETIC
The resource type be set on resources returned by thelistChildren(ResolveContext, Resource)method to enable traversing the resource tree down to a deeply nested provided resource which has no concrete parent hierarchy (value is"sling:syntheticResourceProviderResource").
-
-
Method Detail
-
start
public void start(@NotNull @NotNull ProviderContext ctx)With a call to this method, the provider implementation is notified that it is used in the resource tree.- Parameters:
ctx- The context for this provider.
-
stop
public void stop()
With a call to this method, the provider implementation is notified that it is not used anymore in the resource tree.
-
update
public void update(long changeSet)
With a call to this method, the provider implementation is notified that any information regarding the registration of the provider has changed. For example, observation listeners might have changed. This method is only called while the provider is used in the resource tree.- Parameters:
changeSet- A bit set of provider info that has changed.- See Also:
ProviderContext.OBSERVATION_LISTENER_CHANGED,ProviderContext.EXCLUDED_PATHS_CHANGED
-
getProviderContext
@Nullable protected @Nullable ProviderContext getProviderContext()
Get the current provider context.- Returns:
- The provider context or
nullif the provider is currently not used in the resource tree.
-
authenticate
@Nullable public T authenticate(@NotNull @NotNull Map<String,Object> authenticationInfo) throws LoginException
Authenticate against the resource provider.Returns a provider context object if authentication is successful. The context object is passed to the resource provider in all messages through the
ResourceContext. A valid implementation might returnnullas the context information.If authentication fails a
LoginExceptionmust be thrown.The returned context object grants access to the provided resources with privileges assigned to the service provided by the calling bundle.
The
authenticationInfomap will in general contain the same information as provided to the respectiveResourceResolvermethod. ForThe provided
authenticationInfomap may be used to provide additional information such as theAUTH_SERVICE_BUNDLE. If this property is provided, additional information likeResourceResolverFactory.SUBSERVICEmight be provided, but theResourceResolverFactory.USERandResourceResolverFactory.PASSWORDproperties provided in the map must be ignored.The
ResourceResolverFactory.USER_IMPERSONATIONproperty is obeyed but requires that the authenticated user has permission to impersonate as the requested user. If such permission is missing, aLoginExceptionis thrown.The resource resolver implementation will call the
logout(Object)method once the resource resolver is closed. However, if the resource provider is already unregistered when the resource resolver is closed, logout can't be called. Therefore the returned state object might implementCloseable. In this case close is called on the state object.- Parameters:
authenticationInfo- A map of further credential information which may be used by the implementation to parameterize how the resource resolver is created.- Returns:
- A context data object according to the
authenticationInfo. - Throws:
LoginException- If an error occurs authenticating with the provided credential data.- See Also:
- Service Authentication
-
logout
public void logout(@Nullable T state)If the provider requires authentication, this method is called with the state of the user returned byauthenticate(Map)once the resource resolver is closed.- Parameters:
state- The provider state returned byauthenticate(Map).
-
refresh
public void refresh(@NotNull @NotNull ResolveContext<T> ctx)The provider is updated to reflect the latest state. Resources which have changes pending are not discarded.revert(ResolveContext)can be called to discard changes.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_REFRESHABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.
-
isLive
public boolean isLive(@NotNull @NotNull ResolveContext<T> ctx)Returnstrueif this resource provider has not been closed yet and can still be used.This method will never throw an exception even after the resource provider has been closed
This method is only called for resource providers which have a state and require authentication.
- Parameters:
ctx- TheResolveContext.- Returns:
trueif the resource provider has not been closed yet and is still active.. Once the resource provider has been closed or is not active anymore, this method returnsfalse.
-
getParent
@Nullable public @Nullable Resource getParent(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull Resource child)
Returns the parent resource from this resource provider ornullif the resource provider cannot find it. The resource provider must not return cached instances for a resource as the resource resolver will update the resource meta data of the resource at the end of the resolution process and this meta data might be different depending on the full path of resource resolution passed into the resource resolver.- Parameters:
ctx- TheResolveContext.child- The child resource.- Returns:
nullif this provider does not have a resource for the parent.- Throws:
SlingException- may be thrown in case of any problem creating theResourceinstance.
-
getResource
@Nullable public abstract @Nullable Resource getResource(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull String path, @NotNull @NotNull ResourceContext resourceContext, @Nullable @Nullable Resource parent)
Returns a resource from this resource provider ornullif the resource provider cannot find it. The path must have thePROPERTY_ROOTstrings as its prefix. The resource provider must not return cached instances for a resource as the resource resolver will update the resource meta data of the resource at the end of the resolution process and this meta data might be different depending on the full path of resource resolution passed into the resource resolver.- Parameters:
ctx- TheResolveContext.path- The full path of the resource.resourceContext- Additional information for resolving the resourceparent- Optional parent resource- Returns:
nullIf this provider does not have a resource for the path.- Throws:
SlingException- may be thrown in case of any problem creating theResourceinstance.
-
listChildren
@Nullable public abstract @Nullable Iterator<Resource> listChildren(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull Resource parent)
Returns anIteratorofResourceobjects loaded from the children of the givenResource. The returnedResourceinstances are attached to the sameResourceResolveras the givenparentresource.This method may be called for resource providers whose root path list contains a path such that the resource path is a prefix of the list entry. This allows for the enumeration of deeply nested provided resources for which no actual parent hierarchy exists.
The returned iterator may in turn contain resources which do not actually exist but are required to traverse the resource tree. Such resources SHOULD be
SyntheticResourceobjects whose resource type MUST be set toRESOURCE_TYPE_SYNTHETIC. As withgetResource(ResolveContext, String, ResourceContext, Resource)the returned Resource objects must not be cached objects.- Parameters:
ctx- TheResolveContext.parent- TheResourcewhose children are requested.- Returns:
- An
IteratorofResourceobjects ornullif the resource provider has no children for the given resource. - Throws:
NullPointerException- Ifparentisnull.SlingException- If any error occurs acquiring the child resource iterator.
-
getAttributeNames
@Nullable public @Nullable Collection<String> getAttributeNames(@NotNull @NotNull ResolveContext<T> ctx)
Returns a collection of attribute names whose value can be retrieved calling thegetAttribute(ResolveContext, String)method.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_ATTRIBUTABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.- Returns:
- A collection of attribute names or
null - Throws:
IllegalStateException- if this resource provider has already been closed.
-
getAttribute
@Nullable public @Nullable Object getAttribute(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull String name)
Returns the value of the given resource provider attribute ornullif the attribute is not set or not visible (as e.g. security sensitive attributes).This method is only called if the provider supports this and indicates it by setting the
PROPERTY_ATTRIBUTABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.name- The name of the attribute to access- Returns:
- The value of the attribute or
nullif the attribute is not set or not accessible. - Throws:
IllegalStateException- if this resource provider has already been closed.
-
create
@NotNull public @NotNull Resource create(@NotNull @NotNull ResolveContext<T> ctx, String path, Map<String,Object> properties) throws PersistenceException
Create a new resource at the given path. The new resource is put into the transient space of this provider untilcommit(ResolveContext)is called.A resource provider must value
ResourceResolver.PROPERTY_RESOURCE_TYPEto set the resource type of a resource.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.path- The resource path.properties- Optional properties- Returns:
- The new resource.
- Throws:
PersistenceException- If anything fails
-
delete
public void delete(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull Resource resource) throws PersistenceExceptionDelete the resource at the given path. This change is kept in the transient space of this provider untilcommit(ResolveContext)is called.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.resource- The resource to delete.- Throws:
PersistenceException- If anything fails
-
revert
public void revert(@NotNull @NotNull ResolveContext<T> ctx)Revert all transient changes: create, delete and updates.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.
-
commit
public void commit(@NotNull @NotNull ResolveContext<T> ctx) throws PersistenceExceptionCommit all transient changes: create, delete and updatesThis method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.- Throws:
PersistenceException- If anything fails
-
hasChanges
public boolean hasChanges(@NotNull @NotNull ResolveContext<T> ctx)Are there any transient changes?This method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.- Returns:
trueif there are pending changes.
-
getQueryLanguageProvider
@Nullable public @Nullable QueryLanguageProvider<T> getQueryLanguageProvider()
Get the optional query language provider. If the provider supports this kind of query, it must return a query provider implementation if the provider is active. It should not return a query provider if it is not active. This method is called for each query, therefore the provider implementation might cache the provider object.- Returns:
- A query language provider if this resource provider supports this type of querying.
-
adaptTo
@Nullable public <AdapterType> AdapterType adaptTo(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull Class<AdapterType> type)Adapts the provider to another type.Please not that it is explicitly left as an implementation detail whether each call to this method with the same
typeyields the same object or a new object on each call.Implementations of this method should document their adapted types as well as their behavior with respect to returning newly created or not instance on each call.
This method is only called if the provider supports this and indicates it by setting the
PROPERTY_ADAPTABLEto the valuetrue.- Type Parameters:
AdapterType- The generic type to which this resource is adapted to.- Parameters:
ctx- TheResolveContext.type- The generic type to which this resource is adapted to.- Returns:
- The adapter target or
nullif the provider cannot be adapt to the requested type.
-
copy
public boolean copy(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull String srcAbsPath, @NotNull @NotNull String destAbsPath) throws PersistenceExceptionThis method copies the subgraph rooted at, and including, the resource atsrcAbsPathto the new location atdestAbsPathand adds it as a child node of the resource atdestAbsPath.Both resources are resources from this provider and the full tree is provided by this provider as well.
The resource at
destAbsPathneeds to exist, if not aPersistenceExceptionis thrown. If a child resource with the same name already exists atdestAbsPathaPersistenceExceptionis thrown.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.srcAbsPath- the path of the resource to be copied.destAbsPath- the location to which the resource atsrcAbsPathis to be copied.- Returns:
trueif the provider can perform the copy- Throws:
PersistenceException- If an error occurs.
-
move
public boolean move(@NotNull @NotNull ResolveContext<T> ctx, @NotNull @NotNull String srcAbsPath, @NotNull @NotNull String destAbsPath) throws PersistenceExceptionThis method moves the subgraph rooted at, and including, the resource atsrcAbsPathto the new location atdestAbsPathand adds it as a child node of the resource atdestAbsPath.Both resources are resources from this provider and the full tree is provided by this provider as well.
The resource at
destAbsPathneeds to exist, if not aPersistenceExceptionis thrown. If a child resource with the same name already exists atdestAbsPathaPersistenceExceptionis thrown.This method is only called if the provider supports this and indicates it by setting the
PROPERTY_MODIFIABLEto the valuetrue.- Parameters:
ctx- TheResolveContext.srcAbsPath- the path of the resource to be copied.destAbsPath- the location to which the resource atsrcAbsPathis to be moved.- Returns:
trueif the provider can perform the move- Throws:
PersistenceException- If an error occurs.
-
-