Skip to content

Commit

Permalink
feat(psa): parse dependency version from properties label.
Browse files Browse the repository at this point in the history
  • Loading branch information
ynfeng committed Mar 9, 2021
1 parent 47bd48f commit 7baab19
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 3 deletions.
1 change: 1 addition & 0 deletions _fixtures/projects/java/multi_mod_maven_project/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

<properties>
<spring-boot-starter.version>1.0.0.RELEASE</spring-boot-starter.version>
<other>other properties</other>
</properties>

<dependencies>
Expand Down
29 changes: 28 additions & 1 deletion psa/src/jvm/maven_dependency.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
use crate::{Dependency, DependencyAnalyzer, DependencyScope};
use std::collections::HashMap;
use std::fs::read_to_string;
use std::path::PathBuf;
use sxd_document::{parser, Package};
use sxd_xpath::{Context, Factory, Value};

pub struct MavenDependencyAnalyzer {}
pub struct MavenDependencyAnalyzer {
pub properties: HashMap<String, String>,
}

struct XPathContext<'a> {
factory: Factory,
Expand All @@ -16,6 +19,7 @@ impl<'a> XPathContext<'a> {
fn new(xml_content: &str) -> XPathContext {
let mut context = Context::new();
context.set_namespace("ns", "http://maven.apache.org/POM/4.0.0");

XPathContext {
package: parser::parse(xml_content).unwrap(),
factory: Factory::new(),
Expand All @@ -29,8 +33,26 @@ impl<'a> XPathContext<'a> {
.evaluate(&self.context, self.package.as_document().root())
.unwrap()
}

fn parse_properties(&self) -> HashMap<String, String> {
let mut properties = HashMap::with_capacity(10);
let num_of_properties = self.evaluate("count(/ns:project/ns:properties/*)");
if let Value::Number(ref count) = num_of_properties {
for i in 0..(count.round() as i64) {
let prop_name_expression = format!("name(/ns:project/ns:properties/*[{}])", i + 1);
let prop_value_expression = format!("/ns:project/ns:properties/*[{}]", i + 1);

let prop_name = self.evaluate(prop_name_expression.as_str());
let prop_value = self.evaluate(prop_value_expression.as_str());
properties.insert(prop_name.string(), prop_value.string());
}
}
properties
}
}

impl MavenDependencyAnalyzer {}

impl DependencyAnalyzer for MavenDependencyAnalyzer {
fn is_build_file(&self, file: &str) -> bool {
match file {
Expand Down Expand Up @@ -98,6 +120,11 @@ fn parse_version(xpath_context: &XPathContext, i: i64) -> String {
i + 1
);
let version = xpath_context.evaluate(version_expression.as_str()).string();
if version.starts_with("${") && version.ends_with("}") {
let properties = xpath_context.parse_properties();
let prop_name = &version[2..version.len() - 1];
return properties.get(prop_name).unwrap().as_str().to_string();
}
version
}

Expand Down
5 changes: 4 additions & 1 deletion psa/src/jvm/maven_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use crate::files::{find_in_path, list_file_names};
use crate::jvm::maven_dependency::MavenDependencyAnalyzer;
use crate::Project;
use crate::{DependencyAnalyzer, ModuleAnalyzer};
use std::collections::HashMap;

pub struct MavenModuleAnalyzer {}

Expand Down Expand Up @@ -51,6 +52,8 @@ impl ModuleAnalyzer for MavenModuleAnalyzer {
}

fn get_dependency_analyzer(&self) -> Box<dyn DependencyAnalyzer> {
Box::new(MavenDependencyAnalyzer {})
Box::new(MavenDependencyAnalyzer {
properties: HashMap::with_capacity(10),
})
}
}
2 changes: 1 addition & 1 deletion psa/src/jvm/psa_jvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ mod tests {
let dep2 = project_dependencies.get(1).unwrap();
assert_eq!(dep2.name, "spring-boot-starter-logging");
assert_eq!(dep2.group, "org.springframework.boot");
assert_eq!(dep2.version, "${spring-boot-starter.version}");
assert_eq!(dep2.version, "1.0.0.RELEASE");
assert_eq!(dep2.scope, DependencyScope::Compile);
}

Expand Down

0 comments on commit 7baab19

Please sign in to comment.