<!--
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.
-->
# Maven Cache Configuration Enhancement

This document describes the enhanced cache configuration functionality in Maven's DefaultRequestCache.

## Overview

The DefaultRequestCache supports configurable reference types and cache scopes through user-defined selectors. This allows fine-grained control over caching behavior for different request types.

## Key Features

### 1. Early Return for ProtoSession
- The `doCache` method now returns early when the request session is not a `Session` instance (e.g., `ProtoSession`).
- This prevents caching attempts for non-session contexts.

### 2. Configurable Cache Behavior
- Cache scope and reference type can be configured via session user properties.
- Configuration uses CSS-like selectors to match request types.
- Supports parent-child request relationships.

## Configuration Syntax

### User Property
```
maven.cache.config
```

### Selector Syntax
```
[ParentRequestType] RequestType { scope: <scope>, ref: <reference> }
```

Where:
- `RequestType`: Short interface name implemented by the request (e.g., `ModelBuilderRequest`)
- `ParentRequestType`: Optional parent request interface name or `*` for any parent
- `scope`: Cache retention scope (optional)
- `ref`: Reference type for cache entries (optional)

**Note**:
- You can specify only `scope` or only `ref` - missing values will be merged from less specific selectors or use defaults.
- Selectors match against all interfaces implemented by the request class, not just the class name.
- This allows matching against `ModelBuilderRequest` interface even if the actual class is `DefaultModelBuilderRequest`.

### Available Values

#### Scopes
- `session`: SESSION_SCOPED - retained for Maven session duration
- `request`: REQUEST_SCOPED - retained for current build request
- `persistent`: PERSISTENT - persisted across Maven invocations
- `disabled`: DISABLED - no caching performed

#### Reference Types
- `soft`: SOFT - cleared before OutOfMemoryError
- `hard`: HARD - never cleared by GC
- `weak`: WEAK - cleared more aggressively
- `none`: NONE - no caching (always compute)

## Examples

### Basic Configuration
```bash
mvn clean install -Dmaven.cache.config="ModelBuilderRequest { scope: session, ref: hard }"
```

### Multiple Selectors with Merging
```bash
mvn clean install -Dmaven.cache.config="
ArtifactResolutionRequest { scope: session, ref: soft }
ModelBuildRequest { scope: request, ref: soft }
ModelBuilderRequest VersionRangeRequest { ref: hard }
ModelBuildRequest * { ref: hard }
"
```

### Partial Configuration and Merging
```bash
# Base configuration for all ModelBuilderRequest
# More specific selectors can override individual properties
mvn clean install -Dmaven.cache.config="
ModelBuilderRequest { scope: session }
* ModelBuilderRequest { ref: hard }
ModelBuildRequest ModelBuilderRequest { ref: soft }
"
```

### Parent-Child Relationships
```bash
# VersionRangeRequest with ModelBuilderRequest parent uses hard references
mvn clean install -Dmaven.cache.config="ModelBuilderRequest VersionRangeRequest { ref: hard }"

# Any request with ModelBuildRequest parent uses hard references
mvn clean install -Dmaven.cache.config="ModelBuildRequest * { ref: hard }"
```

## Selector Priority and Merging

Selectors are ordered by specificity (most specific first):
1. Parent + Request type (e.g., `ModelBuildRequest ModelBuilderRequest`)
2. Request type only (e.g., `ModelBuilderRequest`)
3. Wildcard patterns (e.g., `* ModelBuilderRequest`)

### Configuration Merging
- Multiple selectors can match the same request
- More specific selectors override properties from less specific ones
- Only non-null properties are merged (allows partial configuration)
- Processing stops when a complete configuration is found

Example:
```
ModelBuilderRequest { scope: session }        # Base: sets scope
* ModelBuilderRequest { ref: hard }           # Adds ref type
ModelBuildRequest ModelBuilderRequest { ref: soft }  # Overrides ref for specific parent
```

For a `ModelBuilderRequest` with `ModelBuildRequest` parent:
- Final config: `scope: session, ref: soft`

## Implementation Details

## Performance Considerations

- Configuration parsing is cached per session to avoid re-parsing
- Selector matching is optimized for common cases
- Memory usage improved with configurable reference types
- Early return for ProtoSession reduces overhead

## Future Enhancements

Potential future improvements:
- Support for more complex selector patterns
- Configuration validation and error reporting
- Runtime configuration updates
- Performance metrics and monitoring
