use anyhow::{Context, Result};
use crate::core::execution::{MavenExecutionRequest, MavenExecutionResult};
use crate::core::project_builder::ProjectBuilder;
use crate::core::lifecycle_starter::LifecycleStarter;
use crate::core::reactor::Reactor;
use crate::core::session::MavenSession;
use crate::settings::Settings;
use crate::plugin_api::registry::PluginRegistry;
pub struct DefaultMaven {
project_builder: ProjectBuilder,
lifecycle_starter: LifecycleStarter,
}
impl DefaultMaven {
pub fn new() -> Self {
Self {
project_builder: ProjectBuilder::new(),
lifecycle_starter: LifecycleStarter::new(),
}
}
pub fn execute(&self, request: MavenExecutionRequest) -> Result<MavenExecutionResult> {
let settings = request.settings.unwrap_or_else(Settings::default);
let pom_file = request.pom_file.unwrap_or_else(|| {
request.base_directory.join("pom.xml")
});
let projects = if request.reactor_active {
self.project_builder
.build_reactor(&pom_file)
.context("Failed to build reactor")?
} else {
vec![self.project_builder
.build(&pom_file)
.context("Failed to build project")?]
};
let mut session = MavenSession::new(request.base_directory.clone(), settings);
for project in &projects {
if session.current_project.is_none() {
session.current_project = Some(project.clone());
}
session.projects.push(project.clone());
}
let reactor = Reactor::new(projects.clone());
let mut result = MavenExecutionResult::new();
for project in reactor.build_order() {
session.current_project = Some(project.clone());
match self.lifecycle_starter.execute(&session, &request.goals) {
Ok(exec_result) => {
if !exec_result.success {
result.add_exception(anyhow::anyhow!(
"Build failed for project {}",
project.id()
));
}
}
Err(e) => {
result.add_exception(e.context(format!(
"Failed to execute lifecycle for project {}",
project.id()
)));
}
}
}
result.projects = projects;
Ok(result)
}
pub fn with_plugin_registry(mut self, registry: PluginRegistry) -> Self {
self.lifecycle_starter = self.lifecycle_starter.with_plugin_registry(registry);
self
}
}
impl Default for DefaultMaven {
fn default() -> Self {
Self::new()
}
}