mod coordinates;
mod manifest;
mod pom;
mod properties;
#[cfg(test)]
mod manifest_test;
#[cfg(test)]
mod pom_test;
#[cfg(test)]
mod properties_test;
#[cfg(test)]
mod scan_test;
use self::{manifest::parse_manifest_mf, pom::parse_pom_xml, properties::parse_pom_properties};
use super::PackageParser;
use super::metadata::ParserMetadata;
use crate::models::{DatasourceId, PackageData, PackageType};
use std::path::Path;
pub struct MavenParser;
impl PackageParser for MavenParser {
const PACKAGE_TYPE: PackageType = PackageType::Maven;
fn metadata() -> Vec<ParserMetadata> {
vec![ParserMetadata {
description: "Apache Maven POM",
file_patterns: &[
"**/*.pom",
"**/pom.xml",
"**/pom.properties",
"**/META-INF/MANIFEST.MF",
],
package_type: "maven",
primary_language: "Java",
documentation_url: Some("https://maven.apache.org/pom.html"),
}]
}
fn extract_packages(path: &Path) -> Vec<PackageData> {
if let Some(filename) = path.file_name().and_then(|name| name.to_str()) {
if filename == "pom.properties" {
return vec![parse_pom_properties(path)];
}
if filename == "MANIFEST.MF" {
return vec![parse_manifest_mf(path)];
}
}
parse_pom_xml(path)
}
fn is_match(path: &Path) -> bool {
if let Some(filename) = path.file_name().and_then(|name| name.to_str()) {
filename == "pom.xml"
|| filename.ends_with(".pom.xml")
|| filename.ends_with("-pom.xml")
|| filename.ends_with("_pom.xml")
|| filename == "pom.properties"
|| filename == "MANIFEST.MF"
|| filename.ends_with(".pom")
} else {
false
}
}
}
fn default_package_data(datasource_id: DatasourceId) -> PackageData {
PackageData {
package_type: Some(PackageType::Maven),
datasource_id: Some(datasource_id),
..Default::default()
}
}