From 95ac1dbc727303ff50eaa93eb0ad68e0c76f5b65 Mon Sep 17 00:00:00 2001 From: Jon Marius Venstad Date: Mon, 4 Apr 2022 16:40:47 +0200 Subject: Revert "Jonmv/reapply application name validation" --- .../com/yahoo/config/provision/ApplicationId.java | 66 +++++++++++----------- .../yahoo/config/provision/ApplicationName.java | 39 ++++++++++--- .../com/yahoo/config/provision/InstanceName.java | 39 ++++++++++--- .../com/yahoo/config/provision/TenantName.java | 39 ++++++++++--- .../yahoo/config/provision/ApplicationIdTest.java | 2 +- 5 files changed, 130 insertions(+), 55 deletions(-) (limited to 'config-provisioning/src') diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java index 796fe586fb9..76d4ae3f1a6 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java @@ -3,10 +3,6 @@ package com.yahoo.config.provision; import com.yahoo.cloud.config.ApplicationIdConfig; -import java.util.Comparator; -import java.util.Objects; -import java.util.regex.Pattern; - /** * A complete, immutable identification of an application instance. * @@ -14,40 +10,27 @@ import java.util.regex.Pattern; * @author vegard * @author bratseth */ -public class ApplicationId implements Comparable { - - // TODO: remove '.' and '*' from this pattern. - static final Pattern namePattern = Pattern.compile("(?!\\.\\.)[a-zA-Z0-9_.*-]{1,64}"); - - private static final ApplicationId global = new ApplicationId(TenantName.from("*"), - ApplicationName.from("*"), - InstanceName.from("*")) { - @Override public boolean equals(Object other) { return this == other; } - }; - - private static final Comparator comparator = Comparator.comparing(ApplicationId::tenant) - .thenComparing(ApplicationId::application) - .thenComparing(ApplicationId::instance) - .thenComparing(global::equals, Boolean::compare); +public final class ApplicationId implements Comparable { private final TenantName tenant; private final ApplicationName application; private final InstanceName instance; + + private final String stringValue; private final String serializedForm; + public ApplicationId(ApplicationIdConfig config) { + this(TenantName.from(config.tenant()), ApplicationName.from(config.application()), InstanceName.from(config.instance())); + } + private ApplicationId(TenantName tenant, ApplicationName applicationName, InstanceName instanceName) { this.tenant = tenant; this.application = applicationName; this.instance = instanceName; + this.stringValue = toStringValue(); this.serializedForm = toSerializedForm(); } - public static ApplicationId from(ApplicationIdConfig config) { - return from(TenantName.from(config.tenant()), - ApplicationName.from(config.application()), - InstanceName.from(config.instance())); - } - public static ApplicationId from(TenantName tenant, ApplicationName application, InstanceName instance) { return new ApplicationId(tenant, application, instance); } @@ -61,7 +44,7 @@ public class ApplicationId implements Comparable { if (parts.length < 3) throw new IllegalArgumentException("Application ids must be on the form tenant:application:instance, but was " + idString); - return from(parts[0], parts[1], parts[2]); + return new Builder().tenant(parts[0]).applicationName(parts[1]).instanceName(parts[2]).build(); } public static ApplicationId fromFullString(String idString) { @@ -69,11 +52,11 @@ public class ApplicationId implements Comparable { if (parts.length < 3) throw new IllegalArgumentException("Application ids must be on the form tenant.application.instance, but was " + idString); - return from(parts[0], parts[1], parts[2]); + return new Builder().tenant(parts[0]).applicationName(parts[1]).instanceName(parts[2]).build(); } @Override - public int hashCode() { return Objects.hash(tenant, application, instance); } + public int hashCode() { return stringValue.hashCode(); } @Override public boolean equals(Object other) { @@ -89,6 +72,10 @@ public class ApplicationId implements Comparable { /** Returns a serialized form of the content of this: tenant:application:instance */ public String serializedForm() { return serializedForm; } + private String toStringValue() { + return "tenant '" + tenant + "', application '" + application + "', instance '" + instance + "'"; + } + /** Returns "dotted" string (tenant.application.instance) with instance name omitted if it is "default" */ public String toShortString() { return tenant().value() + "." + application().value() + @@ -101,7 +88,7 @@ public class ApplicationId implements Comparable { } private String toSerializedForm() { - return tenant.value() + ":" + application.value() + ":" + instance.value(); + return tenant + ":" + application + ":" + instance; } @Override @@ -113,7 +100,18 @@ public class ApplicationId implements Comparable { @Override public int compareTo(ApplicationId other) { - return comparator.compare(this, other); + int diff; + + diff = tenant.compareTo(other.tenant); + if (diff != 0) { return diff; } + + diff = application.compareTo(other.application); + if (diff != 0) { return diff; } + + diff = instance.compareTo(other.instance); + if (diff != 0) { return diff; } + + return 0; } /** Returns an application id where all fields are "default" */ @@ -121,10 +119,12 @@ public class ApplicationId implements Comparable { return new ApplicationId(TenantName.defaultName(), ApplicationName.defaultName(), InstanceName.defaultName()); } - // TODO: kill this - /** Returns a very special application id, which is not equal to any other id. */ + /** Returns an application id where all fields are "*" */ public static ApplicationId global() { - return global; + return new Builder().tenant("*") + .applicationName("*") + .instanceName("*") + .build(); } public static class Builder { diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationName.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationName.java index f2585913015..f16c126dec2 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationName.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationName.java @@ -1,7 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; -import ai.vespa.validation.PatternedStringWrapper; +import java.util.Objects; /** * Represents an applications name, which may be any kind of string or default. This type is defined @@ -10,12 +10,28 @@ import ai.vespa.validation.PatternedStringWrapper; * @author Ulf Lilleengen * @since 5.25 */ -public class ApplicationName extends PatternedStringWrapper { +public class ApplicationName implements Comparable { - private static final ApplicationName defaultName = new ApplicationName("default"); + private final String applicationName; - private ApplicationName(String name) { - super(name, ApplicationId.namePattern, "application name"); + private ApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + @Override + public int hashCode() { + return applicationName.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ApplicationName)) return false; + return Objects.equals(((ApplicationName) obj).applicationName, applicationName); + } + + @Override + public String toString() { + return applicationName; } public static ApplicationName from(String name) { @@ -23,11 +39,20 @@ public class ApplicationName extends PatternedStringWrapper { } public static ApplicationName defaultName() { - return defaultName; + return new ApplicationName("default"); } public boolean isDefault() { - return equals(defaultName); + return equals(ApplicationName.defaultName()); + } + + public String value() { + return applicationName; + } + + @Override + public int compareTo(ApplicationName name) { + return this.applicationName.compareTo(name.applicationName); } } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/InstanceName.java b/config-provisioning/src/main/java/com/yahoo/config/provision/InstanceName.java index fc40d351465..8101b70b943 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/InstanceName.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/InstanceName.java @@ -1,7 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; -import ai.vespa.validation.PatternedStringWrapper; +import java.util.Objects; /** * Represents an applications instance name, which may be any kind of string or default. This type is defined @@ -9,12 +9,30 @@ import ai.vespa.validation.PatternedStringWrapper; * * @author Ulf Lilleengen */ -public class InstanceName extends PatternedStringWrapper { +public class InstanceName implements Comparable { - private static final InstanceName defaultName = new InstanceName("default"); + private static final InstanceName defaultInstance = new InstanceName("default"); - private InstanceName(String name) { - super(name, ApplicationId.namePattern, "instance name"); + private final String instanceName; + + private InstanceName(String instanceName) { + this.instanceName = instanceName; + } + + @Override + public int hashCode() { + return instanceName.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof InstanceName)) return false; + return Objects.equals(((InstanceName) obj).instanceName, instanceName); + } + + @Override + public String toString() { + return instanceName; } public static InstanceName from(String name) { @@ -22,15 +40,22 @@ public class InstanceName extends PatternedStringWrapper { } public static InstanceName defaultName() { - return defaultName; + return defaultInstance; } public boolean isDefault() { - return equals(defaultName); + return equals(InstanceName.defaultName()); } public boolean isTester() { return value().endsWith("-t"); } + public String value() { return instanceName; } + + @Override + public int compareTo(InstanceName instance) { + return instanceName.compareTo(instance.instanceName); + } + } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/TenantName.java b/config-provisioning/src/main/java/com/yahoo/config/provision/TenantName.java index 9909ab360a0..92fe5345b4e 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/TenantName.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/TenantName.java @@ -1,31 +1,56 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; -import ai.vespa.validation.PatternedStringWrapper; +import java.util.Objects; /** * Represents a tenant in the provision API. * * @author Ulf Lilleengen */ -public class TenantName extends PatternedStringWrapper { +public class TenantName implements Comparable { - private static final TenantName defaultName = new TenantName("default"); + private final String name; private TenantName(String name) { - super(name, ApplicationId.namePattern, "tenant name"); + this.name = name; } + public String value() { return name; } + + /** + * Create a {@link TenantName} with a given name. + * + * @param name Name of tenant. + * @return instance of {@link TenantName}. + */ public static TenantName from(String name) { return new TenantName(name); } + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof TenantName)) return false; + return Objects.equals(((TenantName)obj).value(), value()); + } + + @Override + public String toString() { + return name; + } + public static TenantName defaultName() { - return defaultName; + return from("default"); } - public boolean isDefault() { - return equals(defaultName); + @Override + public int compareTo(TenantName that) { + return this.name.compareTo(that.name); } } diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java index 01904b5eece..c82230f7edf 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java @@ -106,7 +106,7 @@ public class ApplicationIdTest { builder.tenant("a"); builder.application("b"); builder.instance("c"); - ApplicationId applicationId = ApplicationId.from(new ApplicationIdConfig(builder)); + ApplicationId applicationId = new ApplicationId(new ApplicationIdConfig(builder)); assertEquals("a", applicationId.tenant().value()); assertEquals("b", applicationId.application().value()); assertEquals("c", applicationId.instance().value()); -- cgit v1.2.3