This is an automated email from the ASF dual-hosted git repository. tison pushed a commit to branch generate-java-configs in repository https://gitbox.apache.org/repos/asf/opendal.git
commit 1d932ee4e44188aed46600c7f52c3105ffc4504d Author: tison <[email protected]> AuthorDate: Fri Jan 3 18:02:25 2025 +0800 fixup impl Signed-off-by: tison <[email protected]> --- bindings/java/pom.xml | 13 ------------- dev/Cargo.lock | 1 + dev/Cargo.toml | 1 + dev/src/generate/java.j2 | 36 ++++++++++++++++++++++++------------ dev/src/generate/java.rs | 39 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 64 insertions(+), 26 deletions(-) diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml index 70de49085..a9e719a36 100644 --- a/bindings/java/pom.xml +++ b/bindings/java/pom.xml @@ -70,7 +70,6 @@ <commons-io.version>2.16.1</commons-io.version> <dotenv.version>2.3.2</dotenv.version> <lombok.version>1.18.34</lombok.version> - <jackson.version>2.18.2</jackson.version> <slf4j.version>2.0.7</slf4j.version> <httpclient.version>5.2</httpclient.version> @@ -93,13 +92,6 @@ <type>pom</type> <scope>import</scope> </dependency> - <dependency> - <groupId>com.fasterxml.jackson</groupId> - <artifactId>jackson-bom</artifactId> - <version>${jackson.version}</version> - <type>pom</type> - <scope>import</scope> - </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> @@ -142,11 +134,6 @@ <scope>provided</scope> </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - </dependency> - <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-suite</artifactId> diff --git a/dev/Cargo.lock b/dev/Cargo.lock index 9557672df..ec2ffb62d 100644 --- a/dev/Cargo.lock +++ b/dev/Cargo.lock @@ -187,6 +187,7 @@ dependencies = [ "anyhow", "clap", "env_logger", + "heck", "log", "minijinja", "pretty_assertions", diff --git a/dev/Cargo.toml b/dev/Cargo.toml index 2acaeecae..1ff7ab62b 100644 --- a/dev/Cargo.toml +++ b/dev/Cargo.toml @@ -32,6 +32,7 @@ anyhow = { version = "1.0.95" } clap = { version = "4.5.23", features = ["derive"] } env_logger = { version = "0.11.5" } log = { version = "0.4.22" } +heck = { version = "0.5.0" } minijinja = { version = "2.5.0" } serde = { version = "1.0.216", features = ["derive"] } syn = { version = "2.0.91", features = ["visit", "full", "extra-traits"] } diff --git a/dev/src/generate/java.j2 b/dev/src/generate/java.j2 index 57c4fef15..52d9b4b85 100644 --- a/dev/src/generate/java.j2 +++ b/dev/src/generate/java.j2 @@ -21,38 +21,50 @@ package org.apache.opendal; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.time.Duration; +import java.util.HashMap; import lombok.AccessLevel; import lombok.Builder; import lombok.Data; import lombok.RequiredArgsConstructor; -import lombok.extern.jackson.Jacksonized; /** - * Service configurations that are mapped from - * <a href="https://docs.rs/opendal/*/opendal/services/index.html>OpenDAL's services</a>. - */ + * Service configurations that are mapped from + * <a href="https://docs.rs/opendal/latest/opendal/services/index.html>OpenDAL's services</a>. + */ @SuppressWarnings("unused") // intended to be used by users -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "schema") public interface ServiceConfig { + String scheme(); + + HashMap<String, String> configMap(); + {% for srv in srvs %} @Builder @Data @RequiredArgsConstructor(access = AccessLevel.PRIVATE) - @Jacksonized - class {{srv}} { + class {{srv | case_java_class_name}} implements ServiceConfig { {%- for field in srvs[srv].config %} {%- if field.deprecated %} /** * @deprecated {{field.deprecated["note"]}} */ - @JsonProperty("{{field.name}}") {%- endif %} - public final {{make_java_type(field.value)}} {{field.name}}; + public final {{make_java_type(field.value)}} {{field.name | case_java_field_name}}; {%- endfor %} + + @Override + public String scheme() { + return "{{srv}}"; + } + + @Override + public HashMap<String, String> configMap() { + final HashMap<String, String> map = new HashMap<>(); + {% for field in srvs[srv].config -%} + {{make_populate_map(field)}} + {%- endfor %} + return map; + } } {% endfor %} } diff --git a/dev/src/generate/java.rs b/dev/src/generate/java.rs index 6de6e153c..19b0d0d12 100644 --- a/dev/src/generate/java.rs +++ b/dev/src/generate/java.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -use crate::generate::parser::{sorted_services, ConfigType, Services}; +use crate::generate::parser::{sorted_services, Config, ConfigType, Services}; use anyhow::Result; use minijinja::value::ViaDeserialize; use minijinja::{context, Environment}; @@ -35,6 +35,9 @@ pub fn generate(workspace_dir: PathBuf, services: Services) -> Result<()> { let mut env = Environment::new(); env.add_template("java", include_str!("java.j2"))?; env.add_function("make_java_type", make_java_type); + env.add_function("make_populate_map", make_populate_map); + env.add_filter("case_java_class_name", case_java_class_name); + env.add_filter("case_java_field_name", case_java_field_name); let tmpl = env.get_template("java")?; let output = @@ -43,6 +46,14 @@ pub fn generate(workspace_dir: PathBuf, services: Services) -> Result<()> { Ok(()) } +fn case_java_class_name(s: String) -> String { + heck::AsUpperCamelCase(s).to_string() +} + +fn case_java_field_name(s: String) -> String { + heck::AsLowerCamelCase(s).to_string() +} + fn make_java_type(ty: ViaDeserialize<ConfigType>) -> Result<String, minijinja::Error> { Ok(match ty.0 { ConfigType::Bool => "boolean", @@ -54,3 +65,29 @@ fn make_java_type(ty: ViaDeserialize<ConfigType>) -> Result<String, minijinja::E } .to_string()) } + +fn make_populate_map(field: ViaDeserialize<Config>) -> Result<String, minijinja::Error> { + let is_primitive_type = match field.value { + ConfigType::U64 + | ConfigType::I64 + | ConfigType::U32 + | ConfigType::U16 + | ConfigType::Usize + | ConfigType::Bool => true, + ConfigType::Duration | ConfigType::Vec | ConfigType::String => false, + }; + + let field_name = case_java_field_name(field.name.clone()); + if is_primitive_type { + return Ok(format!("map.put(\"{}\", String.valueOf({}));", field.name, field_name)); + } + + if field.optional { + return Ok(format!( + "if ({} != null) map.put(\"{}\", {});", + field_name, field.name, field_name + )); + } + + Ok(format!("\nmap.put(\"{}\", {});", field.name, field_name)) +}
