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))
+}

Reply via email to