Package net.shibboleth.idp.consent.flow.storage.impl

# Class AbstractConsentIndexedStorageAction

java.lang.Object
net.shibboleth.shared.component.AbstractInitializableComponent
org.opensaml.profile.action.AbstractProfileAction
org.opensaml.profile.action.AbstractConditionalProfileAction
net.shibboleth.idp.profile.AbstractProfileAction
net.shibboleth.idp.profile.interceptor.AbstractProfileInterceptorAction
net.shibboleth.idp.consent.flow.impl.AbstractConsentAction
net.shibboleth.idp.consent.flow.storage.impl.AbstractConsentStorageAction
net.shibboleth.idp.consent.flow.storage.impl.AbstractConsentIndexedStorageAction

All Implemented Interfaces:
  `Component`, `DestructableComponent`, `InitializableComponent`, `ProfileAction`, `Aware`, `MessageSource`, `MessageSourceAware`, `Action`

Direct Known Subclasses:
  `CreateGlobalConsentResult`, `CreateResult`, `RevokeConsent`

public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageAction
Base class for consent actions which write to a `StorageService`. To facilitate lookup of all storage keys for a storage context, an index record is maintained containing the storage keys for the context. Because storage records may expire, the index record may contain keys which no longer exist in the storage service.

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`DEFAULT_STORAGE_INDEX_KEY`
Default storage key for the storage index record.
`private final org.slf4j.Logger`
`log`
Class logger.
`private String`
`storageIndexKey`
Storage key of index record.
`private Function<ProfileRequestContext,String>`
`storageIndexKeyLookupStrategy`
Strategy used to determine the storage key of the index record.
`private StorageSerializer<Collection<String>>`
`storageKeysSerializer`
Storage keys serializer used to serialize the value of the storage key index record.
`private Function<Pair<ProfileRequestContext,List<String>>,List<String>>`
`storageKeysStrategy`
Strategy used to manipulate the storage keys when pruning storage records.

## Constructor Summary

Constructors
Constructor
Description
`AbstractConsentIndexedStorageAction()`
Constructor.

## Method Summary

Modifier and Type
Method
Description
`protected boolean`
`addKeyToStorageIndex(String keyToAdd)`
Add a storage key to the index storage record.
`protected void`
`doInitialize()`
`protected boolean`
`doPreExecute(ProfileRequestContext profileRequestContext, ProfileInterceptorContext interceptorContext)`
Performs this profile interceptor action's pre-execute step.
`protected String`
`getStorageIndexKey()`
Get the storage key resulting from applying the storage key lookup strategy.
`protected List<String>`
`getStorageKeysFromIndex()`
Get the storage keys from the storage index record.
`StorageSerializer<Collection<String>>`
`getStorageKeysSerializer()`
Get the storage keys serializer used to serialize the value of the storage key index record.
`protected void`
`pruneStorageRecords(ProfileRequestContext profileRequestContext)`
Storage records will be pruned based on the record maximums set on the flow descriptor, and the storage service value size.
`protected boolean`
`removeKeyFromStorageIndex(String keyToRemove)`
Remove a storage key from the index storage record.
`void`
`setStorageIndexKeyLookupStrategy(Function<ProfileRequestContext,String> strategy)`
Set the storage index key lookup strategy.
`void`
`setStorageKeysSerializer(StorageSerializer<Collection<String>> serializer)`
Set the storage keys serializer used to serialize the value of the storage key index record.
`void`
`setStorageKeysStrategy(Function<Pair<ProfileRequestContext,List<String>>,List<String>> strategy)`
Set the storage keys strategy used to manipulate the storage keys when pruning storage records.
`protected boolean`
`storeResult(ProfileInterceptorResult result)`
Store a profile interceptor result.
`protected void`
`storeResultWithIndex(ProfileRequestContext profileRequestContext, ProfileInterceptorResult result)`
Store a profile interceptor result and maintain an index record containing the storage keys for the storage context.

### Methods inherited from class net.shibboleth.idp.consent.flow.storage.impl.AbstractConsentStorageAction

`getStorageContext, getStorageContextLookupStrategy, getStorageKey, getStorageKeyLookupStrategy, getStorageSerializer, getStorageService, setStorageContextLookupStrategy, setStorageKeyLookupStrategy, setStorageSerializer`

### Methods inherited from class net.shibboleth.idp.consent.flow.impl.AbstractConsentAction

`getConsentContext, getConsentFlowDescriptor, setConsentContextLookupStrategy`

### Methods inherited from class net.shibboleth.idp.profile.interceptor.AbstractProfileInterceptorAction

`doExecute, doExecute, doPreExecute, setLookupStrategy`

### Methods inherited from class net.shibboleth.idp.profile.AbstractProfileAction

`doExecute, execute, getBean, getBean, getMessage, getMessage, getMessage, getParameter, getParameter, getProfileContextLookupStrategy, getRequestContext, getResult, setMessageSource, setProfileContextLookupStrategy`

### Methods inherited from class org.opensaml.profile.action.AbstractConditionalProfileAction

`getActivationCondition, setActivationCondition`

### Methods inherited from class org.opensaml.profile.action.AbstractProfileAction

`doPostExecute, doPostExecute, ensureHttpServletRequest, ensureHttpServletResponse, execute, getHttpServletRequest, getHttpServletRequestSupplier, getHttpServletResponse, getHttpServletResponseSupplier, getLogPrefix, isPreExecuteCalled, setHttpServletRequestSupplier, setHttpServletResponseSupplier`

### Methods inherited from class net.shibboleth.shared.component.AbstractInitializableComponent

`checkComponentActive, checkSetterPreconditions, destroy, doDestroy, ifDestroyedThrowDestroyedComponentException, ifInitializedThrowUnmodifiabledComponentException, ifNotInitializedThrowUninitializedComponentException, initialize, isDestroyed, isInitialized`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface net.shibboleth.shared.component.InitializableComponent

`initialize, isInitialized`

## Field Details

### DEFAULT_STORAGE_INDEX_KEY

@Nonnull @NotEmpty public static final String DEFAULT_STORAGE_INDEX_KEY
Default storage key for the storage index record.

See Also:
  - Constant Field Values

### log

@Nonnull private final org.slf4j.Logger log
Class logger.

### storageIndexKey

@Nullable private String storageIndexKey
Storage key of index record.

### storageIndexKeyLookupStrategy

@NonnullAfterInit private Function<ProfileRequestContext,String> storageIndexKeyLookupStrategy
Strategy used to determine the storage key of the index record.

### storageKeysStrategy

@Nullable private Function<Pair<ProfileRequestContext,List<String>>,List<String>> storageKeysStrategy
Strategy used to manipulate the storage keys when pruning storage records.

### storageKeysSerializer

@Nonnull private StorageSerializer<Collection<String>> storageKeysSerializer
Storage keys serializer used to serialize the value of the storage key index record.

## Constructor Details

### AbstractConsentIndexedStorageAction

public AbstractConsentIndexedStorageAction()
Constructor.

## Method Details

### getStorageKeysSerializer

@Nonnull public StorageSerializer<Collection<String>> getStorageKeysSerializer()
Get the storage keys serializer used to serialize the value of the storage key index record.

Returns:
  the storage keys serializer

### setStorageIndexKeyLookupStrategy

public void setStorageIndexKeyLookupStrategy(@Nonnull Function<ProfileRequestContext,String> strategy)
Set the storage index key lookup strategy.

Parameters:
  `strategy` - the storage index key lookup strategy

### setStorageKeysSerializer

public void setStorageKeysSerializer(@Nonnull StorageSerializer<Collection<String>> serializer)
Set the storage keys serializer used to serialize the value of the storage key index record.

Parameters:
  `serializer` - the storage keys serializer

### setStorageKeysStrategy

public void setStorageKeysStrategy(@Nonnull Function<Pair<ProfileRequestContext,List<String>>,List<String>> strategy)
Set the storage keys strategy used to manipulate the storage keys when pruning storage records.

Parameters:
  `strategy` - the storage keys strategy

### doInitialize

protected void doInitialize() throws ComponentInitializationException

Overrides:
  `doInitialize` in class `AbstractConsentStorageAction`
Throws:
  `ComponentInitializationException`

### doPreExecute

protected boolean doPreExecute(@Nonnull ProfileRequestContext profileRequestContext, @Nonnull ProfileInterceptorContext interceptorContext)
Performs this profile interceptor action's pre-execute step. Default implementation returns true.

Overrides:
  `doPreExecute` in class `AbstractConsentStorageAction`
Parameters:
  `profileRequestContext` - the current profile request context
  `interceptorContext` - the current profile interceptor context
Returns:
  true iff execution should continue

### getStorageIndexKey

@Nullable protected String getStorageIndexKey()
Get the storage key resulting from applying the storage key lookup strategy.

Returns:
  the storage key

### getStorageKeysFromIndex

@Nonnull @Unmodifiable @NotLive protected List<String> getStorageKeysFromIndex() throws IOException
Get the storage keys from the storage index record.

Returns:
  the storage keys from the storage index record
Throws:
  `IOException` - if errors occur in the read process

### addKeyToStorageIndex

protected boolean addKeyToStorageIndex(@Nonnull String keyToAdd) throws IOException
Add a storage key to the index storage record.

Parameters:
  `keyToAdd` - storage key to add to the index storage record
Returns:
  true if key addition succeeded, false otherwise
Throws:
  `IOException` - if an error occurs writing to the storage service

### removeKeyFromStorageIndex

protected boolean removeKeyFromStorageIndex(@Nonnull String keyToRemove) throws IOException
Remove a storage key from the index storage record.

Parameters:
  `keyToRemove` - storage key to remove from the index storage record
Returns:
  true if key removal succeeded, false otherwise
Throws:
  `IOException` - if an error occurs writing to the storage service

### pruneStorageRecords

protected void pruneStorageRecords(@Nonnull ProfileRequestContext profileRequestContext) throws IOException
Storage records will be pruned based on the record maximums set on the flow descriptor, and the storage service value size. Below a defined threshold, the basic maximum is applied, while at that storage size, an expanded maximum is applied.

The function used to determine the records to be deleted may be set by calling `setStorageKeysStrategy(Function)`. By default, records are deleted on a first-in-first-out basis, meaning the oldest storage records are deleted first.

Parameters:
  `profileRequestContext` - the profile request context
Throws:
  `IOException` - if an error occurs writing to the storage service

### storeResult

protected boolean storeResult(@Nonnull ProfileInterceptorResult result) throws IOException
Store a profile interceptor result.

Parameters:
  `result` - the profile interceptor result to be stored
Returns:
  boolean whether the record was stored successfully
Throws:
  `IOException` - if an error occurs

### storeResultWithIndex

protected void storeResultWithIndex(@Nonnull ProfileRequestContext profileRequestContext, @Nonnull ProfileInterceptorResult result) throws IOException
Store a profile interceptor result and maintain an index record containing the storage keys for the storage context. Storage records are pruned so that the number of records stored is less than or equal to `ConsentFlowDescriptor.getMaximumNumberOfStoredRecords()`.

Parameters:
  `profileRequestContext` - the profile request context
  `result` - the profile interceptor result to be stored
Throws:
  `IOException` - if an error occurs