mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-12-04 11:33:07 +00:00
- Encode Entity fqn
This commit is contained in:
parent
f818b587ac
commit
c5f4d49333
@ -14,6 +14,7 @@
|
||||
package org.openmetadata.service.formatter.decorators;
|
||||
|
||||
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
|
||||
import static org.openmetadata.service.util.EntityUtil.encodeEntityFqn;
|
||||
import static org.openmetadata.service.util.email.EmailUtil.getSmtpSettings;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -61,11 +62,12 @@ public class EmailMessageDecorator implements MessageDecorator<EmailMessage> {
|
||||
|
||||
@Override
|
||||
public String getEntityUrl(String prefix, String fqn, String additionalParams) {
|
||||
String encodedFqn = encodeEntityFqn(fqn);
|
||||
return String.format(
|
||||
"<a href = '%s/%s/%s%s'>%s</a>",
|
||||
"<a href='%s/%s/%s%s'>%s</a>",
|
||||
getSmtpSettings().getOpenMetadataUrl(),
|
||||
prefix,
|
||||
fqn.trim(),
|
||||
encodedFqn,
|
||||
nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams),
|
||||
fqn.trim());
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
package org.openmetadata.service.formatter.decorators;
|
||||
|
||||
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
|
||||
import static org.openmetadata.service.util.EntityUtil.encodeEntityFqn;
|
||||
|
||||
import org.openmetadata.schema.type.ChangeEvent;
|
||||
import org.openmetadata.service.formatter.util.FeedMessage;
|
||||
@ -57,11 +58,12 @@ public class FeedMessageDecorator implements MessageDecorator<FeedMessage> {
|
||||
|
||||
@Override
|
||||
public String getEntityUrl(String prefix, String fqn, String additionalParams) {
|
||||
String encodedFqn = encodeEntityFqn(fqn);
|
||||
return String.format(
|
||||
"[%s](/%s/%s%s)",
|
||||
fqn,
|
||||
prefix,
|
||||
fqn.trim(),
|
||||
prefix,
|
||||
encodedFqn,
|
||||
nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams));
|
||||
}
|
||||
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
package org.openmetadata.service.formatter.decorators;
|
||||
|
||||
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
|
||||
import static org.openmetadata.service.util.EntityUtil.encodeEntityFqn;
|
||||
import static org.openmetadata.service.util.email.EmailUtil.getSmtpSettings;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -76,11 +77,12 @@ public class GChatMessageDecorator implements MessageDecorator<GChatMessage> {
|
||||
|
||||
@Override
|
||||
public String getEntityUrl(String prefix, String fqn, String additionalParams) {
|
||||
String encodedFqn = encodeEntityFqn(fqn);
|
||||
return String.format(
|
||||
"<%s/%s/%s%s|%s>",
|
||||
getSmtpSettings().getOpenMetadataUrl(),
|
||||
prefix,
|
||||
fqn.trim().replace(" ", "%20"),
|
||||
encodedFqn,
|
||||
nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams),
|
||||
fqn.trim());
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
package org.openmetadata.service.formatter.decorators;
|
||||
|
||||
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
|
||||
import static org.openmetadata.service.util.EntityUtil.encodeEntityFqn;
|
||||
import static org.openmetadata.service.util.email.EmailUtil.getSmtpSettings;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -81,11 +82,13 @@ public class MSTeamsMessageDecorator implements MessageDecorator<TeamsMessage> {
|
||||
|
||||
@Override
|
||||
public String getEntityUrl(String prefix, String fqn, String additionalParams) {
|
||||
String encodedFqn = encodeEntityFqn(fqn);
|
||||
return String.format(
|
||||
"[%s](/%s/%s%s)",
|
||||
"[%s](%s/%s/%s%s)",
|
||||
fqn.trim(),
|
||||
getSmtpSettings().getOpenMetadataUrl(),
|
||||
prefix,
|
||||
encodedFqn,
|
||||
nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams));
|
||||
}
|
||||
|
||||
|
||||
@ -33,6 +33,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import lombok.SneakyThrows;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch;
|
||||
import org.openmetadata.common.utils.CommonUtil;
|
||||
@ -48,8 +49,11 @@ import org.openmetadata.service.jdbi3.TestCaseRepository;
|
||||
import org.openmetadata.service.resources.feeds.MessageParser;
|
||||
import org.openmetadata.service.util.EntityUtil;
|
||||
import org.openmetadata.service.util.FeedUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public interface MessageDecorator<T> {
|
||||
Logger LOG = LoggerFactory.getLogger(MessageDecorator.class);
|
||||
String CONNECTION_TEST_DESCRIPTION =
|
||||
"This is a test message, receiving this message confirms that you have successfully configured OpenMetadata to receive alerts.";
|
||||
|
||||
@ -85,34 +89,40 @@ public interface MessageDecorator<T> {
|
||||
|
||||
T buildTestMessage();
|
||||
|
||||
@SneakyThrows
|
||||
default String buildEntityUrl(String entityType, EntityInterface entityInterface) {
|
||||
String fqn = resolveFullyQualifiedName(entityType, entityInterface);
|
||||
|
||||
String entityUrl = "";
|
||||
switch (entityType) {
|
||||
case Entity.TEST_CASE:
|
||||
if (entityInterface instanceof TestCase testCase) {
|
||||
return getEntityUrl(
|
||||
entityUrl =
|
||||
getEntityUrl(
|
||||
"incident-manager", testCase.getFullyQualifiedName(), "test-case-results");
|
||||
}
|
||||
break;
|
||||
|
||||
case Entity.GLOSSARY_TERM:
|
||||
return getEntityUrl(Entity.GLOSSARY, fqn, "");
|
||||
entityUrl = getEntityUrl(Entity.GLOSSARY, fqn, "");
|
||||
break;
|
||||
|
||||
case Entity.TAG:
|
||||
return getEntityUrl("tags", fqn.split("\\.")[0], "");
|
||||
entityUrl = getEntityUrl("tags", fqn.split("\\.")[0], "");
|
||||
break;
|
||||
|
||||
case Entity.INGESTION_PIPELINE:
|
||||
return getIngestionPipelineUrl(this, entityType, entityInterface);
|
||||
entityUrl = getIngestionPipelineUrl(this, entityType, entityInterface);
|
||||
break;
|
||||
|
||||
default:
|
||||
return getEntityUrl(entityType, fqn, "");
|
||||
entityUrl = getEntityUrl(entityType, fqn, "");
|
||||
}
|
||||
|
||||
// Fallback in case of no match
|
||||
return getEntityUrl(entityType, fqn, "");
|
||||
LOG.debug("buildEntityUrl for Alert: {}", entityUrl);
|
||||
return entityUrl;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
default String buildThreadUrl(
|
||||
ThreadType threadType, String entityType, EntityInterface entityInterface) {
|
||||
|
||||
@ -120,30 +130,34 @@ public interface MessageDecorator<T> {
|
||||
threadType.equals(ThreadType.Task) ? "activity_feed/tasks" : "activity_feed/all";
|
||||
|
||||
String fqn = resolveFullyQualifiedName(entityType, entityInterface);
|
||||
|
||||
String entityUrl = "";
|
||||
switch (entityType) {
|
||||
case Entity.TEST_CASE:
|
||||
if (entityInterface instanceof TestCase) {
|
||||
TestCase testCase = (TestCase) entityInterface;
|
||||
return getEntityUrl("incident-manager", testCase.getFullyQualifiedName(), "issues");
|
||||
entityUrl = getEntityUrl("incident-manager", testCase.getFullyQualifiedName(), "issues");
|
||||
}
|
||||
break;
|
||||
|
||||
case Entity.GLOSSARY_TERM:
|
||||
return getEntityUrl(Entity.GLOSSARY, fqn, activeTab);
|
||||
entityUrl = getEntityUrl(Entity.GLOSSARY, fqn, activeTab);
|
||||
break;
|
||||
|
||||
case Entity.TAG:
|
||||
return getEntityUrl("tags", fqn.split("\\.")[0], "");
|
||||
entityUrl = getEntityUrl("tags", fqn.split("\\.")[0], "");
|
||||
break;
|
||||
|
||||
case Entity.INGESTION_PIPELINE:
|
||||
return getIngestionPipelineUrl(this, entityType, entityInterface);
|
||||
entityUrl = getIngestionPipelineUrl(this, entityType, entityInterface);
|
||||
break;
|
||||
|
||||
default:
|
||||
return getEntityUrl(entityType, fqn, activeTab);
|
||||
entityUrl = getEntityUrl(entityType, fqn, activeTab);
|
||||
}
|
||||
|
||||
// Fallback in case of no match
|
||||
return getEntityUrl(entityType, fqn, activeTab);
|
||||
LOG.debug("buildThreadUrl for Alert: {}", entityUrl);
|
||||
return entityUrl;
|
||||
}
|
||||
|
||||
// Helper function to resolve FQN if null or empty
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
package org.openmetadata.service.formatter.decorators;
|
||||
|
||||
import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty;
|
||||
import static org.openmetadata.service.util.EntityUtil.encodeEntityFqn;
|
||||
import static org.openmetadata.service.util.email.EmailUtil.getSmtpSettings;
|
||||
|
||||
import com.slack.api.model.block.Blocks;
|
||||
@ -77,14 +78,17 @@ public class SlackMessageDecorator implements MessageDecorator<SlackMessage> {
|
||||
return "~";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEntityUrl(String prefix, String fqn, String additionalParams) {
|
||||
String encodedFqn = encodeEntityFqn(fqn);
|
||||
return String.format(
|
||||
"<%s/%s/%s%s|%s>",
|
||||
getSmtpSettings().getOpenMetadataUrl(),
|
||||
prefix,
|
||||
fqn.trim().replaceAll(" ", "%20"),
|
||||
encodedFqn, // Use encoded FQN in the URL
|
||||
nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams),
|
||||
fqn.trim());
|
||||
fqn.trim() // Display text remains unencoded
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -21,6 +21,8 @@ import static org.openmetadata.service.jdbi3.RoleRepository.DOMAIN_ONLY_ACCESS_R
|
||||
import static org.openmetadata.service.security.DefaultAuthorizer.getSubjectContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
@ -702,4 +704,8 @@ public final class EntityUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String encodeEntityFqn(String fqn) {
|
||||
return URLEncoder.encode(fqn.trim(), StandardCharsets.UTF_8).replace("+", "%20");
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user