fix potential class loading deadlock in HsBookingItemEntityValidator
This commit is contained in:
parent
4898a8753b
commit
e3bcf65b9f
@ -3,13 +3,10 @@ package net.hostsharing.hsadminng.hs.booking.item.validators;
|
|||||||
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
||||||
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
|
||||||
import net.hostsharing.hsadminng.hs.validation.HsEntityValidator;
|
import net.hostsharing.hsadminng.hs.validation.HsEntityValidator;
|
||||||
import net.hostsharing.hsadminng.hs.validation.MultiValidationException;
|
|
||||||
import net.hostsharing.hsadminng.hs.validation.ValidatableProperty;
|
import net.hostsharing.hsadminng.hs.validation.ValidatableProperty;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -17,46 +14,19 @@ import java.util.stream.Stream;
|
|||||||
import static java.util.Arrays.stream;
|
import static java.util.Arrays.stream;
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
import static java.util.Optional.ofNullable;
|
import static java.util.Optional.ofNullable;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER;
|
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER;
|
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE;
|
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD;
|
|
||||||
|
|
||||||
public class HsBookingItemEntityValidator extends HsEntityValidator<HsBookingItemEntity> {
|
public class HsBookingItemEntityValidator extends HsEntityValidator<HsBookingItemEntity> {
|
||||||
|
|
||||||
private static final Map<Enum<HsBookingItemType>, HsEntityValidator<HsBookingItemEntity>> validators = new HashMap<>();
|
|
||||||
static {
|
|
||||||
register(PRIVATE_CLOUD, new HsPrivateCloudBookingItemValidator());
|
|
||||||
register(CLOUD_SERVER, new HsCloudServerBookingItemValidator());
|
|
||||||
register(MANAGED_SERVER, new HsManagedServerBookingItemValidator());
|
|
||||||
register(MANAGED_WEBSPACE, new HsManagedWebspaceBookingItemValidator());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void register(final Enum<HsBookingItemType> type, final HsEntityValidator<HsBookingItemEntity> validator) {
|
|
||||||
stream(validator.propertyValidators).forEach( entry -> {
|
|
||||||
entry.verifyConsistency(Map.entry(type, validator));
|
|
||||||
});
|
|
||||||
validators.put(type, validator);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HsEntityValidator<HsBookingItemEntity> forType(final Enum<HsBookingItemType> type) {
|
|
||||||
if ( validators.containsKey(type)) {
|
|
||||||
return validators.get(type);
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("no validator found for type " + type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Set<Enum<HsBookingItemType>> types() {
|
public static Set<Enum<HsBookingItemType>> types() {
|
||||||
return validators.keySet();
|
return HsBookingItemEntityValidatorRegistry.types();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<String> doValidate(final HsBookingItemEntity bookingItem) {
|
public static List<String> doValidate(final HsBookingItemEntity bookingItem) {
|
||||||
return HsBookingItemEntityValidator.forType(bookingItem.getType()).validate(bookingItem);
|
return HsBookingItemEntityValidatorRegistry.doValidate(bookingItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HsBookingItemEntity validated(final HsBookingItemEntity entityToSave) {
|
public static HsBookingItemEntity validated(final HsBookingItemEntity entityToSave) {
|
||||||
MultiValidationException.throwInvalid(doValidate(entityToSave));
|
return HsBookingItemEntityValidatorRegistry.validated(entityToSave);
|
||||||
return entityToSave;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HsBookingItemEntityValidator(final ValidatableProperty<?>... properties) {
|
public HsBookingItemEntityValidator(final ValidatableProperty<?>... properties) {
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.booking.item.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
|
||||||
|
import net.hostsharing.hsadminng.hs.validation.HsEntityValidator;
|
||||||
|
import net.hostsharing.hsadminng.hs.validation.MultiValidationException;
|
||||||
|
import net.hostsharing.hsadminng.hs.validation.ValidatableProperty;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static java.util.Arrays.stream;
|
||||||
|
import static java.util.Collections.emptyList;
|
||||||
|
import static java.util.Optional.ofNullable;
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER;
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER;
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE;
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD;
|
||||||
|
|
||||||
|
public class HsBookingItemEntityValidatorRegistry {
|
||||||
|
|
||||||
|
private static final Map<Enum<HsBookingItemType>, HsEntityValidator<HsBookingItemEntity>> validators = new HashMap<>();
|
||||||
|
static {
|
||||||
|
register(PRIVATE_CLOUD, new HsPrivateCloudBookingItemValidator());
|
||||||
|
register(CLOUD_SERVER, new HsCloudServerBookingItemValidator());
|
||||||
|
register(MANAGED_SERVER, new HsManagedServerBookingItemValidator());
|
||||||
|
register(MANAGED_WEBSPACE, new HsManagedWebspaceBookingItemValidator());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void register(final Enum<HsBookingItemType> type, final HsEntityValidator<HsBookingItemEntity> validator) {
|
||||||
|
stream(validator.propertyValidators).forEach( entry -> {
|
||||||
|
entry.verifyConsistency(Map.entry(type, validator));
|
||||||
|
});
|
||||||
|
validators.put(type, validator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HsEntityValidator<HsBookingItemEntity> forType(final Enum<HsBookingItemType> type) {
|
||||||
|
if ( validators.containsKey(type)) {
|
||||||
|
return validators.get(type);
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("no validator found for type " + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<Enum<HsBookingItemType>> types() {
|
||||||
|
return validators.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> doValidate(final HsBookingItemEntity bookingItem) {
|
||||||
|
return HsBookingItemEntityValidatorRegistry.forType(bookingItem.getType()).validate(bookingItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HsBookingItemEntity validated(final HsBookingItemEntity entityToSave) {
|
||||||
|
MultiValidationException.throwInvalid(doValidate(entityToSave));
|
||||||
|
return entityToSave;
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,6 @@ import static java.util.Map.ofEntries;
|
|||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER;
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_SERVER;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER;
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD;
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidator.forType;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
class HsCloudServerBookingItemValidatorUnitTest {
|
class HsCloudServerBookingItemValidatorUnitTest {
|
||||||
@ -52,7 +51,7 @@ class HsCloudServerBookingItemValidatorUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
void containsAllValidations() {
|
void containsAllValidations() {
|
||||||
// when
|
// when
|
||||||
final var validator = forType(CLOUD_SERVER);
|
final var validator = HsBookingItemEntityValidatorRegistry.forType(CLOUD_SERVER);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
||||||
|
@ -21,7 +21,6 @@ import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.CLOUD_
|
|||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER;
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_SERVER;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE;
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD;
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.PRIVATE_CLOUD;
|
||||||
import static net.hostsharing.hsadminng.hs.booking.item.validators.HsBookingItemEntityValidator.forType;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
class HsManagedServerBookingItemValidatorUnitTest {
|
class HsManagedServerBookingItemValidatorUnitTest {
|
||||||
@ -60,7 +59,7 @@ class HsManagedServerBookingItemValidatorUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
void containsAllValidations() {
|
void containsAllValidations() {
|
||||||
// when
|
// when
|
||||||
final var validator = forType(MANAGED_SERVER);
|
final var validator = HsBookingItemEntityValidatorRegistry.forType(MANAGED_SERVER);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
||||||
|
@ -51,7 +51,7 @@ class HsManagedWebspaceBookingItemValidatorUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
void containsAllValidations() {
|
void containsAllValidations() {
|
||||||
// when
|
// when
|
||||||
final var validator = HsBookingItemEntityValidator.forType(MANAGED_WEBSPACE);
|
final var validator = HsBookingItemEntityValidatorRegistry.forType(MANAGED_WEBSPACE);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
|
||||||
|
Loading…
Reference in New Issue
Block a user