From ba3667079d5484d66df75597f40402986fd58610 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 8 Jul 2024 10:41:30 +0200 Subject: [PATCH] WIP: entity reference based on type-structure --- doc/hs-hosting-asset-type-structure.md | 108 ++++++++++------- .../hs/booking/item/HsBookingItemType.java | 2 +- .../hs/hosting/asset/HsHostingAssetType.java | 114 +++++++++++++----- .../HsCloudServerHostingAssetValidator.java | 6 +- ...HsDomainDnsSetupHostingAssetValidator.java | 6 +- .../HsDomainSetupHostingAssetValidator.java | 6 +- .../HsEMailAliasHostingAssetValidator.java | 4 +- .../HsHostingAssetEntityValidator.java | 98 ++++++--------- .../HsManagedServerHostingAssetValidator.java | 6 +- ...sManagedWebspaceHostingAssetValidator.java | 9 +- .../HsUnixUserHostingAssetValidator.java | 5 +- 11 files changed, 202 insertions(+), 162 deletions(-) diff --git a/doc/hs-hosting-asset-type-structure.md b/doc/hs-hosting-asset-type-structure.md index 7b5a185f..24ebda74 100644 --- a/doc/hs-hosting-asset-type-structure.md +++ b/doc/hs-hosting-asset-type-structure.md @@ -1,6 +1,8 @@ + + ## HostingAsset Type Structure -### packages Webspace, Domain, Server +### packages Server, Webspace, Domain ```plantuml @startuml @@ -16,6 +18,12 @@ package Booking #99bcdb { } package Hosting #white { + package Server #99bcdb { + entity HA_CLOUD_SERVER + entity HA_MANAGED_SERVER + entity HA_IP_NUMBER + } + package Webspace #99bcdb { entity HA_MANAGED_WEBSPACE entity HA_UNIX_USER @@ -23,6 +31,7 @@ package Hosting #white { } package Domain #99bcdb { + entity HA_DOMAIN_SETUP entity HA_DOMAIN_DNS_SETUP entity HA_DOMAIN_HTTP_SETUP entity HA_DOMAIN_EMAIL_SUBMISSION_SETUP @@ -30,27 +39,21 @@ package Hosting #white { entity HA_EMAIL_ADDRESS } - package Server #99bcdb { - entity HA_CLOUD_SERVER - entity HA_MANAGED_SERVER - entity HA_IP_NUMBER - } - } -BI_CLOUD_SERVER o..> BI_PRIVATE_CLOUD -BI_MANAGED_SERVER o..> BI_PRIVATE_CLOUD -BI_MANAGED_WEBSPACE o..> BI_MANAGED_SERVER +BI_CLOUD_SERVER *--> BI_PRIVATE_CLOUD +BI_MANAGED_SERVER *--> BI_PRIVATE_CLOUD +BI_MANAGED_WEBSPACE *--> BI_MANAGED_SERVER -HA_CLOUD_SERVER *==> BI_CLOUD_SERVER -HA_MANAGED_SERVER *==> BI_MANAGED_SERVER -HA_MANAGED_WEBSPACE *==> BI_MANAGED_WEBSPACE +HA_CLOUD_SERVER ==* BI_CLOUD_SERVER +HA_MANAGED_SERVER ==* BI_MANAGED_SERVER +HA_MANAGED_WEBSPACE ==* BI_MANAGED_WEBSPACE HA_MANAGED_WEBSPACE o..> HA_MANAGED_SERVER HA_UNIX_USER *==> HA_MANAGED_WEBSPACE -HA_DOMAIN_DNS_SETUP *==> BI_DOMAIN_DNS_SETUP +HA_DOMAIN_DNS_SETUP ==* BI_DOMAIN_DNS_SETUP HA_DOMAIN_HTTP_SETUP *==> HA_MANAGED_WEBSPACE HA_DOMAIN_HTTP_SETUP o..> HA_UNIX_USER -HA_DOMAIN_EMAIL_SUBMISSION_SETUP *==> BI_DOMAIN_EMAIL_SUBMISSION_SETUP +HA_DOMAIN_EMAIL_SUBMISSION_SETUP ==* BI_DOMAIN_EMAIL_SUBMISSION_SETUP HA_DOMAIN_EMAIL_SUBMISSION_SETUP o..> HA_MANAGED_WEBSPACE HA_DOMAIN_EMAIL_MAILBOX_SETUP *==> HA_MANAGED_WEBSPACE HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE @@ -58,8 +61,15 @@ HA_EMAIL_ADDRESS *==> HA_DOMAIN_EMAIL_MAILBOX_SETUP HA_IP_NUMBER o..> HA_CLOUD_SERVER HA_IP_NUMBER o..> HA_MANAGED_SERVER HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE +package Legend { + SUB_ENTITY1 *--> REQUIRED_PARENT_ENTITY + SUB_ENTITY2 *..> OPTIONAL_PARENT_ENTITY + ASSIGNED_ENTITY1 o--> REQUIRED_ASSIGNED_TO_ENTITY1 + ASSIGNED_ENTITY2 o..> OPTIONAL_ASSIGNED_TO_ENTITY2 +} +Booking -down[hidden]->Legend ``` -### packages Webspace, MariaDB, Server +### packages MariaDB, Server, Webspace ```plantuml @startuml @@ -75,12 +85,6 @@ package Booking #99bcdb { } package Hosting #white { - package Webspace #99bcdb { - entity HA_MANAGED_WEBSPACE - entity HA_UNIX_USER - entity HA_EMAIL_ALIAS - } - package MariaDB #99bcdb { entity HA_MARIADB_INSTANCE entity HA_MARIADB_USER @@ -93,15 +97,21 @@ package Hosting #white { entity HA_IP_NUMBER } + package Webspace #99bcdb { + entity HA_MANAGED_WEBSPACE + entity HA_UNIX_USER + entity HA_EMAIL_ALIAS + } + } -BI_CLOUD_SERVER o..> BI_PRIVATE_CLOUD -BI_MANAGED_SERVER o..> BI_PRIVATE_CLOUD -BI_MANAGED_WEBSPACE o..> BI_MANAGED_SERVER +BI_CLOUD_SERVER *--> BI_PRIVATE_CLOUD +BI_MANAGED_SERVER *--> BI_PRIVATE_CLOUD +BI_MANAGED_WEBSPACE *--> BI_MANAGED_SERVER -HA_CLOUD_SERVER *==> BI_CLOUD_SERVER -HA_MANAGED_SERVER *==> BI_MANAGED_SERVER -HA_MANAGED_WEBSPACE *==> BI_MANAGED_WEBSPACE +HA_CLOUD_SERVER ==* BI_CLOUD_SERVER +HA_MANAGED_SERVER ==* BI_MANAGED_SERVER +HA_MANAGED_WEBSPACE ==* BI_MANAGED_WEBSPACE HA_MANAGED_WEBSPACE o..> HA_MANAGED_SERVER HA_UNIX_USER *==> HA_MANAGED_WEBSPACE HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE @@ -113,8 +123,15 @@ HA_MARIADB_DATABASE o..> HA_MARIADB_INSTANCE HA_IP_NUMBER o..> HA_CLOUD_SERVER HA_IP_NUMBER o..> HA_MANAGED_SERVER HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE +package Legend { + SUB_ENTITY1 *--> REQUIRED_PARENT_ENTITY + SUB_ENTITY2 *..> OPTIONAL_PARENT_ENTITY + ASSIGNED_ENTITY1 o--> REQUIRED_ASSIGNED_TO_ENTITY1 + ASSIGNED_ENTITY2 o..> OPTIONAL_ASSIGNED_TO_ENTITY2 +} +Booking -down[hidden]->Legend ``` -### packages PostgreSQL, Webspace, Server +### packages Server, PostgreSQL, Webspace ```plantuml @startuml @@ -130,6 +147,12 @@ package Booking #99bcdb { } package Hosting #white { + package Server #99bcdb { + entity HA_CLOUD_SERVER + entity HA_MANAGED_SERVER + entity HA_IP_NUMBER + } + package PostgreSQL #99bcdb { entity HA_PGSQL_INSTANCE entity HA_PGSQL_USER @@ -142,21 +165,15 @@ package Hosting #white { entity HA_EMAIL_ALIAS } - package Server #99bcdb { - entity HA_CLOUD_SERVER - entity HA_MANAGED_SERVER - entity HA_IP_NUMBER - } - } -BI_CLOUD_SERVER o..> BI_PRIVATE_CLOUD -BI_MANAGED_SERVER o..> BI_PRIVATE_CLOUD -BI_MANAGED_WEBSPACE o..> BI_MANAGED_SERVER +BI_CLOUD_SERVER *--> BI_PRIVATE_CLOUD +BI_MANAGED_SERVER *--> BI_PRIVATE_CLOUD +BI_MANAGED_WEBSPACE *--> BI_MANAGED_SERVER -HA_CLOUD_SERVER *==> BI_CLOUD_SERVER -HA_MANAGED_SERVER *==> BI_MANAGED_SERVER -HA_MANAGED_WEBSPACE *==> BI_MANAGED_WEBSPACE +HA_CLOUD_SERVER ==* BI_CLOUD_SERVER +HA_MANAGED_SERVER ==* BI_MANAGED_SERVER +HA_MANAGED_WEBSPACE ==* BI_MANAGED_WEBSPACE HA_MANAGED_WEBSPACE o..> HA_MANAGED_SERVER HA_UNIX_USER *==> HA_MANAGED_WEBSPACE HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE @@ -168,5 +185,12 @@ HA_PGSQL_DATABASE o..> HA_PGSQL_INSTANCE HA_IP_NUMBER o..> HA_CLOUD_SERVER HA_IP_NUMBER o..> HA_MANAGED_SERVER HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE +package Legend { + SUB_ENTITY1 *--> REQUIRED_PARENT_ENTITY + SUB_ENTITY2 *..> OPTIONAL_PARENT_ENTITY + ASSIGNED_ENTITY1 o--> REQUIRED_ASSIGNED_TO_ENTITY1 + ASSIGNED_ENTITY2 o..> OPTIONAL_ASSIGNED_TO_ENTITY2 +} +Booking -down[hidden]->Legend ``` - #This code generated was by HsHostingAssetType.main, do not amend manually. + This code generated was by HsHostingAssetType.main, do not amend manually. diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemType.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemType.java index dfc0129e..720b3ecc 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemType.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemType.java @@ -25,7 +25,7 @@ public enum HsBookingItemType implements Node { @Override public List edges() { return ofNullable(parentItemType) - .map(p -> (nodeName() + " o..> " + p.nodeName())) + .map(p -> (nodeName() + " *--> " + p.nodeName())) .stream().toList(); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java index 2f7e2f66..99f673fd 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetType.java @@ -1,5 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset; +import lombok.AllArgsConstructor; +import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity; import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.booking.item.Node; @@ -10,10 +12,13 @@ import java.nio.file.StandardOpenOption; import java.util.Collection; import java.util.List; import java.util.Set; +import java.util.function.Function; import static java.util.Arrays.stream; import static java.util.stream.Collectors.joining; import static net.hostsharing.hsadminng.hs.hosting.asset.EntityTypeRelation.*; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.RelationPolicy.OPTIONAL; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.RelationPolicy.REQUIRED; public enum HsHostingAssetType implements Node { CLOUD_SERVER( // named e.g. vm1234 @@ -33,9 +38,10 @@ public enum HsHostingAssetType implements Node { inGroup("Webspace"), requiredParent(MANAGED_WEBSPACE)), -// DOMAIN_SETUP( // named e.g. example.org -// inGroup("Domain") -// ), + @Deprecated + DOMAIN_SETUP( // named e.g. example.org + inGroup("Domain") + ), DOMAIN_DNS_SETUP( // named e.g. example.org inGroup("Domain"), @@ -101,11 +107,11 @@ public enum HsHostingAssetType implements Node { ); final String groupName; - private final EntityTypeRelation[] relations; + private final EntityTypeRelation[] relations; HsHostingAssetType( final String groupName, - final EntityTypeRelation... relations + final EntityTypeRelation... relations ) { this.groupName = groupName; this.relations = relations; @@ -116,6 +122,45 @@ public enum HsHostingAssetType implements Node { return groupName; } + + public RelationPolicy bookingItemPolicy() { + return stream(relations).filter(r -> r.relatedType == (Object) HsBookingItemType.class).findAny() + .map(r -> r.relationType) + .orElse(RelationPolicy.FORBIDDEN); + } + + public HsBookingItemType bookingItemType() { + return stream(relations).filter(r -> r.relatedType == (Object) HsBookingItemType.class).findAny() + .map(r -> HsBookingItemType.valueOf(r.relatedType.toString())) + .orElse(null); + } + + public RelationPolicy parentAssetPolicy() { + return stream(relations).filter(r -> r.relatedType == (Object) HsHostingAssetType.class).findAny() + .map(r -> r.relationType) + .orElse(RelationPolicy.FORBIDDEN); + } + + public HsHostingAssetType parentAssetType() { + return stream(relations).filter(r -> r.relatedType == (Object) HsHostingAssetType.class).findAny() + .map(r -> HsHostingAssetType.valueOf(r.relatedType.toString())) + .orElse(null); + } + + public RelationPolicy assignedToAssetPolicy() { + return stream(relations).filter(r -> r.relatedType == (Object) HsHostingAssetType.class).findAny() + .map(r -> r.relationType) + .orElse(RelationPolicy.FORBIDDEN); + } + + public HsHostingAssetType assignedToAssetType() { + return stream(relations).filter(r -> r.relatedType == (Object) HsHostingAssetType.class).findAny() + .map(r -> HsHostingAssetType.valueOf(r.relatedType.toString())) + .orElse(null); + } + + + @Override public List edges() { return stream(relations) @@ -176,6 +221,13 @@ public enum HsHostingAssetType implements Node { %{bookingItemEdges} %{hostingAssetEdges} + package Legend { + SUB_ENTITY1 *--> REQUIRED_PARENT_ENTITY + SUB_ENTITY2 *..> OPTIONAL_PARENT_ENTITY + ASSIGNED_ENTITY1 o--> REQUIRED_ASSIGNED_TO_ENTITY1 + ASSIGNED_ENTITY2 o..> OPTIONAL_ASSIGNED_TO_ENTITY2 + } + Booking -down[hidden]->Legend ``` """ .replace("%{packages}", String.join(", ", includedHostingGroups)) @@ -201,6 +253,8 @@ public enum HsHostingAssetType implements Node { Files.writeString( Path.of("doc/hs-hosting-asset-type-structure.md"), """ + + ## HostingAsset Type Structure """, @@ -210,52 +264,48 @@ public enum HsHostingAssetType implements Node { // .map(t -> t.groupName) // .collect(toSet())); - renderAsPlantUML(Set.of("Domain", "Server", "Webspace")); - renderAsPlantUML(Set.of("Server", "Webspace", "MariaDB")); - renderAsPlantUML(Set.of("Server", "Webspace", "PostgreSQL")); + renderAsPlantUML(Set.of("Domain", "Webspace", "Server")); + renderAsPlantUML(Set.of("MariaDB", "Webspace", "Server")); + renderAsPlantUML(Set.of("PostgreSQL", "Webspace", "Server")); Files.writeString( Path.of("doc/hs-hosting-asset-type-structure.md"), """ - #This code generated was by %{this}.main, do not amend manually. + This code generated was by %{this}.main, do not amend manually. """ .replace("%{this}", HsHostingAssetType.class.getSimpleName()), StandardOpenOption.APPEND); } + + public enum RelationPolicy { + FORBIDDEN, OPTIONAL, REQUIRED + } } -enum TypeRelationType { - OPTIONAL, REQUIRED -} - -class EntityTypeRelation { - final String edge; - final TypeRelationType relationType; +@AllArgsConstructor +class EntityTypeRelation { + final HsHostingAssetType.RelationPolicy relationType; + private final Function getter; final T relatedType; + final String edge; - EntityTypeRelation(final String edge, final TypeRelationType required, final T relatedType) { - this.edge = edge; - this.relationType = required; - this.relatedType = relatedType; + static EntityTypeRelation requires(final HsBookingItemType bookingItemType) { + return new EntityTypeRelation<>(REQUIRED, HsHostingAssetEntity::getBookingItem, bookingItemType, " ==* "); } - static EntityTypeRelation requires(final HsBookingItemType bookingItemType) { - return new EntityTypeRelation<>(" *==> ", TypeRelationType.REQUIRED, bookingItemType); + static EntityTypeRelation optionalParent(final HsHostingAssetType hostingAssetType) { + return new EntityTypeRelation<>(OPTIONAL, null, hostingAssetType, " o..> "); } - static EntityTypeRelation optionalParent(final HsHostingAssetType hostingAssetType) { - return new EntityTypeRelation<>(" o..> ", TypeRelationType.OPTIONAL, hostingAssetType); + static EntityTypeRelation requiredParent(final HsHostingAssetType hostingAssetType) { + return new EntityTypeRelation<>(REQUIRED, null, hostingAssetType, " *==> "); } - static EntityTypeRelation requiredParent(final HsHostingAssetType hostingAssetType) { - return new EntityTypeRelation<>(" *==> ", TypeRelationType.REQUIRED, hostingAssetType); + static EntityTypeRelation assignedTo(final HsHostingAssetType hostingAssetType) { + return new EntityTypeRelation<>(REQUIRED, null, hostingAssetType, " o..> "); } - static EntityTypeRelation assignedTo(final HsHostingAssetType hostingAssetType) { - return new EntityTypeRelation<>(" o..> ", TypeRelationType.REQUIRED, hostingAssetType); - } - - static EntityTypeRelation optionallyAssignedTo(final HsHostingAssetType hostingAssetType) { - return new EntityTypeRelation<>(" o..> ", TypeRelationType.OPTIONAL, hostingAssetType); + static EntityTypeRelation optionallyAssignedTo(final HsHostingAssetType hostingAssetType) { + return new EntityTypeRelation<>(OPTIONAL, null, hostingAssetType, " o..> "); } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidator.java index 9144189b..55a54b42 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsCloudServerHostingAssetValidator.java @@ -1,7 +1,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; +import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import java.util.regex.Pattern; @@ -9,9 +9,7 @@ class HsCloudServerHostingAssetValidator extends HsHostingAssetEntityValidator { HsCloudServerHostingAssetValidator() { super( - BookingItem.mustBeOfType(HsBookingItemType.CLOUD_SERVER), - ParentAsset.mustBeNull(), - AssignedToAsset.mustBeNull(), + HsHostingAssetType.CLOUD_SERVER, AlarmContact.isOptional(), NO_EXTRA_PROPERTIES); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java index 130e6255..c314f1f6 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java @@ -9,6 +9,7 @@ import java.util.regex.Pattern; import static java.util.Arrays.stream; import static java.util.Optional.ofNullable; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_DNS_SETUP; import static net.hostsharing.hsadminng.hs.validation.ArrayProperty.arrayOf; import static net.hostsharing.hsadminng.hs.validation.BooleanProperty.booleanProperty; import static net.hostsharing.hsadminng.hs.validation.IntegerProperty.integerProperty; @@ -31,9 +32,8 @@ class HsDomainDnsSetupHostingAssetValidator extends HsHostingAssetEntityValidato RR_REGEX_NAME + RR_REGEX_IN + RR_REGEX_TTL + RR_RECORD_TYPE + RR_RECORD_DATA + RR_COMMENT; HsDomainDnsSetupHostingAssetValidator() { - super( BookingItem.mustBeNull(), - ParentAsset.mustBeNull(), - AssignedToAsset.mustBeNull(), + super( + DOMAIN_DNS_SETUP, AlarmContact.isOptional(), integerProperty("TTL").min(0).withDefault(21600), diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java index d2693f7e..83300d5c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java @@ -4,6 +4,8 @@ import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import java.util.regex.Pattern; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP; + class HsDomainSetupHostingAssetValidator extends HsHostingAssetEntityValidator { public static final String DOMAIN_NAME_REGEX = "^((?!-)[A-Za-z0-9-]{1,63}(? { static final ValidatableProperty[] NO_EXTRA_PROPERTIES = new ValidatableProperty[0]; - private final HsHostingAssetEntityValidator.BookingItem bookingItemValidation; - private final HsHostingAssetEntityValidator.ParentAsset parentAssetValidation; - private final HsHostingAssetEntityValidator.AssignedToAsset assignedToAssetValidation; + private final ReferenceValidator bookingItemReferenceValidation; + private final ReferenceValidator parentAssetReferenceValidation; + private final ReferenceValidator assignedToAssetReferenceValidation; private final HsHostingAssetEntityValidator.AlarmContact alarmContactValidation; HsHostingAssetEntityValidator( - @NotNull final BookingItem bookingItemValidation, - @NotNull final ParentAsset parentAssetValidation, - @NotNull final AssignedToAsset assignedToAssetValidation, - @NotNull final AlarmContact alarmContactValidation, - final ValidatableProperty... properties) { + final HsHostingAssetType assetType, final AlarmContact alarmContactValidation, final ValidatableProperty... properties) { super(properties); - this.bookingItemValidation = bookingItemValidation; - this.parentAssetValidation = parentAssetValidation; - this.assignedToAssetValidation = assignedToAssetValidation; + this.bookingItemReferenceValidation = new ReferenceValidator<>( + assetType.bookingItemPolicy(), + assetType.bookingItemType(), + HsHostingAssetEntity::getBookingItem, + HsBookingItemEntity::getType); + this.parentAssetReferenceValidation = new ReferenceValidator<>( + assetType.parentAssetPolicy(), + assetType.parentAssetType(), + HsHostingAssetEntity::getParentAsset, + HsHostingAssetEntity::getType); + this.assignedToAssetReferenceValidation = new ReferenceValidator<>( + assetType.assignedToAssetPolicy(), + assetType.assignedToAssetType(), + HsHostingAssetEntity::getAssignedToAsset, + HsHostingAssetEntity::getType); this.alarmContactValidation = alarmContactValidation; } @@ -63,9 +72,9 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator validateEntityReferencesAndProperties(final HsHostingAssetEntity assetEntity) { return Stream.of( - validateReferencedEntity(assetEntity, "bookingItem", bookingItemValidation::validate), - validateReferencedEntity(assetEntity, "parentAsset", parentAssetValidation::validate), - validateReferencedEntity(assetEntity, "assignedToAsset", assignedToAssetValidation::validate), + validateReferencedEntity(assetEntity, "bookingItem", bookingItemReferenceValidation::validate), + validateReferencedEntity(assetEntity, "parentAsset", parentAssetReferenceValidation::validate), + validateReferencedEntity(assetEntity, "assignedToAsset", assignedToAssetReferenceValidation::validate), validateReferencedEntity(assetEntity, "alarmContact", alarmContactValidation::validate), validateProperties(assetEntity)) .filter(Objects::nonNull) @@ -137,15 +146,15 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator { + static class ReferenceValidator { - private final Policy policy; + private final HsHostingAssetType.RelationPolicy policy; private final T subEntityType; private final Function subEntityGetter; private final Function subEntityTypeGetter; public ReferenceValidator( - final Policy policy, + final HsHostingAssetType.RelationPolicy policy, final T subEntityType, final Function subEntityGetter, final Function subEntityTypeGetter) { @@ -156,7 +165,7 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator subEntityGetter) { this.policy = policy; this.subEntityType = null; @@ -164,17 +173,13 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator null; } - enum Policy { - OPTIONAL, FORBIDDEN, REQUIRED - } - List validate(final HsHostingAssetEntity assetEntity, final String referenceFieldName) { final var subEntity = subEntityGetter.apply(assetEntity); - if (policy == Policy.REQUIRED && subEntity == null) { + if (policy == REQUIRED && subEntity == null) { return List.of(referenceFieldName + "' must not be null but is null"); } - if (policy == Policy.FORBIDDEN && subEntity != null) { + if ((policy == FORBIDDEN) && (subEntity != null)) { return List.of(referenceFieldName + "' must be null but is set to "+ assetEntity.getBookingItem().toShortString()); } final var subItemType = subEntity != null ? subEntityTypeGetter.apply(subEntity) : null; @@ -185,59 +190,28 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator { + static class ParentAssetReferenceValidation extends ReferenceValidator { - BookingItem(final Policy policy, final HsBookingItemType bookingItemType) { - super(policy, bookingItemType, HsHostingAssetEntity::getBookingItem, HsBookingItemEntity::getType); - } - - static BookingItem mustBeNull() { - return new BookingItem(Policy.FORBIDDEN, null); - } - - static BookingItem mustBeOfType(final HsBookingItemType hsBookingItemType) { - return new BookingItem(Policy.REQUIRED, hsBookingItemType); - } - } - - static class ParentAsset extends ReferenceValidator { - - ParentAsset(final ReferenceValidator.Policy policy, final HsHostingAssetType parentAssetType) { + ParentAssetReferenceValidation(final HsHostingAssetType.RelationPolicy policy, final HsHostingAssetType parentAssetType) { super(policy, parentAssetType, HsHostingAssetEntity::getParentAsset, HsHostingAssetEntity::getType); } - - static ParentAsset mustBeNull() { - return new ParentAsset(Policy.FORBIDDEN, null); - } - - static ParentAsset mustBeOfType(final HsHostingAssetType hostingAssetType) { - return new ParentAsset(Policy.REQUIRED, hostingAssetType); - } - - static ParentAsset mustBeNullOrOfType(final HsHostingAssetType hostingAssetType) { - return new ParentAsset(Policy.OPTIONAL, hostingAssetType); - } } - static class AssignedToAsset extends ReferenceValidator { + static class AssignedToAssetReferenceValidation extends ReferenceValidator { - AssignedToAsset(final ReferenceValidator.Policy policy, final HsHostingAssetType assignedToAssetType) { + AssignedToAssetReferenceValidation(final HsHostingAssetType.RelationPolicy policy, final HsHostingAssetType assignedToAssetType) { super(policy, assignedToAssetType, HsHostingAssetEntity::getAssignedToAsset, HsHostingAssetEntity::getType); } - - static AssignedToAsset mustBeNull() { - return new AssignedToAsset(Policy.FORBIDDEN, null); - } } static class AlarmContact extends ReferenceValidator> { - AlarmContact(final ReferenceValidator.Policy policy) { + AlarmContact(final HsHostingAssetType.RelationPolicy policy) { super(policy, HsHostingAssetEntity::getAlarmContact); } static AlarmContact isOptional() { - return new AlarmContact(Policy.OPTIONAL); + return new AlarmContact(HsHostingAssetType.RelationPolicy.OPTIONAL); } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidator.java index 362abf38..69c0efff 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedServerHostingAssetValidator.java @@ -1,10 +1,10 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import java.util.regex.Pattern; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; import static net.hostsharing.hsadminng.hs.validation.BooleanProperty.booleanProperty; import static net.hostsharing.hsadminng.hs.validation.EnumerationProperty.enumerationProperty; import static net.hostsharing.hsadminng.hs.validation.IntegerProperty.integerProperty; @@ -13,9 +13,7 @@ class HsManagedServerHostingAssetValidator extends HsHostingAssetEntityValidator public HsManagedServerHostingAssetValidator() { super( - BookingItem.mustBeOfType(HsBookingItemType.MANAGED_SERVER), - ParentAsset.mustBeNull(), // until we introduce a hosting asset for 'HOST' - AssignedToAsset.mustBeNull(), + MANAGED_SERVER, AlarmContact.isOptional(), // hostmaster alert address is implicitly added // monitoring diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidator.java index bffedf2f..857ec7b7 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsManagedWebspaceHostingAssetValidator.java @@ -1,16 +1,15 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators; -import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; -import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType; import java.util.regex.Pattern; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; + class HsManagedWebspaceHostingAssetValidator extends HsHostingAssetEntityValidator { public HsManagedWebspaceHostingAssetValidator() { - super(BookingItem.mustBeOfType(HsBookingItemType.MANAGED_WEBSPACE), - ParentAsset.mustBeOfType(HsHostingAssetType.MANAGED_SERVER), // the (shared or private) ManagedServer - AssignedToAsset.mustBeNull(), + super( + MANAGED_SERVER, AlarmContact.isOptional(), // hostmaster alert address is implicitly added NO_EXTRA_PROPERTIES); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidator.java index 309404f6..14096dbc 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsUnixUserHostingAssetValidator.java @@ -17,9 +17,8 @@ class HsUnixUserHostingAssetValidator extends HsHostingAssetEntityValidator { private static final int DASH_LENGTH = "-".length(); HsUnixUserHostingAssetValidator() { - super( BookingItem.mustBeNull(), - ParentAsset.mustBeOfType(HsHostingAssetType.MANAGED_WEBSPACE), - AssignedToAsset.mustBeNull(), + super( + HsHostingAssetType.DOMAIN_DNS_SETUP, AlarmContact.isOptional(), integerProperty("SSD hard quota").unit("GB").maxFrom("SSD").optional(),