Skip to content

Commit dcc621c

Browse files
aschemanclaude
andcommitted
Extract ResourceHandlingContext class from DefaultProjectBuilder
Move resource handling logic to dedicated package-private class: - Create ResourceHandlingContext with project-level state - Method handleResourceConfiguration(scope, hasResourcesInSources) derives resources from scope, takes flag as parameter - Reduces DefaultProjectBuilder by 179 lines 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 59668bf commit dcc621c

File tree

2 files changed

+217
-179
lines changed

2 files changed

+217
-179
lines changed

impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java

Lines changed: 4 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
import org.apache.maven.api.model.Plugin;
6363
import org.apache.maven.api.model.Profile;
6464
import org.apache.maven.api.model.ReportPlugin;
65-
import org.apache.maven.api.model.Resource;
6665
import org.apache.maven.api.services.ArtifactResolver;
6766
import org.apache.maven.api.services.ArtifactResolverException;
6867
import org.apache.maven.api.services.ArtifactResolverRequest;
@@ -720,16 +719,11 @@ private void initProject(MavenProject project, ModelBuilderResult result) {
720719
modules,
721720
isModularProject);
722721

723-
// Handle main and test resources using shared method
724-
ResourceHandlingContext context =
722+
// Handle main and test resources
723+
ResourceHandlingContext resourceContext =
725724
new ResourceHandlingContext(project, baseDir, modules, isModularProject, result);
726-
handleResourceConfiguration(
727-
context, project.getBuild().getDelegate().getResources(), hasMainResources, ProjectScope.MAIN);
728-
handleResourceConfiguration(
729-
context,
730-
project.getBuild().getDelegate().getTestResources(),
731-
hasTestResources,
732-
ProjectScope.TEST);
725+
resourceContext.handleResourceConfiguration(ProjectScope.MAIN, hasMainResources);
726+
resourceContext.handleResourceConfiguration(ProjectScope.TEST, hasTestResources);
733727
}
734728

735729
project.setActiveProfiles(
@@ -1123,114 +1117,6 @@ public Set<Entry<K, V>> entrySet() {
11231117
}
11241118
}
11251119

1126-
/**
1127-
* Context object for resource handling configuration.
1128-
* Groups parameters shared between main and test resource handling to reduce method parameter count.
1129-
*/
1130-
private record ResourceHandlingContext(
1131-
MavenProject project,
1132-
Path baseDir,
1133-
Set<String> modules,
1134-
boolean modularProject,
1135-
ModelBuilderResult result) {}
1136-
1137-
/**
1138-
* Handles resource configuration for a given scope (main or test).
1139-
* This method applies the resource priority rules:
1140-
* <ol>
1141-
* <li>Modular project: use resources from {@code <sources>} if present, otherwise inject defaults</li>
1142-
* <li>Classic project: use resources from {@code <sources>} if present, otherwise use legacy resources</li>
1143-
* </ol>
1144-
*
1145-
* @param context the resource handling context containing project info
1146-
* @param resources the legacy resource list (from {@code <resources>} or {@code <testResources>})
1147-
* @param hasResourcesInSources whether resources are configured via {@code <sources>}
1148-
* @param scope the project scope (MAIN or TEST)
1149-
*/
1150-
private void handleResourceConfiguration(
1151-
ResourceHandlingContext context,
1152-
List<Resource> resources,
1153-
boolean hasResourcesInSources,
1154-
ProjectScope scope) {
1155-
1156-
String scopeId = scope.id();
1157-
String scopeName = scope == ProjectScope.MAIN ? "Main" : "Test";
1158-
String legacyElement = scope == ProjectScope.MAIN ? "<resources>" : "<testResources>";
1159-
String sourcesConfig = scope == ProjectScope.MAIN
1160-
? "<source><lang>resources</lang></source>"
1161-
: "<source><lang>resources</lang><scope>test</scope></source>";
1162-
1163-
if (context.modularProject()) {
1164-
if (hasResourcesInSources) {
1165-
// Modular project with resources configured via <sources> - already added above
1166-
if (hasExplicitLegacyResources(resources, context.baseDir(), scopeId)) {
1167-
logger.warn(
1168-
"Legacy {} element is ignored because {} resources are configured via {} in <sources>.",
1169-
legacyElement,
1170-
scopeId,
1171-
sourcesConfig);
1172-
} else {
1173-
logger.trace(
1174-
"{} resources configured via <sources> element, ignoring legacy {} element.",
1175-
scopeName,
1176-
legacyElement);
1177-
}
1178-
} else {
1179-
// Modular project without resources in <sources> - inject module-aware defaults
1180-
if (hasExplicitLegacyResources(resources, context.baseDir(), scopeId)) {
1181-
String message = "Legacy " + legacyElement
1182-
+ " element is ignored because modular sources are configured. "
1183-
+ "Use " + sourcesConfig + " in <sources> for custom resource paths.";
1184-
logger.warn(message);
1185-
context.result()
1186-
.getProblemCollector()
1187-
.reportProblem(new org.apache.maven.impl.model.DefaultModelProblem(
1188-
message,
1189-
Severity.WARNING,
1190-
Version.V41,
1191-
context.project().getModel().getDelegate(),
1192-
-1,
1193-
-1,
1194-
null));
1195-
}
1196-
for (String module : context.modules()) {
1197-
context.project().addSourceRoot(createModularResourceRoot(context.baseDir(), module, scope));
1198-
}
1199-
if (!context.modules().isEmpty()) {
1200-
logger.trace(
1201-
"Injected {} module-aware {} resource root(s) for modules: {}.",
1202-
context.modules().size(),
1203-
scopeId,
1204-
context.modules());
1205-
}
1206-
}
1207-
} else {
1208-
// Classic (non-modular) project
1209-
if (hasResourcesInSources) {
1210-
// Resources configured via <sources> - already added above
1211-
if (hasExplicitLegacyResources(resources, context.baseDir(), scopeId)) {
1212-
logger.warn(
1213-
"Legacy {} element is ignored because {} resources are configured via {} in <sources>.",
1214-
legacyElement,
1215-
scopeId,
1216-
sourcesConfig);
1217-
} else {
1218-
logger.trace(
1219-
"{} resources configured via <sources> element, ignoring legacy {} element.",
1220-
scopeName,
1221-
legacyElement);
1222-
}
1223-
} else {
1224-
// Use legacy resources element
1225-
logger.trace(
1226-
"Using explicit or default {} resources ({} resources configured).", scopeId, resources.size());
1227-
for (Resource resource : resources) {
1228-
context.project().addSourceRoot(new DefaultSourceRoot(context.baseDir(), scope, resource));
1229-
}
1230-
}
1231-
}
1232-
}
1233-
12341120
/**
12351121
* Extracts unique module names from the given list of source elements.
12361122
* A project is considered modular if it has at least one module name.
@@ -1247,67 +1133,6 @@ private static Set<String> extractModules(List<org.apache.maven.api.model.Source
12471133
.collect(Collectors.toSet());
12481134
}
12491135

1250-
/**
1251-
* Creates a DefaultSourceRoot for module-aware resource directories.
1252-
* Generates paths following the pattern: {@code src/<module>/<scope>/resources}
1253-
*
1254-
* @param baseDir base directory of the project
1255-
* @param module module name
1256-
* @param scope project scope (main or test)
1257-
* @return configured DefaultSourceRoot for the module's resources
1258-
*/
1259-
private static DefaultSourceRoot createModularResourceRoot(Path baseDir, String module, ProjectScope scope) {
1260-
Path resourceDir =
1261-
baseDir.resolve("src").resolve(module).resolve(scope.id()).resolve("resources");
1262-
1263-
return new DefaultSourceRoot(
1264-
scope,
1265-
Language.RESOURCES,
1266-
module,
1267-
null, // targetVersion
1268-
resourceDir,
1269-
null, // includes
1270-
null, // excludes
1271-
false, // stringFiltering
1272-
Path.of(module), // targetPath - resources go to target/classes/<module>
1273-
true // enabled
1274-
);
1275-
}
1276-
1277-
/**
1278-
* Checks if the given resource list contains explicit legacy resources that differ
1279-
* from Super POM defaults. Super POM defaults are: src/{scope}/resources and src/{scope}/resources-filtered
1280-
*
1281-
* @param resources list of resources to check
1282-
* @param baseDir project base directory
1283-
* @param scope scope (main or test)
1284-
* @return true if explicit legacy resources are present that would be ignored
1285-
*/
1286-
private static boolean hasExplicitLegacyResources(List<Resource> resources, Path baseDir, String scope) {
1287-
if (resources.isEmpty()) {
1288-
return false; // No resources means no explicit legacy resources to warn about
1289-
}
1290-
1291-
// Super POM default paths
1292-
String defaultPath =
1293-
baseDir.resolve("src").resolve(scope).resolve("resources").toString();
1294-
String defaultFilteredPath = baseDir.resolve("src")
1295-
.resolve(scope)
1296-
.resolve("resources-filtered")
1297-
.toString();
1298-
1299-
// Check if any resource differs from Super POM defaults
1300-
for (Resource resource : resources) {
1301-
String resourceDir = resource.getDirectory();
1302-
if (resourceDir != null && !resourceDir.equals(defaultPath) && !resourceDir.equals(defaultFilteredPath)) {
1303-
// Found an explicit legacy resource
1304-
return true;
1305-
}
1306-
}
1307-
1308-
return false;
1309-
}
1310-
13111136
private Model injectLifecycleBindings(
13121137
Model model,
13131138
ModelBuilderRequest request,

0 commit comments

Comments
 (0)