Issue-19251: Upgrade dropwizard to 4.x and Jetty to 11.x (#19252)

* Issue-19251: Upgrade dropwizard to 4.x and Jetty to 11.x

* keep jdbi3.37.1 version for ConnectionAware functionality

* Code builds

* Merge with main and fix MCP

* Fix to make server run

* Tests fix

* JsonArray causing issue

* Fix WebSockets

* fix json2schema using jakarta instead of javax

* Fix patch tests

* Fix tests

* Register auditing subtypes in OpenmeteadataOperations

---------

Co-authored-by: mohitdeuex <mohit.y@deuexsolutions.com>
Co-authored-by: sonikashah <sonikashah94@gmail.com>
Co-authored-by: Mohit Yadav <105265192+mohityadav766@users.noreply.github.com>
This commit is contained in:
Sriharsha Chintalapani 2025-05-27 08:01:59 -07:00 committed by GitHub
parent 1ba3250ffc
commit 138d57f890
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
339 changed files with 3451 additions and 2455 deletions

View File

@ -1 +1,2 @@
config.stopBubbling = true
lombok.log.fieldName = LOG

View File

@ -242,6 +242,7 @@
${project.build.directory}/generated-sources/swagger
</output>
<skipOperationExample>true</skipOperationExample>
<skipValidateSpec>true</skipValidateSpec>
</configuration>
</execution>
</executions>

View File

@ -0,0 +1,54 @@
package org.openmetadata.sdk.exception;
import jakarta.ws.rs.core.Response;
public class WebServiceException extends RuntimeException {
private final Response.Status status;
private final String errorType;
private final String message;
public WebServiceException(Response.Status status, String errorType, String message) {
super(message);
this.status = status;
this.errorType = errorType;
this.message = message;
}
public WebServiceException(Response.Status status, String errorType, String message, Throwable cause) {
super(message, cause);
this.status = status;
this.errorType = errorType;
this.message = message;
}
public Response getResponse() {
return Response.status(status)
.type(jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE)
.entity(new ErrorMessage(status.getStatusCode(), errorType, message))
.build();
}
public static class ErrorMessage {
private final int code;
private final String errorType;
private final String message;
public ErrorMessage(int code, String errorType, String message) {
this.code = code;
this.errorType = errorType;
this.message = message;
}
public int getCode() {
return code;
}
public String getErrorType() {
return errorType;
}
public String getMessage() {
return message;
}
}
}

View File

@ -1 +1,2 @@
config.stopBubbling = true
lombok.log.fieldName = LOG

View File

@ -11,7 +11,7 @@
<artifactId>openmetadata-service</artifactId>
<properties>
<dropwizard.swagger.version>2.0.12-1</dropwizard.swagger.version>
<dropwizard.swagger.version>4.0.5-1</dropwizard.swagger.version>
<sonar.junit.reportPaths>${project.basedir}/target/surefire-reports</sonar.junit.reportPaths>
<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco-aggregate/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
<sonar.tests>${project.basedir}/src/test/java</sonar.tests>
@ -31,6 +31,9 @@
<json-smart.version>2.5.2</json-smart.version>
<aws.sdk.version>2.31.1</aws.sdk.version>
<bedrock.runtime.version>2.31.1</bedrock.runtime.version>
<jetty.version>11.0.24</jetty.version>
<logback-core.version>1.4.7</logback-core.version>
<logback-classic.version>1.4.7</logback-classic.version>
</properties>
<dependencyManagement>
@ -79,6 +82,36 @@
</exclusion>
</exclusions>
</dependency>
<!-- Jakarta EL implementation -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>5.0.0-M1</version>
</dependency>
<!-- Jakarta EL API -->
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>5.0.1</version>
</dependency>
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
<!-- Jakarta Bean Validation API -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
<!-- Expression Language Dependencies -->
<dependency>
<groupId>org.glassfish.expressly</groupId>
<artifactId>expressly</artifactId>
<version>5.0.0</version>
</dependency>
<!-- Upgrading due to CVE in com.nimbusds:nimbus-jose-jwt -->
<dependency>
<groupId>com.nimbusds</groupId>
@ -136,11 +169,29 @@
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
<exclusion>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-jdbi3</artifactId>
</dependency>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-sqlobject</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
@ -212,8 +263,8 @@
<artifactId>jersey-media-multipart</artifactId>
</dependency>
<dependency>
<groupId>io.github.maksymdolgykh.dropwizard</groupId>
<artifactId>dropwizard-micrometer-core</artifactId>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-metrics</artifactId>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
@ -244,26 +295,8 @@
</exclusions>
</dependency>
<dependency>
<groupId>io.github.maksymdolgykh.dropwizard</groupId>
<artifactId>dropwizard-micrometer-jdbi</artifactId>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-instrumentation-dropwizard</artifactId>
</dependency>
<dependency>
<groupId>io.dropwizard</groupId>
@ -286,10 +319,6 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.dropwizard.modules</groupId>
<artifactId>dropwizard-health</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
@ -337,14 +366,17 @@
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-core.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-classic.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback-classic.version}</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
@ -391,6 +423,65 @@
<artifactId>everit-json-schema</artifactId>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.http.wrappers</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>${jakarta.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.16.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_dropwizard</artifactId>
<version>0.16.0</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-bom</artifactId>
<version>1.14.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Micrometer Core -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
<version>1.14.5</version>
</dependency>
<!-- Micrometer Prometheus -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.14.5</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.14.5</version>
</dependency>
<!-- Dropwizard Metrics -->
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>4.2.19</version>
</dependency>
<!-- Dependencies for cloudwatch monitoring -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
@ -430,14 +521,6 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.github.java-json-tools</groupId>
<artifactId>json-patch</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
@ -496,8 +579,8 @@
</dependency>
<dependency>
<groupId>org.glassfish.jersey.connectors</groupId>
<artifactId>jersey-jetty-connector</artifactId>
<version>2.40</version>
<artifactId>jersey-apache-connector</artifactId>
<version>${jersey-bom.version}</version>
<scope>test</scope>
</dependency>
<dependency>
@ -520,8 +603,9 @@
</dependency>
<!-- JSON-P: Java API for JSON Processing (JSR 374) -->
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.1.3</version>
</dependency>
<!-- Apache Johnzon: Implementation of the Java API for JSON Processing (JSR 374) -->
@ -606,6 +690,11 @@
<artifactId>socket.io-server</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>io.socket</groupId>
<artifactId>engine.io-server-jetty</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-bom</artifactId>
@ -615,15 +704,35 @@
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-jakarta-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>io.socket</groupId>
<artifactId>engine.io-server-jetty</artifactId>
<version>6.2.1</version>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-server</artifactId>
<version>9.4.57.v20241219</version>
<artifactId>websocket-jetty-api</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-http</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
@ -687,12 +796,27 @@
<version>${java.saml}</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.santurario</groupId>
<artifactId>xmlsec</artifactId>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.onelogin</groupId>
<artifactId>java-saml-core</artifactId>
<version>${java.saml}</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
@ -779,20 +903,45 @@
<groupId>software.amazon.awssdk</groupId>
<artifactId>aws-core</artifactId>
</dependency>
<!-- AWS Auth (if not already included) -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
</dependency>
<!-- Required AWS dependencies -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-bom.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey-bom.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.parsson</groupId>
<artifactId>parsson</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.http.servlet-api</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
<profiles>
@ -969,18 +1118,44 @@
</executions>
</plugin>
<plugin>
<groupId>io.openapitools.swagger</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-maven-plugin-jakarta</artifactId>
<version>2.2.30</version>
<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>${jakarta.servlet-api.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<configuration>
<outputFileName>swagger</outputFileName>
<outputPath>${basedir}/target/classes/assets</outputPath>
<outputFormat>JSONANDYAML</outputFormat>
<resourcePackages>
<resourcePackage>org.openmetadata.service.resources</resourcePackage>
<package>org.openmetadata.service.resources</package>
</resourcePackages>
<useResourcePackagesChildren>true</useResourcePackagesChildren>
<outputDirectory>${basedir}/target/classes/assets/</outputDirectory>
<outputFilename>swagger</outputFilename>
<outputFormats>JSON,YAML</outputFormats>
<prettyPrint>true</prettyPrint>
<swaggerConfig>
<openAPI>
<info>
<title>OpenMetadata APIs</title>
<version>${project.version}</version>
<description>Common types and API definition for OpenMetadata</description>
<contact>
<name>OpenMetadata</name>
<url>https://open-metadata.org/</url>
<email>dev@open-metadata.org</email>
</contact>
<license>
<name>Apache 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
</license>
</info>
<servers>
<server>
<url>/api</url>
@ -991,45 +1166,29 @@
<description>Endpoint URL</description>
</server>
</servers>
<securityRequirements>
<securityRequirement>
<entries>
<entry>
<name>BearerAuth</name>
</entry>
</entries>
</securityRequirement>
</securityRequirements>
<components>
<securitySchemes>
<BearerAuth>
<type>http</type>
<description>Provide Token from Bots settings section in OMD or your Authorization Provider</description>
<scheme>bearer</scheme>
</BearerAuth>
<securityScheme>
<key>BearerAuth</key>
<securityScheme>
<type>http</type>
<scheme>bearer</scheme>
</securityScheme>
</securityScheme>
</securitySchemes>
</components>
<info>
<title>OpenMetadata Apis</title>
<version>${project.parent.version}</version>
<contact>
<email>openmetadata-dev@googlegroups.com</email>
<name>OpenMetadata</name>
<url>https://open-metadata.org</url>
</contact>
<license>
<url>https://www.apache.org/licenses/LICENSE-2.0</url>
<name>Apache 2.0</name>
</license>
</info>
<descriptionFile>../openmetadata-docs/content/v1.7.x/main-concepts/metadata-standard/apis.md</descriptionFile>
</swaggerConfig>
<security>
<securityRequirement>
<name>BearerAuth</name>
</securityRequirement>
</security>
</openAPI>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>generate</goal>
<goal>resolve</goal>
</goals>
</execution>
</executions>

View File

@ -8,7 +8,7 @@ import io.dropwizard.configuration.SubstitutingSourceProvider;
import io.dropwizard.configuration.YamlConfigurationFactory;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.jersey.validation.Validators;
import javax.validation.Validator;
import jakarta.validation.Validator;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;

View File

@ -34,6 +34,8 @@ import static org.openmetadata.service.util.EntityUtil.getLocalColumnName;
import com.fasterxml.jackson.databind.JsonNode;
import com.networknt.schema.JsonSchema;
import com.networknt.schema.ValidationMessage;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
@ -57,8 +59,6 @@ import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVFormat.Builder;

View File

@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
import jakarta.ws.rs.BadRequestException;
import jakarta.ws.rs.core.UriInfo;
import java.lang.reflect.Modifier;
import java.net.URI;
import java.util.ArrayList;
@ -38,8 +40,6 @@ import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

View File

@ -0,0 +1,68 @@
/*
* Copyright 2021 Collate
* Licensed 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.openmetadata.service;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonPatch;
import jakarta.json.JsonReader;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.MultivaluedMap;
import jakarta.ws.rs.ext.MessageBodyReader;
import jakarta.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
@Provider
@Consumes(MediaType.APPLICATION_JSON_PATCH_JSON)
public class JsonPatchMessageBodyReader implements MessageBodyReader<JsonPatch> {
@Override
public boolean isReadable(
Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return JsonPatch.class.isAssignableFrom(type);
}
@Override
public JsonPatch readFrom(
Class<JsonPatch> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream)
throws IOException, WebApplicationException {
try {
// Use Jackson to read the JSON content first to avoid JsonStructure deserialization issues
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(entityStream);
String jsonString = jsonNode.toString();
// Now parse using Jakarta JSON API
try (JsonReader reader = Json.createReader(new StringReader(jsonString))) {
JsonArray jsonArray = reader.readArray();
return Json.createPatch(jsonArray);
}
} catch (Exception e) {
throw new WebApplicationException("Failed to parse JsonPatch", e);
}
}
}

View File

@ -17,8 +17,8 @@ import com.fasterxml.jackson.core.json.JsonReadFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr353.JSR353Module;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import jakarta.ws.rs.ext.ContextResolver;
import jakarta.ws.rs.ext.Provider;
@Provider
public class JsonPatchProvider implements ContextResolver<ObjectMapper> {

View File

@ -15,23 +15,28 @@ package org.openmetadata.service;
import static org.openmetadata.service.util.jdbi.JdbiUtils.createAndSetupJDBI;
import io.dropwizard.Application;
import io.dropwizard.configuration.EnvironmentVariableSubstitutor;
import io.dropwizard.configuration.SubstitutingSourceProvider;
import io.dropwizard.health.conf.HealthConfiguration;
import io.dropwizard.health.core.HealthCheckBundle;
import io.dropwizard.core.Application;
import io.dropwizard.core.server.DefaultServerFactory;
import io.dropwizard.core.setup.Bootstrap;
import io.dropwizard.core.setup.Environment;
import io.dropwizard.jersey.errors.EarlyEofExceptionMapper;
import io.dropwizard.jersey.errors.LoggingExceptionMapper;
import io.dropwizard.jersey.jackson.JsonProcessingExceptionMapper;
import io.dropwizard.jetty.MutableServletContextHandler;
import io.dropwizard.lifecycle.Managed;
import io.dropwizard.server.DefaultServerFactory;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.federecio.dropwizard.swagger.SwaggerBundle;
import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration;
import io.socket.engineio.server.EngineIoServerOptions;
import io.socket.engineio.server.JettyWebSocketHandler;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.FilterRegistration;
import jakarta.servlet.ServletRegistration;
import jakarta.validation.Validation;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.security.KeyStoreException;
@ -40,24 +45,17 @@ import java.security.cert.CertificateException;
import java.util.EnumSet;
import java.util.Optional;
import javax.naming.ConfigurationException;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jetty.http.pathmap.ServletPathSpec;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer;
import org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter;
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ServerProperties;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.sqlobject.SqlObjects;
import org.jetbrains.annotations.NotNull;
@ -165,7 +163,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
DatasourceConfig.initialize(catalogConfig.getDataSourceFactory().getDriverClass());
// Initialize HTTP and JDBI timers
MicrometerBundleSingleton.initLatencyEvents(catalogConfig);
MicrometerBundleSingleton.initLatencyEvents();
jdbi = createAndSetupJDBI(environment, catalogConfig.getDataSourceFactory());
Entity.setCollectionDAO(getDao(jdbi));
@ -208,6 +206,16 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
new ConnectionAwareAnnotationSqlLocator(
catalogConfig.getDataSourceFactory().getDriverClass()));
// Configure validator to use simple message interpolation
environment.setValidator(
Validation.byDefaultProvider()
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new PlatformResourceBundleLocator("jakarta.validation.ValidationMessages")))
.buildValidatorFactory()
.getValidator());
// Validate flyway Migrations
validateMigrations(jdbi, catalogConfig);
@ -320,28 +328,25 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
config.getAuthenticationConfiguration(), config.getAuthorizerConfiguration());
// Register Servlets
ServletRegistration.Dynamic authLogin =
environment
.servlets()
.addServlet("oauth_login", new AuthLoginServlet(authenticationCodeFlowHandler));
authLogin.addMapping("/api/v1/auth/login");
ServletRegistration.Dynamic authCallback =
environment
.servlets()
.addServlet("auth_callback", new AuthCallbackServlet(authenticationCodeFlowHandler));
authCallback.addMapping("/callback");
ServletHolder authLoginHolder =
new ServletHolder(new AuthLoginServlet(authenticationCodeFlowHandler));
authLoginHolder.setName("oauth_login");
environment.getApplicationContext().addServlet(authLoginHolder, "/api/v1/auth/login");
ServletRegistration.Dynamic authLogout =
environment
.servlets()
.addServlet("auth_logout", new AuthLogoutServlet(authenticationCodeFlowHandler));
authLogout.addMapping("/api/v1/auth/logout");
ServletHolder authCallbackHolder =
new ServletHolder(new AuthCallbackServlet(authenticationCodeFlowHandler));
authCallbackHolder.setName("auth_callback");
environment.getApplicationContext().addServlet(authCallbackHolder, "/callback");
ServletRegistration.Dynamic refreshServlet =
environment
.servlets()
.addServlet("auth_refresh", new AuthRefreshServlet(authenticationCodeFlowHandler));
refreshServlet.addMapping("/api/v1/auth/refresh");
ServletHolder authLogoutHolder =
new ServletHolder(new AuthLogoutServlet(authenticationCodeFlowHandler));
authLogoutHolder.setName("auth_logout");
environment.getApplicationContext().addServlet(authLogoutHolder, "/api/v1/auth/logout");
ServletHolder refreshHolder =
new ServletHolder(new AuthRefreshServlet(authenticationCodeFlowHandler));
refreshHolder.setName("auth_refresh");
environment.getApplicationContext().addServlet(refreshHolder, "/api/v1/auth/refresh");
}
}
@ -372,7 +377,8 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
private void registerMicrometerFilter(
Environment environment, EventMonitorConfiguration eventMonitorConfiguration) {
FilterRegistration.Dynamic micrometerFilter =
environment.servlets().addFilter("OMMicrometerHttpFilter", new OMMicrometerHttpFilter());
environment.servlets().addFilter("OMMicrometerHttpFilter", OMMicrometerHttpFilter.class);
micrometerFilter.addMappingForUrlPatterns(
EnumSet.allOf(DispatcherType.class), true, eventMonitorConfiguration.getPathPattern());
}
@ -386,8 +392,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
OpenMetadataAssetServlet assetServlet =
new OpenMetadataAssetServlet(
config.getBasePath(), "/assets", "/", "index.html", webConfiguration);
String pathPattern = "/" + '*';
environment.servlets().addServlet("static", assetServlet).addMapping(pathPattern);
environment.servlets().addServlet("static", assetServlet).addMapping("/*");
}
protected CollectionDAO getDao(Jdbi jdbi) {
@ -397,15 +402,17 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
private void registerSamlServlets(
OpenMetadataApplicationConfig catalogConfig, Environment environment)
throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
if (catalogConfig.getAuthenticationConfiguration() != null
&& catalogConfig.getAuthenticationConfiguration().getProvider().equals(AuthProvider.SAML)) {
// Set up a Session Manager
// Ensure we have a session handler
MutableServletContextHandler contextHandler = environment.getApplicationContext();
if (contextHandler.getSessionHandler() == null) {
contextHandler.setSessionHandler(new SessionHandler());
}
// Initialize default SAML settings (e.g. IDP metadata, SP keys, etc.)
SamlSettingsHolder.getInstance().initDefaultSettings(catalogConfig);
ServletRegistration.Dynamic samlRedirectServlet =
environment.servlets().addServlet("saml_login", new SamlLoginServlet());
@ -421,19 +428,39 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
environment.servlets().addServlet("saml_metadata", new SamlMetadataServlet());
samlMetadataServlet.addMapping("/api/v1/saml/metadata");
ServletRegistration.Dynamic samlRefreshServlet =
environment.servlets().addServlet("saml_refresh_token", new SamlTokenRefreshServlet());
samlRefreshServlet.addMapping("/api/v1/saml/refresh");
// 1) SAML Login
ServletHolder samlLoginHolder = new ServletHolder();
samlLoginHolder.setName("saml_login");
samlLoginHolder.setServlet(new SamlLoginServlet());
contextHandler.addServlet(samlLoginHolder, "/api/v1/saml/login");
ServletRegistration.Dynamic samlLogoutServlet =
environment
.servlets()
.addServlet(
"saml_logout_token",
new SamlLogoutServlet(
catalogConfig.getAuthenticationConfiguration(),
catalogConfig.getAuthorizerConfiguration()));
samlLogoutServlet.addMapping("/api/v1/saml/logout");
// 2) SAML Assertion Consumer (ACS)
ServletHolder samlAcsHolder = new ServletHolder();
samlAcsHolder.setName("saml_acs");
samlAcsHolder.setServlet(
new SamlAssertionConsumerServlet(catalogConfig.getAuthorizerConfiguration()));
contextHandler.addServlet(samlAcsHolder, "/api/v1/saml/acs");
// 3) SAML Metadata
ServletHolder samlMetadataHolder = new ServletHolder();
samlMetadataHolder.setName("saml_metadata");
samlMetadataHolder.setServlet(new SamlMetadataServlet());
contextHandler.addServlet(samlMetadataHolder, "/api/v1/saml/metadata");
// 4) SAML Token Refresh
ServletHolder samlRefreshHolder = new ServletHolder();
samlRefreshHolder.setName("saml_refresh_token");
samlRefreshHolder.setServlet(new SamlTokenRefreshServlet());
contextHandler.addServlet(samlRefreshHolder, "/api/v1/saml/refresh");
// 5) SAML Logout
ServletHolder samlLogoutHolder = new ServletHolder();
samlLogoutHolder.setName("saml_logout_token");
samlLogoutHolder.setServlet(
new SamlLogoutServlet(
catalogConfig.getAuthenticationConfiguration(),
catalogConfig.getAuthorizerConfiguration()));
contextHandler.addServlet(samlLogoutHolder, "/api/v1/saml/logout");
}
}
@ -443,6 +470,14 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
bootstrap.setConfigurationSourceProvider(
new SubstitutingSourceProvider(
bootstrap.getConfigurationSourceProvider(), new EnvironmentVariableSubstitutor(false)));
// Register custom filter factories
bootstrap
.getObjectMapper()
.registerSubtypes(
org.openmetadata.service.events.AuditOnlyFilterFactory.class,
org.openmetadata.service.events.AuditExcludeFilterFactory.class);
bootstrap.addBundle(
new SwaggerBundle<>() {
@Override
@ -451,15 +486,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
return catalogConfig.getSwaggerBundleConfig();
}
});
bootstrap.addBundle(
new HealthCheckBundle<>() {
@Override
protected HealthConfiguration getHealthConfiguration(
final OpenMetadataApplicationConfig configuration) {
return configuration.getHealthConfiguration();
}
});
bootstrap.addBundle(MicrometerBundleSingleton.getInstance());
bootstrap.addBundle(
new OMWebBundle<>() {
@Override
@ -612,6 +639,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
CollectionRegistry.getInstance()
.registerResources(jdbi, environment, config, authorizer, authenticatorHandler, limits);
environment.jersey().register(new JsonPatchProvider());
environment.jersey().register(new JsonPatchMessageBodyReader());
OMErrorPageHandler eph = new OMErrorPageHandler(config.getWebConfiguration());
eph.addErrorPage(Response.Status.NOT_FOUND.getStatusCode(), "/");
environment.getApplicationContext().setErrorHandler(eph);
@ -634,24 +662,28 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
eioOptions.setAllowedCorsOrigins(null);
WebSocketManager.WebSocketManagerBuilder.build(eioOptions);
environment.getApplicationContext().setContextPath("/");
FilterHolder socketAddressFilterHolder = new FilterHolder();
socketAddressFilterHolder.setFilter(socketAddressFilter);
environment
.getApplicationContext()
.addFilter(
new FilterHolder(socketAddressFilter), pathSpec, EnumSet.of(DispatcherType.REQUEST));
.addFilter(socketAddressFilterHolder, pathSpec, EnumSet.of(DispatcherType.REQUEST));
environment.getApplicationContext().addServlet(new ServletHolder(new FeedServlet()), pathSpec);
// Upgrade connection to websocket from Http
try {
WebSocketUpgradeFilter.configure(environment.getApplicationContext());
NativeWebSocketServletContainerInitializer.configure(
JettyWebSocketServletContainerInitializer.configure(
environment.getApplicationContext(),
(context, container) ->
container.addMapping(
new ServletPathSpec(pathSpec),
(servletUpgradeRequest, servletUpgradeResponse) ->
new JettyWebSocketHandler(
WebSocketManager.getInstance().getEngineIoServer())));
} catch (ServletException ex) {
LOG.error("Websocket Upgrade Filter error : " + ex.getMessage());
(servletContext, wsContainer) -> {
wsContainer.setMaxTextMessageSize(65535);
wsContainer.setMaxBinaryMessageSize(65535);
// Register endpoint using Jetty WebSocket API
wsContainer.addMapping(
pathSpec,
(req, resp) ->
new JettyWebSocketHandler(WebSocketManager.getInstance().getEngineIoServer()));
});
} catch (Exception ex) {
LOG.error("Websocket configuration error: {}", ex.getMessage());
}
}

View File

@ -14,13 +14,12 @@
package org.openmetadata.service;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.dropwizard.Configuration;
import io.dropwizard.core.Configuration;
import io.dropwizard.db.DataSourceFactory;
import io.dropwizard.health.conf.HealthConfiguration;
import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import java.util.Map;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import org.openmetadata.DefaultOperationalConfigProvider;
@ -123,11 +122,6 @@ public class OpenMetadataApplicationConfig extends Configuration {
@JsonProperty("fernetConfiguration")
private FernetConfiguration fernetConfiguration;
@JsonProperty("health")
@NotNull
@Valid
private HealthConfiguration healthConfiguration = new HealthConfiguration();
@JsonProperty("secretsManagerConfiguration")
private SecretsManagerConfiguration secretsManagerConfiguration;

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.apps;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class AppException extends WebServiceException {

View File

@ -6,13 +6,13 @@ import static org.openmetadata.service.apps.scheduler.AppScheduler.APP_INFO_KEY;
import static org.openmetadata.service.apps.scheduler.AppScheduler.APP_NAME;
import io.dropwizard.configuration.ConfigurationException;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.ws.rs.core.Response;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.api.configuration.apps.AppPrivateConfig;

View File

@ -19,9 +19,9 @@ import static org.openmetadata.service.util.SubscriptionUtil.getClient;
import static org.openmetadata.service.util.SubscriptionUtil.getTargetsForWebhookAlert;
import static org.openmetadata.service.util.SubscriptionUtil.postWebhookMessage;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Invocation;
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Invocation;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;

View File

@ -21,11 +21,11 @@ import static org.openmetadata.service.util.SubscriptionUtil.getClient;
import static org.openmetadata.service.util.SubscriptionUtil.getTargetsForWebhookAlert;
import static org.openmetadata.service.util.SubscriptionUtil.postWebhookMessage;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Invocation;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Map;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Invocation;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;

View File

@ -20,9 +20,9 @@ import static org.openmetadata.service.util.SubscriptionUtil.getClient;
import static org.openmetadata.service.util.SubscriptionUtil.getTargetsForWebhookAlert;
import static org.openmetadata.service.util.SubscriptionUtil.postWebhookMessage;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Invocation;
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Invocation;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;

View File

@ -23,9 +23,9 @@ import static org.openmetadata.service.util.SubscriptionUtil.postWebhookMessage;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Invocation;
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Invocation;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;

View File

@ -9,6 +9,7 @@ import static org.openmetadata.service.util.SubscriptionUtil.getAdminsData;
import static org.openmetadata.service.util.Utilities.getMonthAndDateFromEpoch;
import static org.openmetadata.service.util.email.TemplateConstants.DATA_INSIGHT_REPORT_TEMPLATE;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
@ -18,7 +19,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.openmetadata.common.utils.CommonUtil;

View File

@ -11,6 +11,7 @@ import static org.openmetadata.service.socket.WebSocketManager.SEARCH_INDEX_JOB_
import static org.openmetadata.service.workflows.searchIndex.ReindexingUtil.ENTITY_TYPE_KEY;
import static org.openmetadata.service.workflows.searchIndex.ReindexingUtil.isDataInsightIndex;
import jakarta.ws.rs.core.Response;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -24,7 +25,6 @@ import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import javax.ws.rs.core.Response;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;

View File

@ -1,11 +1,11 @@
package org.openmetadata.service.clients.pipeline;
import io.prometheus.client.Counter;
import jakarta.ws.rs.core.Response;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import javax.ws.rs.core.Response;
import org.openmetadata.schema.ServiceEntityInterface;
import org.openmetadata.schema.entity.app.App;
import org.openmetadata.schema.entity.app.AppMarketPlaceDefinition;

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.clients.pipeline;
import javax.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;

View File

@ -14,6 +14,7 @@
package org.openmetadata.service.clients.pipeline.airflow;
import com.fasterxml.jackson.core.type.TypeReference;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
@ -27,7 +28,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.utils.URIBuilder;
import org.json.JSONObject;

View File

@ -1,8 +1,8 @@
package org.openmetadata.service.config;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

View File

@ -2,17 +2,17 @@ package org.openmetadata.service.config;
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
import io.dropwizard.Configuration;
import io.dropwizard.ConfiguredBundle;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import java.util.Collections;
import io.dropwizard.core.Configuration;
import io.dropwizard.core.ConfiguredBundle;
import io.dropwizard.core.setup.Bootstrap;
import io.dropwizard.core.setup.Environment;
import jakarta.servlet.DispatcherType;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlets.HeaderFilter;
public abstract class OMWebBundle<T extends Configuration> implements ConfiguredBundle<T> {
@ -75,15 +75,25 @@ public abstract class OMWebBundle<T extends Configuration> implements Configured
protected void configureHeaderFilter(
Environment environment, String uriPath, String urlPattern, Map<String, String> headers) {
String headerConfig =
headers.entrySet().stream()
.map(entry -> "set " + entry.getKey() + ": " + entry.getValue())
.collect(Collectors.joining(","));
Map<String, String> filterConfig = Collections.singletonMap("headerConfig", headerConfig);
FilterRegistration.Dynamic filter =
environment.servlets().addFilter("header-filter-" + uriPath, HeaderFilter.class);
filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, urlPattern);
filter.setInitParameters(filterConfig);
FilterHolder holder = new FilterHolder(new HeaderFilter());
holder.setName("header-filter-" + uriPath);
holder.setInitParameter("headerConfig", headerConfig);
// Add the filter to Jetty's application context with the specified URL pattern
// Note: ensure you have a session handler if needed
if (environment.getApplicationContext().getSessionHandler() == null) {
environment.getApplicationContext().setSessionHandler(new SessionHandler());
}
environment
.getApplicationContext()
.addFilter(holder, urlPattern, EnumSet.of(DispatcherType.REQUEST));
}
private String deriveUrlPattern(String uri) {

View File

@ -2,7 +2,11 @@ package org.openmetadata.service.config;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.dropwizard.web.conf.WebConfiguration;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class OMWebConfiguration extends WebConfiguration {
@JsonProperty("referrer-policy")
@ -16,40 +20,4 @@ public class OMWebConfiguration extends WebConfiguration {
@JsonProperty("pragma")
private String pragma;
public OMWebConfiguration() {}
public ReferrerPolicyHeaderFactory getReferrerPolicyHeaderFactory() {
return this.referrerPolicyHeaderFactory;
}
public void setReferrerPolicyHeaderFactory(
ReferrerPolicyHeaderFactory referrerPolicyHeaderFactory) {
this.referrerPolicyHeaderFactory = referrerPolicyHeaderFactory;
}
public PermissionPolicyHeaderFactory getPermissionPolicyHeaderFactory() {
return this.permissionPolicyHeaderFactory;
}
public String getCacheControl() {
return this.cacheControl;
}
public String getPragma() {
return this.pragma;
}
public void setCacheControl(String cacheControl) {
this.cacheControl = cacheControl;
}
public void setPragma(String pragma) {
this.pragma = pragma;
}
public void setPermissionPolicyHeaderFactory(
PermissionPolicyHeaderFactory permissionPolicyHeaderFactory) {
this.permissionPolicyHeaderFactory = permissionPolicyHeaderFactory;
}
}

View File

@ -1,8 +1,8 @@
package org.openmetadata.service.config;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;

View File

@ -1,8 +1,8 @@
package org.openmetadata.service.config;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

View File

@ -13,9 +13,9 @@
package org.openmetadata.service.events;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import java.util.UUID;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.EntityInterface;
import org.openmetadata.schema.EntityTimeSeriesInterface;
@ -35,6 +35,7 @@ public class AuditEventHandler implements EventHandler {
// Nothing to do
}
@Override
public Void process(
ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
int responseCode = responseContext.getStatus();

View File

@ -4,7 +4,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.dropwizard.logging.filter.FilterFactory;
import io.dropwizard.logging.common.filter.FilterFactory;
import org.slf4j.Marker;
@JsonTypeName("audit-exclude-filter-factory")

View File

@ -4,7 +4,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.dropwizard.logging.filter.FilterFactory;
import io.dropwizard.logging.common.filter.FilterFactory;
import org.slf4j.Marker;
@JsonTypeName("audit-only-filter-factory")

View File

@ -15,10 +15,10 @@ package org.openmetadata.service.events;
import static org.openmetadata.service.formatter.util.FormatterUtil.getChangeEventFromResponseContext;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.core.SecurityContext;
import java.util.Optional;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.core.SecurityContext;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.type.ChangeEvent;

View File

@ -15,17 +15,18 @@ package org.openmetadata.service.events;
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.core.UriInfo;
import jakarta.ws.rs.ext.Provider;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ForkJoinPool;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.service.OpenMetadataApplicationConfig;
import org.openmetadata.service.security.JwtFilter;
@ -85,7 +86,8 @@ public class EventFilter implements ContainerResponseFilter {
if (JwtFilter.EXCLUDED_ENDPOINTS.stream()
.noneMatch(endpoint -> uriInfo.getPath().contains(endpoint))) {
ParallelStreamUtil.runAsync(
() -> eventHandler.process(requestContext, responseContext), forkJoinPool);
(Callable<Void>) () -> eventHandler.process(requestContext, responseContext),
forkJoinPool);
}
});
}

View File

@ -13,8 +13,8 @@
package org.openmetadata.service.events;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import org.openmetadata.service.OpenMetadataApplicationConfig;
public interface EventHandler {

View File

@ -4,7 +4,7 @@ import static org.openmetadata.service.events.scheduled.ServicesStatusJobHandler
import static org.openmetadata.service.events.scheduled.ServicesStatusJobHandler.UNHEALTHY_STATUS;
import io.micrometer.core.instrument.Counter;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.service.Entity;
import org.openmetadata.service.search.SearchHealthStatus;

View File

@ -7,7 +7,7 @@ import static org.openmetadata.service.events.scheduled.ServicesStatusJobHandler
import static org.openmetadata.service.events.scheduled.ServicesStatusJobHandler.JOB_CONTEXT_PIPELINE_SERVICE_CLIENT;
import io.micrometer.core.instrument.Counter;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.sdk.PipelineServiceClientInterface;
import org.quartz.Job;

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.events.scheduled;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.api.configuration.pipelineServiceClient.PipelineServiceClientConfiguration;
import org.openmetadata.sdk.PipelineServiceClientInterface;

View File

@ -20,6 +20,7 @@ import static org.openmetadata.service.Entity.THREAD;
import static org.openmetadata.service.apps.bundles.changeEvent.AbstractEventConsumer.OFFSET_EXTENSION;
import static org.openmetadata.service.security.policyevaluator.CompiledRule.parseExpression;
import jakarta.ws.rs.BadRequestException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
@ -28,7 +29,6 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.ws.rs.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.common.utils.CommonUtil;
import org.openmetadata.schema.api.events.AlertFilteringInput;

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.schema.entity.app.AppExtension;
import org.openmetadata.sdk.exception.WebServiceException;

View File

@ -0,0 +1,15 @@
package org.openmetadata.service.exception;
import jakarta.ws.rs.core.Response;
public class AuthenticationException extends WebServiceException {
private static final String MESSAGE = "Authentication failed";
public AuthenticationException(String message) {
super(Response.Status.UNAUTHORIZED, message);
}
public AuthenticationException(String message, Throwable cause) {
super(Response.Status.UNAUTHORIZED, message, cause);
}
}

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public final class BadRequestException extends WebServiceException {

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class BulkLimitException extends WebServiceException {

View File

@ -118,6 +118,9 @@ public final class CatalogExceptionMessage {
}
public static String invalidName(String name) {
if (name == null) {
return "name must not be null";
}
return String.format("Invalid name %s", name);
}

View File

@ -13,21 +13,22 @@
package org.openmetadata.service.exception;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
import static javax.ws.rs.core.Response.Status.CONFLICT;
import static javax.ws.rs.core.Response.Status.FORBIDDEN;
import static javax.ws.rs.core.Response.Status.Family;
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static javax.ws.rs.core.Response.Status.UNAUTHORIZED;
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE;
import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST;
import static jakarta.ws.rs.core.Response.Status.CONFLICT;
import static jakarta.ws.rs.core.Response.Status.FORBIDDEN;
import static jakarta.ws.rs.core.Response.Status.Family;
import static jakarta.ws.rs.core.Response.Status.NOT_FOUND;
import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED;
import io.dropwizard.jersey.errors.ErrorMessage;
import jakarta.ws.rs.BadRequestException;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.ProcessingException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.concurrent.ThreadLocalRandom;
import javax.ws.rs.Path;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.statement.UnableToExecuteStatementException;
import org.openmetadata.sdk.exception.WebServiceException;
@ -44,8 +45,8 @@ public class CatalogGenericExceptionMapper implements ExceptionMapper<Throwable>
LOG.debug(ex.getMessage());
if (ex instanceof ProcessingException
|| ex instanceof IllegalArgumentException
|| ex instanceof javax.ws.rs.BadRequestException) {
return getResponse(BadRequestException.of().getResponse(), ex);
|| ex instanceof BadRequestException) {
return getResponse(Response.status(Response.Status.BAD_REQUEST).build(), ex);
} else if (ex instanceof UnableToExecuteStatementException) {
if (ex.getCause() instanceof SQLIntegrityConstraintViolationException
|| ex.getCause() instanceof PSQLException

View File

@ -15,13 +15,13 @@ package org.openmetadata.service.exception;
import com.google.common.collect.Iterables;
import io.dropwizard.jersey.errors.ErrorMessage;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
/**
* Dropwizard by default maps the JSON constraint violations to 422 Response code. This overrides that behavior by
@ -38,6 +38,26 @@ public class ConstraintViolationExceptionMapper
.map(
constraintViolation -> {
String name = Iterables.getLast(constraintViolation.getPropertyPath()).getName();
// Map common parameter names to more descriptive names for query parameters
if (name.matches("arg[3456]")) {
// Multiple args can represent limit parameter depending on method signature
name = "query param limit";
} else if ("arg7".equals(name)) {
name = "query param before";
} else if ("arg8".equals(name)) {
name = "query param after";
} else if (name.startsWith("arg") && name.endsWith("Param")) {
// Extract parameter name from method parameter names that end with "Param"
String paramName =
name.substring(0, name.length() - 5); // Remove "Param" suffix
name = "query param " + paramName;
} else if (name.contains("limit") || name.contains("Limit")) {
name = "query param limit";
} else if (name.contains("before") || name.contains("Before")) {
name = "query param before";
} else if (name.contains("after") || name.contains("After")) {
name = "query param after";
}
return name + " " + constraintViolation.getMessage();
})
.toList();

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class CustomExceptionMessage extends WebServiceException {

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class EntityMaskException extends WebServiceException {

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class EntityNotFoundException extends WebServiceException {

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.schema.tests.type.TestCaseResolutionStatusTypes;
import org.openmetadata.sdk.exception.WebServiceException;
@ -12,7 +12,7 @@ public class IncidentManagerException extends WebServiceException {
}
public IncidentManagerException(String message) {
super(Response.Status.INTERNAL_SERVER_ERROR, ERROR_TYPE, message);
super(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), ERROR_TYPE, message);
}
public static IncidentManagerException invalidStatus(

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class IngestionPipelineDeploymentException extends WebServiceException {

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class InvalidServiceConnectionException extends WebServiceException {

View File

@ -15,11 +15,10 @@ package org.openmetadata.service.exception;
import com.fasterxml.jackson.databind.JsonMappingException;
import io.dropwizard.jersey.errors.ErrorMessage;
import javax.annotation.Priority;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import jakarta.annotation.Priority;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
/**
* Dropwizard by default maps the JSON payload format issues (invalid URI etc.) violations to 400 Response with no error
@ -30,9 +29,9 @@ import javax.ws.rs.ext.Provider;
@Priority(1) // Override the default JsonMappingExceptionMapper by setting the priority higher
public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
@Override
public Response toResponse(JsonMappingException exception) {
final Response response = BadRequestException.of().getResponse();
return Response.fromResponse(response)
public jakarta.ws.rs.core.Response toResponse(JsonMappingException exception) {
final jakarta.ws.rs.core.Response response = BadRequestException.of().getResponse();
return jakarta.ws.rs.core.Response.status(response.getStatus())
.type(MediaType.APPLICATION_JSON_TYPE)
.entity(new ErrorMessage(response.getStatus(), exception.getLocalizedMessage()))
.build();

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class LimitsException extends WebServiceException {

View File

@ -2,10 +2,10 @@ package org.openmetadata.service.exception;
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.jetty.server.Dispatcher;
import org.eclipse.jetty.server.Request;

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class ReflectionException extends WebServiceException {

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class SecretsManagerException extends WebServiceException {

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class SystemSettingsException extends WebServiceException {

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.exception;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class UnhandledServerException extends WebServiceException {

View File

@ -0,0 +1,14 @@
package org.openmetadata.service.exception;
import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.core.Response;
public class WebServiceException extends WebApplicationException {
public WebServiceException(Response.Status status, String message) {
super(message, status);
}
public WebServiceException(Response.Status status, String message, Throwable cause) {
super(message, cause, status);
}
}

View File

@ -20,13 +20,13 @@ import static org.openmetadata.service.Entity.FIELD_EXTENSION;
import static org.openmetadata.service.Entity.FIELD_NAME;
import static org.openmetadata.service.formatter.util.FormatterUtil.getEntityLinkForFieldName;
import jakarta.json.JsonArray;
import jakarta.json.JsonObject;
import jakarta.json.JsonValue;
import jakarta.json.stream.JsonParsingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonValue;
import javax.json.stream.JsonParsingException;
import org.apache.commons.lang.StringUtils;
import org.openmetadata.schema.entity.feed.FeedInfo;
import org.openmetadata.schema.entity.feed.Thread;

View File

@ -22,6 +22,8 @@ import static org.openmetadata.service.Entity.THREAD;
import static org.openmetadata.service.formatter.factory.ParserFactory.getFieldParserObject;
import static org.openmetadata.service.formatter.field.DefaultFieldFormatter.getFieldNameChange;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@ -29,8 +31,6 @@ import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.EntityInterface;
import org.openmetadata.schema.EntityTimeSeriesInterface;

View File

@ -6,9 +6,9 @@ import static org.openmetadata.service.governance.workflows.Workflow.UPDATED_BY_
import static org.openmetadata.service.governance.workflows.Workflow.WORKFLOW_RUNTIME_EXCEPTION;
import static org.openmetadata.service.governance.workflows.WorkflowHandler.getProcessDefinitionKeyFromId;
import jakarta.json.JsonPatch;
import java.util.Map;
import java.util.Optional;
import javax.json.JsonPatch;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.flowable.common.engine.api.delegate.Expression;

View File

@ -6,10 +6,10 @@ import static org.openmetadata.service.governance.workflows.Workflow.UPDATED_BY_
import static org.openmetadata.service.governance.workflows.Workflow.WORKFLOW_RUNTIME_EXCEPTION;
import static org.openmetadata.service.governance.workflows.WorkflowHandler.getProcessDefinitionKeyFromId;
import jakarta.json.JsonPatch;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import javax.json.JsonPatch;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.flowable.common.engine.api.delegate.Expression;

View File

@ -89,6 +89,11 @@ import com.google.common.util.concurrent.UncheckedExecutionException;
import com.google.gson.Gson;
import com.networknt.schema.JsonSchema;
import com.networknt.schema.ValidationMessage;
import jakarta.json.JsonPatch;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.UriInfo;
import java.io.IOException;
import java.net.URI;
import java.time.Instant;
@ -120,11 +125,6 @@ import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.json.JsonPatch;
import javax.validation.ConstraintViolationException;
import javax.validation.constraints.NotNull;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

View File

@ -7,6 +7,12 @@ import static org.openmetadata.service.util.jdbi.JdbiUtils.getAfterOffset;
import static org.openmetadata.service.util.jdbi.JdbiUtils.getBeforeOffset;
import static org.openmetadata.service.util.jdbi.JdbiUtils.getOffset;
import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
import jakarta.json.JsonPatch;
import jakarta.json.JsonValue;
import jakarta.ws.rs.core.Response;
import java.beans.IntrospectionException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
@ -17,12 +23,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonPatch;
import javax.json.JsonValue;
import javax.ws.rs.core.Response;
import lombok.Getter;
import org.jdbi.v3.sqlobject.transaction.Transaction;
import org.openmetadata.common.utils.CommonUtil;

View File

@ -39,6 +39,10 @@ import static org.openmetadata.service.jdbi3.UserRepository.TEAMS_FIELD;
import static org.openmetadata.service.util.EntityUtil.compareEntityReference;
import io.jsonwebtoken.lang.Collections;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.UriInfo;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
@ -48,10 +52,6 @@ import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

View File

@ -42,6 +42,8 @@ import static org.openmetadata.service.util.EntityUtil.termReferenceMatch;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.google.gson.Gson;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -55,8 +57,6 @@ import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;

View File

@ -16,11 +16,11 @@ package org.openmetadata.service.jdbi3;
import static org.openmetadata.schema.type.EventType.ENTITY_FIELDS_CHANGED;
import static org.openmetadata.schema.type.EventType.ENTITY_UPDATED;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.Setter;
import org.jdbi.v3.sqlobject.transaction.Transaction;

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.jdbi3;
import static javax.ws.rs.core.Response.Status.OK;
import static jakarta.ws.rs.core.Response.Status.OK;
import static org.openmetadata.common.utils.CommonUtil.collectionOrDefault;
import static org.openmetadata.common.utils.CommonUtil.listOrEmpty;
import static org.openmetadata.common.utils.CommonUtil.nullOrDefault;
@ -44,6 +44,8 @@ import static org.openmetadata.service.search.SearchUtils.isConnectedVia;
import com.fasterxml.jackson.databind.JsonNode;
import com.opencsv.CSVWriter;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
@ -54,8 +56,6 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.ImmutablePair;

View File

@ -26,9 +26,9 @@ import static org.openmetadata.service.resources.tags.TagLabelUtil.addDerivedTag
import static org.openmetadata.service.resources.tags.TagLabelUtil.checkMutuallyExclusive;
import static org.openmetadata.service.util.EntityUtil.taskMatch;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.tuple.Triple;
import org.jdbi.v3.sqlobject.transaction.Transaction;
import org.openmetadata.schema.EntityInterface;

View File

@ -25,12 +25,12 @@ import static org.openmetadata.service.security.policyevaluator.OperationContext
import static org.openmetadata.service.util.EntityUtil.getRuleField;
import static org.openmetadata.service.util.EntityUtil.ruleMatch;
import jakarta.ws.rs.BadRequestException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.ws.rs.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.sqlobject.transaction.Transaction;
import org.openmetadata.schema.entity.policies.Policy;

View File

@ -6,9 +6,9 @@ import static org.openmetadata.schema.type.EventType.ENTITY_FIELDS_CHANGED;
import static org.openmetadata.schema.type.EventType.ENTITY_UPDATED;
import static org.openmetadata.service.Entity.USER;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import java.util.*;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import lombok.SneakyThrows;
import org.jdbi.v3.sqlobject.transaction.Transaction;
import org.openmetadata.schema.entity.data.Query;

View File

@ -12,16 +12,16 @@ import static org.openmetadata.service.Entity.TEAM;
import static org.openmetadata.service.Entity.USER;
import static org.openmetadata.service.jdbi3.UserRepository.TEAMS_FIELD;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.UriInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.sqlobject.transaction.Transaction;

View File

@ -6,13 +6,13 @@ import static org.openmetadata.schema.type.EventType.ENTITY_DELETED;
import static org.openmetadata.schema.type.EventType.ENTITY_UPDATED;
import static org.openmetadata.service.apps.bundles.insights.DataInsightsApp.getDataStreamName;
import jakarta.json.JsonPatch;
import jakarta.json.JsonValue;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import javax.json.JsonPatch;
import javax.json.JsonValue;
import javax.ws.rs.core.Response;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.sqlobject.transaction.Transaction;

View File

@ -35,6 +35,7 @@ import static org.openmetadata.service.util.LambdaExceptionUtil.ignoringComparat
import static org.openmetadata.service.util.LambdaExceptionUtil.rethrowFunction;
import com.google.common.collect.Streams;
import jakarta.json.JsonPatch;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
@ -49,7 +50,6 @@ import java.util.UUID;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.json.JsonPatch;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

View File

@ -43,6 +43,7 @@ import static org.openmetadata.service.exception.CatalogExceptionMessage.invalid
import static org.openmetadata.service.exception.CatalogExceptionMessage.invalidParentCount;
import static org.openmetadata.service.util.EntityUtil.*;
import jakarta.ws.rs.core.Response;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@ -57,7 +58,6 @@ import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

View File

@ -18,6 +18,9 @@ import static org.openmetadata.service.exception.CatalogExceptionMessage.entityN
import static org.openmetadata.service.security.mask.PIIMasker.maskSampleData;
import com.google.gson.Gson;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -26,9 +29,6 @@ import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.sqlobject.transaction.Transaction;

View File

@ -4,6 +4,8 @@ import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
import static org.openmetadata.schema.type.EventType.ENTITY_UPDATED;
import static org.openmetadata.service.Entity.getEntityReferenceByName;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
@ -14,8 +16,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import lombok.SneakyThrows;
import org.jdbi.v3.sqlobject.transaction.Transaction;
import org.openmetadata.schema.EntityInterface;

View File

@ -6,15 +6,15 @@ import static org.openmetadata.service.Entity.TEST_CASE_RESULT;
import static org.openmetadata.service.Entity.TEST_DEFINITION;
import static org.openmetadata.service.Entity.TEST_SUITE;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import javax.json.JsonPatch;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import lombok.SneakyThrows;
import org.openmetadata.common.utils.CommonUtil;
import org.openmetadata.schema.tests.ResultSummary;

View File

@ -16,6 +16,11 @@ import static org.openmetadata.service.search.SearchUtils.getAggregationKeyValue
import static org.openmetadata.service.search.SearchUtils.getAggregationObject;
import static org.openmetadata.service.util.FullyQualifiedName.quoteName;
import jakarta.json.JsonArray;
import jakarta.json.JsonObject;
import jakarta.json.JsonValue;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@ -24,11 +29,6 @@ import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonValue;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.sqlobject.transaction.Transaction;

View File

@ -23,6 +23,8 @@ import static org.openmetadata.service.util.EntityUtil.customFieldMatch;
import static org.openmetadata.service.util.EntityUtil.getCustomField;
import com.fasterxml.jackson.databind.JsonNode;
import jakarta.validation.ConstraintViolationException;
import jakarta.ws.rs.core.UriInfo;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashSet;
@ -31,8 +33,6 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.validation.ConstraintViolationException;
import javax.ws.rs.core.UriInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Triple;
import org.jdbi.v3.sqlobject.transaction.Transaction;

View File

@ -23,11 +23,11 @@ import static org.openmetadata.service.Entity.PIPELINE;
import static org.openmetadata.service.Entity.TABLE;
import static org.openmetadata.service.util.EntityUtil.fieldUpdated;
import jakarta.ws.rs.core.Response;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.mapper.RowMapper;
import org.jdbi.v3.core.statement.StatementContext;

View File

@ -27,6 +27,9 @@ import static org.openmetadata.service.Entity.TEAM;
import static org.openmetadata.service.Entity.USER;
import static org.openmetadata.service.util.EntityUtil.objectMatch;
import jakarta.json.JsonPatch;
import jakarta.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.UriInfo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
@ -38,9 +41,6 @@ import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.json.JsonPatch;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

View File

@ -2,12 +2,12 @@ package org.openmetadata.service.jdbi3;
import static org.openmetadata.service.Entity.WEB_ANALYTIC_EVENT;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.ws.rs.core.Response;
import org.openmetadata.schema.analytics.WebAnalyticEvent;
import org.openmetadata.schema.analytics.WebAnalyticEventData;
import org.openmetadata.schema.analytics.type.WebAnalyticEventType;

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.limits;
import javax.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.SecurityContext;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.entity.app.App;

View File

@ -1,7 +1,7 @@
package org.openmetadata.service.limits;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import org.jdbi.v3.core.Jdbi;
import org.openmetadata.schema.configuration.LimitsConfiguration;
import org.openmetadata.schema.system.LimitsConfig;

View File

@ -1,7 +1,7 @@
package org.openmetadata.service.limits;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import org.jdbi.v3.core.Jdbi;
import org.openmetadata.schema.system.LimitsConfig;
import org.openmetadata.service.OpenMetadataApplicationConfig;

View File

@ -1,5 +1,5 @@
/*
This class should be removed once we migrate to Jakarta.
HttpServletSseServerTransportProvider - Jakarta servlet-based MCP server transport
*/
package org.openmetadata.service.mcp;
@ -11,6 +11,12 @@ import io.modelcontextprotocol.spec.McpSchema;
import io.modelcontextprotocol.spec.McpServerSession;
import io.modelcontextprotocol.spec.McpServerTransport;
import io.modelcontextprotocol.spec.McpServerTransportProvider;
import jakarta.servlet.AsyncContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
@ -18,12 +24,6 @@ import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openmetadata.service.security.JwtFilter;
import org.openmetadata.service.util.JsonUtils;
import org.slf4j.Logger;

View File

@ -2,13 +2,13 @@ package org.openmetadata.service.mcp;
import static org.openmetadata.service.socket.SocketAddressFilter.validatePrefixedTokenRequest;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.openmetadata.service.security.JwtFilter;
public class McpAuthFilter implements Filter {

View File

@ -3,16 +3,17 @@ package org.openmetadata.service.mcp;
import static org.openmetadata.service.search.SearchUtil.searchMetadata;
import com.fasterxml.jackson.databind.JsonNode;
import io.dropwizard.core.setup.Environment;
import io.dropwizard.jetty.MutableServletContextHandler;
import io.dropwizard.setup.Environment;
import io.modelcontextprotocol.server.McpServerFeatures;
import io.modelcontextprotocol.server.McpSyncServer;
import io.modelcontextprotocol.spec.McpSchema;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.Filter;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import javax.servlet.DispatcherType;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
@ -66,7 +67,7 @@ public class McpServer {
new JwtFilter(
config.getAuthenticationConfiguration(), config.getAuthorizerConfiguration()));
contextHandler.addFilter(
new FilterHolder(authFilter), "/mcp/*", EnumSet.of(DispatcherType.REQUEST));
new FilterHolder((Filter) authFilter), "/mcp/*", EnumSet.of(DispatcherType.REQUEST));
}
public void addTools(McpSyncServer server) {

View File

@ -1,7 +1,7 @@
package org.openmetadata.service.mcp.tools;
import jakarta.json.JsonPatch;
import java.util.Map;
import javax.json.JsonPatch;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.EntityInterface;
import org.openmetadata.schema.type.change.ChangeSource;

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.migration;
import javax.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.migration;
import javax.ws.rs.core.Response;
import jakarta.ws.rs.core.Response;
import org.openmetadata.sdk.exception.WebServiceException;
public class MigrationValidationClientException extends WebServiceException {

View File

@ -1,6 +1,6 @@
package org.openmetadata.service.migration.context;
import javax.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,8 +1,8 @@
package org.openmetadata.service.migration.utils.v120;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Handle;
import org.openmetadata.schema.entity.data.GlossaryTerm;

View File

@ -1,15 +1,15 @@
package org.openmetadata.service.migration.utils.v140;
import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObject;
import jakarta.json.JsonString;
import jakarta.json.JsonValue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Handle;
import org.json.JSONArray;

View File

@ -3,15 +3,15 @@ package org.openmetadata.service.migration.utils.v150;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Handle;
import org.jdbi.v3.core.statement.UnableToExecuteStatementException;

View File

@ -1,7 +1,7 @@
package org.openmetadata.service.migration.utils.v159;
import jakarta.json.JsonObject;
import java.util.UUID;
import javax.json.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Handle;
import org.jdbi.v3.core.statement.Update;

View File

@ -13,7 +13,7 @@
package org.openmetadata.service.monitoring;
import io.micrometer.core.instrument.Counter;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.entity.services.ingestionPipelines.IngestionPipeline;
import org.openmetadata.schema.entity.services.ingestionPipelines.PipelineStatus;

View File

@ -14,12 +14,13 @@
package org.openmetadata.service.resources;
import com.google.common.annotations.VisibleForTesting;
import io.dropwizard.setup.Environment;
import io.dropwizard.core.setup.Environment;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.ws.rs.Path;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -30,10 +31,8 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.ws.rs.Path;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.jdbi.v3.core.Jdbi;
import org.openmetadata.schema.Function;
import org.openmetadata.schema.type.CollectionDescriptor;
@ -43,17 +42,19 @@ import org.openmetadata.service.limits.Limits;
import org.openmetadata.service.security.Authorizer;
import org.openmetadata.service.security.auth.AuthenticatorHandler;
import org.openmetadata.service.util.ReflectionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Collection registry is a registry of all the REST collections in the catalog. It is used for building REST endpoints
* that anchor all the collections as follows: - .../api/v1 Provides information about all the collections in the
* catalog - .../api/v1/collection-name provides sub collections or resources in that collection
*/
@Slf4j
public final class CollectionRegistry {
public static final List<String> PACKAGES = List.of("org.openmetadata", "io.collate");
private static CollectionRegistry instance = null;
private static volatile boolean initialized = false;
private static final Logger LOG = LoggerFactory.getLogger(CollectionRegistry.class);
/** Map of collection endpoint path to collection details */
private final Map<String, CollectionDetails> collectionMap = new LinkedHashMap<>();
@ -205,9 +206,9 @@ public final class CollectionRegistry {
if (a instanceof Path path) {
// Use @Path annotation to compile href
collectionInfo.withHref(URI.create(path.value()));
} else if (a instanceof Api api) {
// Use @Api annotation to get documentation about the collection
collectionInfo.withDocumentation(api.value());
} else if (a instanceof Tag tag) {
// Use @Tag annotation to get documentation about the collection
collectionInfo.withDocumentation(tag.description());
} else if (a instanceof Collection collection) {
// Use @Collection annotation to get initialization information for the class
collectionInfo.withName(collection.name());
@ -279,10 +280,10 @@ public final class CollectionRegistry {
resource =
clz.getDeclaredConstructor(Jdbi.class, Authorizer.class)
.newInstance(jdbi, authorizer);
} catch (NoSuchMethodException execp) {
} catch (NoSuchMethodException except) {
try {
resource = clz.getDeclaredConstructor(Limits.class).newInstance(limits);
} catch (NoSuchMethodException except) {
} catch (NoSuchMethodException exception) {
resource = Class.forName(resourceClass).getConstructor().newInstance();
}
}

Some files were not shown because too many files have changed in this diff Show More