This is an automated email from the ASF dual-hosted git repository.
lukaszlenart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/main by this push:
new 1164ada51 WW-5588 Allow Preparable interface to work with only
per-method prepare*() implementations (#1417)
1164ada51 is described below
commit 1164ada5116272f47d00fb7e17a0810e5a4e8b7e
Author: Lukasz Lenart <[email protected]>
AuthorDate: Sat Nov 22 15:34:03 2025 +0100
WW-5588 Allow Preparable interface to work with only per-method prepare*()
implementations (#1417)
* fix(core): make Preparable.prepare() a default method
Allow actions to implement only per-method variants like prepareInput(),
prepareEdit() without requiring an empty prepare() override.
Fixes WW-5588
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: add PR guidelines requiring Jira ticket ID and link
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
---------
Co-authored-by: Claude <[email protected]>
---
CLAUDE.md | 28 ++++++++++++++++++++--
.../main/java/org/apache/struts2/Preparable.java | 7 +++++-
2 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index b89b072d5..6f324f0d8 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2,19 +2,23 @@
This file provides guidance to Claude Code (claude.ai/code) when working with
code in this repository.
-This document outlines essential practices for working with Claude Code on the
Apache Struts project. For detailed procedures, use the specialized agents and
commands available in `.claude/agents/` and `.claude/commands/`.
+This document outlines essential practices for working with Claude Code on the
Apache Struts project. For detailed
+procedures, use the specialized agents and commands available in
`.claude/agents/` and `.claude/commands/`.
## Project Overview
-Apache Struts is a mature MVC web application framework for Java, originally
based on WebWork 2. The project follows a modular architecture with clear
separation between core framework, plugins, and applications.
+Apache Struts is a mature MVC web application framework for Java, originally
based on WebWork 2. The project follows a
+modular architecture with clear separation between core framework, plugins,
and applications.
### Build System & Environment
+
- **Build Tool**: Maven with multi-module structure
- **Java Version**: Java 17+
- **Testing**: JUnit 5 with AssertJ assertions
- **IDE Support**: IntelliJ IDEA with project-specific configurations
### Key Build Commands
+
```bash
# Full build with tests
mvn clean install
@@ -27,6 +31,7 @@ mvn clean install -DskipTests
```
### Project Structure
+
```
struts/
├── core/ # Core framework (struts2-core)
@@ -41,6 +46,7 @@ struts/
### Core Architecture Components
#### MVC Framework Components
+
- **ActionSupport**: Base class for actions with validation and
internationalization
- **ActionContext**: Thread-local context holding request/response data
- **ActionProxy/ActionInvocation**: Handles action execution lifecycle
@@ -48,6 +54,7 @@ struts/
- **Interceptors**: Cross-cutting concerns (validation, file upload, security)
#### Key Packages
+
- `org.apache.struts2.dispatcher`: Request handling and context management
- `org.apache.struts2.interceptor`: Interceptor implementations
- `org.apache.struts2.components`: UI component system
@@ -55,6 +62,7 @@ struts/
- `org.apache.struts2.security`: Security-related utilities
### Technology Stack
+
- **Jakarta EE**: Servlet API, JSP, JSTL
- **Core Libraries**: OGNL (expression language), Commons FileUpload2, Log4j2
- **Template Engines**: FreeMarker, Velocity (via plugins)
@@ -63,6 +71,7 @@ struts/
## Security-First Development
### Critical Security Principles
+
1. **Never create files in system temp directories** - always use controlled
application directories
2. **Use UUID-based naming** for temporary files to prevent collisions and
path traversal
3. **Implement proper resource cleanup** with try-with-resources and finally
blocks
@@ -72,6 +81,7 @@ struts/
**For comprehensive security analysis, use:** `/security_scan`
### Security Implementation Patterns
+
```java
// GOOD: Secure temporary file creation
protected File createTemporaryFile(String fileName, Path location) {
@@ -87,6 +97,7 @@ protected File createTemporaryFile(String fileName, Path
location) {
**For intelligent test execution and analysis, use:** `/run_tests`
### Test Structure & Coverage
+
- **Unit Tests**: Test individual methods with mocked dependencies
- **Integration Tests**: Test complete workflows with real file I/O
- **Security Tests**: Verify directory traversal prevention, secure naming
@@ -94,6 +105,7 @@ protected File createTemporaryFile(String fileName, Path
location) {
- **Cleanup Tests**: Verify resource cleanup and tracking
### Basic Testing Command
+
```bash
# Run all tests (use -DskipAssembly to avoid building docs/examples)
mvn test -DskipAssembly
@@ -104,6 +116,7 @@ mvn test -DskipAssembly
**For comprehensive documentation quality analysis, use:** `/quality_check`
### Documentation Requirements
+
- **Always document security implications** in methods handling files/user
input
- **Include usage examples** for complex methods and classes
- **Document exception conditions** and error handling behavior
@@ -113,6 +126,7 @@ mvn test -DskipAssembly
## Error Handling & Logging
### Logging Best Practices
+
- Use parameterized logging for performance: `LOG.debug("Processing: {}",
value)`
- Log security-relevant operations appropriately
- Use appropriate log levels (debug/info/warn/error)
@@ -123,6 +137,7 @@ mvn test -DskipAssembly
**For comprehensive code quality analysis, use:** `/quality_check`
### Key Principles
+
- Use `protected` for methods that subclasses might override
- Catch specific exceptions rather than generic `Exception`
- Use clear, descriptive method and variable names
@@ -131,6 +146,7 @@ mvn test -DskipAssembly
## Available Automated Tools
### Commands
+
- `/security_scan` - Comprehensive security analysis
- `/run_tests` - Intelligent test execution and analysis
- `/quality_check` - Code quality and documentation analysis
@@ -141,6 +157,7 @@ mvn test -DskipAssembly
- `/research_codebase` - Comprehensive codebase research
### Specialized Agents
+
- `security-analyzer` - OGNL injection scanning, CVE detection
- `test-runner` - Maven test execution and coverage analysis
- `code-quality-checker` - JavaDoc compliance, pattern consistency
@@ -150,6 +167,13 @@ mvn test -DskipAssembly
- `codebase-locator` - Code and file location assistance
- `codebase-pattern-finder` - Pattern examples and usage
+## Pull Request Guidelines
+
+- **PR title must start with Jira ticket ID** (e.g., `WW-5588 Allow Preparable
interface...`)
+- **PR description must link to the ticket** using GitHub keywords:
+ - `Closes [WW-XXXX](https://issues.apache.org/jira/browse/WW-XXXX)`
+ - `Fixes [WW-XXXX](https://issues.apache.org/jira/browse/WW-XXXX)`
+
## Common Pitfalls to Avoid
1. **File Security**: Never use `File.createTempFile()` without directory
control
diff --git a/core/src/main/java/org/apache/struts2/Preparable.java
b/core/src/main/java/org/apache/struts2/Preparable.java
index 434c972c3..eb6c58022 100644
--- a/core/src/main/java/org/apache/struts2/Preparable.java
+++ b/core/src/main/java/org/apache/struts2/Preparable.java
@@ -30,8 +30,13 @@ public interface Preparable {
/**
* This method is called to allow the action to prepare itself.
*
+ * <p>Default implementation is empty, allowing actions to implement only
+ * per-method variants like {@code prepareInput()}, {@code prepareEdit()},
etc.</p>
+ *
* @throws Exception thrown if a system level exception occurs.
*/
- void prepare() throws Exception;
+ default void prepare() throws Exception {
+ // default empty implementation
+ }
}