This is an automated email from the ASF dual-hosted git repository.
diqiu50 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 3277e3549b [#10718] feat(catalog-glue): Initialize catalog-glue module
structure (#10719)
3277e3549b is described below
commit 3277e3549bbd28ed62063fdb5abd6442950bfaec
Author: Yuhui <[email protected]>
AuthorDate: Wed Apr 8 20:48:00 2026 +0800
[#10718] feat(catalog-glue): Initialize catalog-glue module structure
(#10719)
### What changes were proposed in this pull request?
Add the `catalog-glue` Gradle module with stub classes and build system
registration:
- `GlueCatalog` (`provider=glue`), `GlueCatalogOperations`, properties
metadata, and capability stubs
- `aws-glue` library alias in `gradle/libs.versions.toml`
- Module registration in `settings.gradle.kts` and
`copyCatalogLibAndConfigs` in root `build.gradle.kts`
- `META-INF/services` CatalogProvider entry
### Why are the changes needed?
Fix: #10718
### Does this PR introduce _any_ user-facing change?
No. All new classes are stubs; no runtime behavior is added.
### How was this patch tested?
`./gradlew :catalogs:catalog-glue:build -x test`
---
build.gradle.kts | 1 +
catalogs/catalog-glue/build.gradle.kts | 100 +++++++++++++++++++++
.../apache/gravitino/catalog/glue/GlueCatalog.java | 87 ++++++++++++++++++
.../catalog/glue/GlueCatalogCapability.java | 29 ++++++
.../catalog/glue/GlueCatalogOperations.java | 64 +++++++++++++
.../glue/GlueCatalogPropertiesMetadata.java | 40 +++++++++
.../catalog/glue/GlueSchemaPropertiesMetadata.java | 40 +++++++++
.../catalog/glue/GlueTablePropertiesMetadata.java | 40 +++++++++
.../services/org.apache.gravitino.CatalogProvider | 19 ++++
gradle/libs.versions.toml | 1 +
settings.gradle.kts | 1 +
11 files changed, 422 insertions(+)
diff --git a/build.gradle.kts b/build.gradle.kts
index 7359395845..cee839c828 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1150,6 +1150,7 @@ tasks {
register("copyCatalogLibAndConfigs", Copy::class) {
dependsOn(
":catalogs:catalog-fileset:copyLibAndConfig",
+ ":catalogs:catalog-glue:copyLibAndConfig",
":catalogs:catalog-hive:copyLibAndConfig",
":catalogs:catalog-jdbc-doris:copyLibAndConfig",
":catalogs:catalog-jdbc-mysql:copyLibAndConfig",
diff --git a/catalogs/catalog-glue/build.gradle.kts
b/catalogs/catalog-glue/build.gradle.kts
new file mode 100644
index 0000000000..e28af8144f
--- /dev/null
+++ b/catalogs/catalog-glue/build.gradle.kts
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+description = "catalog-glue"
+
+plugins {
+ `maven-publish`
+ id("java")
+ id("idea")
+}
+
+dependencies {
+ compileOnly(project(":api"))
+ compileOnly(project(":common"))
+ compileOnly(project(":core"))
+
+ compileOnly(libs.lombok)
+
+ implementation(project(":catalogs:catalog-common")) {
+ exclude("*")
+ }
+
+ implementation(libs.aws.glue)
+ implementation(libs.aws.sts)
+ implementation(libs.guava)
+ implementation(libs.slf4j.api)
+
+ annotationProcessor(libs.lombok)
+
+ testImplementation(project(":api"))
+ testImplementation(project(":common"))
+ testImplementation(project(":core"))
+
+ testImplementation(libs.junit.jupiter.api)
+ testImplementation(libs.mockito.core)
+ testImplementation(libs.slf4j.api)
+
+ testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+tasks {
+ register("runtimeJars", Copy::class) {
+ from(configurations.runtimeClasspath)
+ into("build/libs")
+ }
+
+ val copyCatalogLibs by registering(Copy::class) {
+ dependsOn("jar", "runtimeJars")
+ from("build/libs") {
+ exclude("guava-*.jar")
+ exclude("log4j-*.jar")
+ exclude("slf4j-*.jar")
+ exclude("error_prone_annotations-*.jar")
+ }
+ into("$rootDir/distribution/package/catalogs/glue/libs")
+ }
+
+ val copyCatalogConfig by registering(Copy::class) {
+ from("src/main/resources")
+ into("$rootDir/distribution/package/catalogs/glue/conf")
+
+ exclude { details ->
+ details.file.isDirectory()
+ }
+
+ fileMode = 0b111101101
+ }
+
+ register("copyLibAndConfig", Copy::class) {
+ dependsOn(copyCatalogConfig, copyCatalogLibs)
+ }
+}
+
+tasks.test {
+ val skipITs = project.hasProperty("skipITs")
+ if (skipITs) {
+ exclude("**/integration/test/**")
+ } else {
+ dependsOn(tasks.jar)
+ }
+}
+
+tasks.getByName("generateMetadataFileForMavenJavaPublication") {
+ dependsOn("runtimeJars")
+}
diff --git
a/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalog.java
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalog.java
new file mode 100644
index 0000000000..f016121cfa
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalog.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.glue;
+
+import java.util.Map;
+import org.apache.gravitino.connector.BaseCatalog;
+import org.apache.gravitino.connector.CatalogOperations;
+import org.apache.gravitino.connector.PropertiesMetadata;
+import org.apache.gravitino.connector.capability.Capability;
+
+/**
+ * Implementation of an AWS Glue Data Catalog connector in Apache Gravitino.
+ *
+ * <p>Exposes all Glue table types (Hive, Iceberg, Delta, Parquet) through a
single catalog using
+ * {@code provider=glue}.
+ */
+public class GlueCatalog extends BaseCatalog<GlueCatalog> {
+
+ // TODO PR-02: replace stubs with real implementations
+ static final GlueCatalogPropertiesMetadata CATALOG_PROPERTIES_METADATA =
+ new GlueCatalogPropertiesMetadata();
+
+ static final GlueSchemaPropertiesMetadata SCHEMA_PROPERTIES_METADATA =
+ new GlueSchemaPropertiesMetadata();
+
+ static final GlueTablePropertiesMetadata TABLE_PROPERTIES_METADATA =
+ new GlueTablePropertiesMetadata();
+
+ /**
+ * Returns the short name of the Glue catalog.
+ *
+ * @return The short name of the catalog.
+ */
+ @Override
+ public String shortName() {
+ return "glue";
+ }
+
+ /**
+ * Creates a new instance of {@link GlueCatalogOperations} with the provided
configuration.
+ *
+ * @param config The configuration map for the Glue catalog operations.
+ * @return A new instance of {@link GlueCatalogOperations}.
+ */
+ @Override
+ protected CatalogOperations newOps(Map<String, String> config) {
+ // TODO PR-04: initialize GlueClient and wire up real operations
+ return new GlueCatalogOperations();
+ }
+
+ @Override
+ public Capability newCapability() {
+ // TODO PR-02: implement GlueCatalogCapability
+ return new GlueCatalogCapability();
+ }
+
+ @Override
+ public PropertiesMetadata catalogPropertiesMetadata() throws
UnsupportedOperationException {
+ return CATALOG_PROPERTIES_METADATA;
+ }
+
+ @Override
+ public PropertiesMetadata schemaPropertiesMetadata() throws
UnsupportedOperationException {
+ return SCHEMA_PROPERTIES_METADATA;
+ }
+
+ @Override
+ public PropertiesMetadata tablePropertiesMetadata() throws
UnsupportedOperationException {
+ return TABLE_PROPERTIES_METADATA;
+ }
+}
diff --git
a/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogCapability.java
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogCapability.java
new file mode 100644
index 0000000000..9a17cf6a4d
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogCapability.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.glue;
+
+import org.apache.gravitino.connector.capability.Capability;
+
+/**
+ * Capability declarations for the AWS Glue Data Catalog connector.
+ *
+ * <p>TODO PR-02: declare actual capabilities (case sensitivity, NOT NULL
support, etc.) based on
+ * Glue's known constraints.
+ */
+public class GlueCatalogCapability implements Capability {}
diff --git
a/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogOperations.java
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogOperations.java
new file mode 100644
index 0000000000..22a2175f7b
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogOperations.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.glue;
+
+import java.io.IOException;
+import java.util.Map;
+import org.apache.gravitino.Catalog;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.connector.CatalogInfo;
+import org.apache.gravitino.connector.CatalogOperations;
+import org.apache.gravitino.connector.HasPropertyMetadata;
+
+/**
+ * Operations implementation for the AWS Glue Data Catalog connector.
+ *
+ * <p>This is a scaffold stub. Full implementation will be added in PR-02
through PR-06.
+ *
+ * <p>TODO PR-04: implement SupportsSchemas (Schema CRUD + exception mapping)
+ *
+ * <p>TODO PR-05: implement TableCatalog (Table CRUD + type detection)
+ */
+public class GlueCatalogOperations implements CatalogOperations {
+
+ // TODO PR-04: add GlueClient field and catalogId
+
+ @Override
+ public void initialize(
+ Map<String, String> config, CatalogInfo info, HasPropertyMetadata
propertiesMetadata)
+ throws RuntimeException {
+ // TODO PR-04: build GlueClient via GlueClientProvider and store catalogId
+ }
+
+ @Override
+ public void testConnection(
+ NameIdentifier catalogIdent,
+ Catalog.Type type,
+ String provider,
+ String comment,
+ Map<String, String> properties)
+ throws Exception {
+ // TODO PR-04: call GlueClient.getDatabases() to verify connectivity
+ }
+
+ @Override
+ public void close() throws IOException {
+ // TODO PR-04: close GlueClient
+ }
+}
diff --git
a/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogPropertiesMetadata.java
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogPropertiesMetadata.java
new file mode 100644
index 0000000000..eacaca3950
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueCatalogPropertiesMetadata.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.glue;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.connector.BaseCatalogPropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+/**
+ * Properties metadata for the AWS Glue Data Catalog connector.
+ *
+ * <p>TODO PR-02: add required properties (aws-region, aws-glue-catalog-id)
and optional properties
+ * (credentials, endpoint override, default-table-format, table-type-filter).
+ */
+public class GlueCatalogPropertiesMetadata extends
BaseCatalogPropertiesMetadata {
+
+ private static final Map<String, PropertyEntry<?>> PROPERTIES_METADATA =
ImmutableMap.of();
+
+ @Override
+ protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+ return PROPERTIES_METADATA;
+ }
+}
diff --git
a/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueSchemaPropertiesMetadata.java
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueSchemaPropertiesMetadata.java
new file mode 100644
index 0000000000..23f80afc26
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueSchemaPropertiesMetadata.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.glue;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.connector.BasePropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+/**
+ * Properties metadata for Glue schemas (databases).
+ *
+ * <p>AWS Glue Database has no extra properties beyond name, description, and
location, so this
+ * metadata is intentionally empty.
+ */
+public class GlueSchemaPropertiesMetadata extends BasePropertiesMetadata {
+
+ private static final Map<String, PropertyEntry<?>> PROPERTIES_METADATA =
ImmutableMap.of();
+
+ @Override
+ protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+ return PROPERTIES_METADATA;
+ }
+}
diff --git
a/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueTablePropertiesMetadata.java
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueTablePropertiesMetadata.java
new file mode 100644
index 0000000000..bec87e2e36
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/java/org/apache/gravitino/catalog/glue/GlueTablePropertiesMetadata.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.glue;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.connector.BasePropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+/**
+ * Properties metadata for Glue tables.
+ *
+ * <p>TODO PR-02: support passthrough of Glue Table.parameters() keys such as
{@code table_type} and
+ * {@code metadata_location} for Iceberg, Delta, and other formats.
+ */
+public class GlueTablePropertiesMetadata extends BasePropertiesMetadata {
+
+ private static final Map<String, PropertyEntry<?>> PROPERTIES_METADATA =
ImmutableMap.of();
+
+ @Override
+ protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+ return PROPERTIES_METADATA;
+ }
+}
diff --git
a/catalogs/catalog-glue/src/main/resources/META-INF/services/org.apache.gravitino.CatalogProvider
b/catalogs/catalog-glue/src/main/resources/META-INF/services/org.apache.gravitino.CatalogProvider
new file mode 100644
index 0000000000..b2ac94f964
--- /dev/null
+++
b/catalogs/catalog-glue/src/main/resources/META-INF/services/org.apache.gravitino.CatalogProvider
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.gravitino.catalog.glue.GlueCatalog
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 061a98ae1e..a02f7d0d76 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -141,6 +141,7 @@ ql-expression = "4.0.3"
[libraries]
aspectj-aspectjrt = { group = "org.aspectj", name = "aspectjrt", version.ref =
"aspectj" }
+aws-glue = { group = "software.amazon.awssdk", name = "glue", version.ref =
"awssdk" }
aws-iam = { group = "software.amazon.awssdk", name = "iam", version.ref =
"awssdk" }
aws-policy = { group = "software.amazon.awssdk", name = "iam-policy-builder",
version.ref = "awssdk" }
aws-s3 = { group = "software.amazon.awssdk", name = "s3", version.ref =
"awssdk" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index ad4ac46178..8490f34b8f 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -27,6 +27,7 @@ val scalaVersion: String =
gradle.startParameter.projectProperties["scalaVersion
include("api", "common", "core", "server", "server-common")
include("catalogs:catalog-common")
+include("catalogs:catalog-glue")
include("catalogs:catalog-hive")
include("catalogs:hive-metastore-common")
include("catalogs:hive-metastore2-libs", "catalogs:hive-metastore3-libs")