From 2ff4d97b0a6db2cc3f357e40cc4409c6f87f70d6 Mon Sep 17 00:00:00 2001 From: gbrodman Date: Fri, 7 Mar 2025 13:12:32 -0500 Subject: [PATCH] Refactor console bulk domain action types (#2708) This makes the action types a bit simpler -- this is possible because we've reduced the scope of domain actions that we want to natively support --- .../ConsoleBulkDomainDeleteActionType.java | 12 ++-- .../ConsoleBulkDomainSuspendActionType.java | 12 ++-- .../ConsoleBulkDomainUnsuspendActionType.java | 12 ++-- .../domains/ConsoleDomainActionType.java | 56 ++++++++++++------- 4 files changed, 49 insertions(+), 43 deletions(-) diff --git a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainDeleteActionType.java b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainDeleteActionType.java index 1e05fa17d..84f1327b1 100644 --- a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainDeleteActionType.java +++ b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainDeleteActionType.java @@ -14,12 +14,11 @@ package google.registry.ui.server.console.domains; -import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import google.registry.model.console.ConsolePermission; /** An action that will run a delete EPP command on the given domain. */ -public class ConsoleBulkDomainDeleteActionType implements ConsoleDomainActionType { +public class ConsoleBulkDomainDeleteActionType extends ConsoleDomainActionType { private static final String DOMAIN_DELETE_XML = """ @@ -42,16 +41,13 @@ public class ConsoleBulkDomainDeleteActionType implements ConsoleDomainActionTyp """; - private final String reason; - public ConsoleBulkDomainDeleteActionType(JsonElement jsonElement) { - this.reason = jsonElement.getAsJsonObject().get("reason").getAsString(); + super(jsonElement); } @Override - public String getXmlContentsToRun(String domainName) { - return ConsoleDomainActionType.fillSubstitutions( - DOMAIN_DELETE_XML, ImmutableMap.of("DOMAIN_NAME", domainName, "REASON", reason)); + protected String getXmlTemplate() { + return DOMAIN_DELETE_XML; } @Override diff --git a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainSuspendActionType.java b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainSuspendActionType.java index 12c646313..b690438dd 100644 --- a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainSuspendActionType.java +++ b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainSuspendActionType.java @@ -14,12 +14,11 @@ package google.registry.ui.server.console.domains; -import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import google.registry.model.console.ConsolePermission; /** An action that will suspend the given domain, assigning all 5 server*Prohibited statuses. */ -public class ConsoleBulkDomainSuspendActionType implements ConsoleDomainActionType { +public class ConsoleBulkDomainSuspendActionType extends ConsoleDomainActionType { private static final String DOMAIN_SUSPEND_XML = """ @@ -52,16 +51,13 @@ public class ConsoleBulkDomainSuspendActionType implements ConsoleDomainActionTy """; - private final String reason; - public ConsoleBulkDomainSuspendActionType(JsonElement jsonElement) { - this.reason = jsonElement.getAsJsonObject().get("reason").getAsString(); + super(jsonElement); } @Override - public String getXmlContentsToRun(String domainName) { - return ConsoleDomainActionType.fillSubstitutions( - DOMAIN_SUSPEND_XML, ImmutableMap.of("DOMAIN_NAME", domainName, "REASON", reason)); + protected String getXmlTemplate() { + return DOMAIN_SUSPEND_XML; } @Override diff --git a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainUnsuspendActionType.java b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainUnsuspendActionType.java index 0759f05b1..0d3a959e1 100644 --- a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainUnsuspendActionType.java +++ b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleBulkDomainUnsuspendActionType.java @@ -14,12 +14,11 @@ package google.registry.ui.server.console.domains; -import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import google.registry.model.console.ConsolePermission; /** An action that will unsuspend the given domain, removing all 5 server*Prohibited statuses. */ -public class ConsoleBulkDomainUnsuspendActionType implements ConsoleDomainActionType { +public class ConsoleBulkDomainUnsuspendActionType extends ConsoleDomainActionType { private static final String DOMAIN_SUSPEND_XML = """ @@ -52,16 +51,13 @@ public class ConsoleBulkDomainUnsuspendActionType implements ConsoleDomainAction """; - private final String reason; - public ConsoleBulkDomainUnsuspendActionType(JsonElement jsonElement) { - this.reason = jsonElement.getAsJsonObject().get("reason").getAsString(); + super(jsonElement); } @Override - public String getXmlContentsToRun(String domainName) { - return ConsoleDomainActionType.fillSubstitutions( - DOMAIN_SUSPEND_XML, ImmutableMap.of("DOMAIN_NAME", domainName, "REASON", reason)); + protected String getXmlTemplate() { + return DOMAIN_SUSPEND_XML; } @Override diff --git a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleDomainActionType.java b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleDomainActionType.java index 35e4e7017..47fdd953e 100644 --- a/core/src/main/java/google/registry/ui/server/console/domains/ConsoleDomainActionType.java +++ b/core/src/main/java/google/registry/ui/server/console/domains/ConsoleDomainActionType.java @@ -14,20 +14,18 @@ package google.registry.ui.server.console.domains; -import com.google.common.collect.ImmutableMap; import com.google.common.escape.Escaper; import com.google.common.xml.XmlEscapers; import com.google.gson.JsonElement; import google.registry.model.console.ConsolePermission; -import java.util.Map; /** * A type of EPP action to perform on domain(s), run by the {@link ConsoleBulkDomainAction}. * - *

Each {@link BulkAction} defines the class that implements that action, including the EPP XML - * that will be run and the permission required. + *

Each {@link BulkAction} defines the class that extends that action, including the EPP XML that + * will be run and the permission required. */ -public interface ConsoleDomainActionType { +public abstract class ConsoleDomainActionType { enum BulkAction { DELETE(ConsoleBulkDomainDeleteActionType.class), @@ -45,20 +43,6 @@ public interface ConsoleDomainActionType { } } - Escaper XML_ESCAPER = XmlEscapers.xmlContentEscaper(); - - static String fillSubstitutions(String xmlTemplate, ImmutableMap replacements) { - String xml = xmlTemplate; - for (Map.Entry entry : replacements.entrySet()) { - xml = xml.replaceAll("%" + entry.getKey() + "%", XML_ESCAPER.escape(entry.getValue())); - } - return xml; - } - - String getXmlContentsToRun(String domainName); - - ConsolePermission getNecessaryPermission(); - static ConsoleDomainActionType parseActionType(String bulkDomainAction, JsonElement jsonElement) { BulkAction bulkAction = BulkAction.valueOf(bulkDomainAction); try { @@ -67,4 +51,38 @@ public interface ConsoleDomainActionType { throw new RuntimeException(e); // shouldn't happen } } + + private static final Escaper XML_ESCAPER = XmlEscapers.xmlContentEscaper(); + + private final String reason; + + public ConsoleDomainActionType(JsonElement jsonElement) { + this.reason = jsonElement.getAsJsonObject().get("reason").getAsString(); + } + + /** Returns the full XML representing this action, including all substitutions. */ + public String getXmlContentsToRun(String domainName) { + return fillSubstitutions(getXmlTemplate(), domainName); + } + + /** Returns the permission necessary to successfully perform this action. */ + public abstract ConsolePermission getNecessaryPermission(); + + /** Returns the XML template contents for this action. */ + protected abstract String getXmlTemplate(); + + /** + * Fills out the default set of substitutions in the provided XML template. + * + *

Override this method if non-default substitutions are required. + */ + protected String fillSubstitutions(String xmlTemplate, String domainName) { + String xml = xmlTemplate; + xml = replaceValue(xml, "DOMAIN_NAME", domainName); + return replaceValue(xml, "REASON", reason); + } + + private String replaceValue(String xml, String key, String value) { + return xml.replaceAll("%" + key + "%", XML_ESCAPER.escape(value)); + } }