This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
For detailed procedures, use the specialized agents and commands in .claude/agents/ and .claude/commands/.
Apache Struts is a mature MVC web application framework for Java (originally WebWork 2). Current version: 7.2.0-SNAPSHOT. Uses OGNL for value stack expressions and FreeMarker for UI tag templates.
# Run tests (skip assembly for speed)
mvn test -DskipAssembly
# Single test in specific module
mvn test -DskipAssembly -pl core -Dtest=MyClassTest#testMethodName
# Jakarta EE 11 / Spring 7 profile
mvn clean install -Pjakartaee11struts/
├── core/ # struts2-core - main framework
├── plugins/ # Plugin modules (json, rest, spring, tiles, velocity, etc.)
├── apps/ # Sample applications (showcase, rest-showcase)
├── assembly/ # Distribution packaging
├── bom/ # Bill of Materials for dependency management
├── parent/ # Parent POM with shared configuration
└── jakarta/ # Jakarta EE compatibility modules
Request Lifecycle: Dispatcher → ActionProxy → ActionInvocation → Interceptor stack → Action → Result
Key packages in org.apache.struts2:
dispatcher- Request handling,Dispatcher, servlet integrationinterceptor- Built-in interceptors (params, validation, fileUpload)components- UI tag components (form, textfield, submit)action- Action interfaces (UploadedFilesAware,SessionAware, etc.)security- Security utilities and OGNL member access policies
Apache Struts has a history of security vulnerabilities (OGNL injection, temp file exploits). Apply these Struts-specific patterns:
- Temporary files: Use UUID-based names in controlled locations (see example below)
- OGNL expressions: Evaluate only framework-generated OGNL; use allowlist member access
- File uploads: Validate content types, sanitize filenames, enforce size limits
- Parameter filtering: Use
ParameterNameAwareto restrict accepted parameter names
// Secure temporary file pattern
protected File createTemporaryFile(String fileName, Path location) {
String uid = UUID.randomUUID().toString().replace("-", "_");
return location.resolve("upload_" + uid + ".tmp").toFile();
}Tests use JUnit 5 with AssertJ assertions and Mockito for mocking. Run with mvn test -DskipAssembly.
- Title format:
WW-XXXX Description(Jira ticket ID required) - Link ticket in description:
Fixes [WW-XXXX](https://issues.apache.org/jira/browse/WW-XXXX) - Issue tracker: https://issues.apache.org/jira/projects/WW