diff options
author | Marek Gradzki <mgradzki@cisco.com> | 2018-04-13 13:38:16 +0200 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2018-08-17 10:17:58 +0000 |
commit | d1b102f6fafced3c7badb09ecc78fec590704c8a (patch) | |
tree | fb9c7041b25cdd36b46cf25e789c850db38f2349 /infra/translate-api/src | |
parent | fa641a3e06a905cb3222ebd15a2b4ab90b599efc (diff) |
HONEYCOMB-431: add validation support to Writers
This patch introduces FlatWriterRegistry.validateModifications.
Implementation iterates over writersOrder following bulkUpdate logic
to properly support subtree writers case.
Writers are now cabable of validating modifications.
Commonly used implementations (GenericWriter and GenericListWriter)
delegate validation capbility to Validators.
Change-Id: If7a0bb0838c0b8f2c0393c989f3b03853a2ea679
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
Diffstat (limited to 'infra/translate-api/src')
3 files changed, 159 insertions, 0 deletions
diff --git a/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/DataValidationFailedException.java b/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/DataValidationFailedException.java index 3c0392efa..d728beee4 100644 --- a/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/DataValidationFailedException.java +++ b/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/DataValidationFailedException.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import io.fd.honeycomb.translate.ValidationFailedException; import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** @@ -76,4 +77,77 @@ public class DataValidationFailedException extends ValidationFailedException { public InstanceIdentifier<?> getFailedId() { return failedId; } + + /** + * Create specific validated failed exception. + */ + public static class CreateValidationFailedException extends DataValidationFailedException { + private static final long serialVersionUID = 1; + + private final transient DataObject data; + + public CreateValidationFailedException(@Nonnull final InstanceIdentifier<?> failedId, + @Nonnull final DataObject data, + @Nonnull final Throwable cause) { + super(failedId, getMsg(failedId, data), cause); + this.data = checkNotNull(data, "data"); + } + + private static String getMsg(final @Nonnull InstanceIdentifier<?> failedId, + final @Nonnull DataObject data) { + return String.format("Failed to validate create request for: %s at: %s.", data, failedId); + } + + public DataObject getData() { + return data; + } + } + + /** + * Update specific validated failed exception. + */ + public static class UpdateValidationFailedException extends DataValidationFailedException { + private static final long serialVersionUID = 1; + + private final transient DataObject dataBefore; + private final transient DataObject dataAfter; + + public UpdateValidationFailedException(@Nonnull final InstanceIdentifier<?> failedId, + @Nonnull final DataObject dataBefore, + @Nonnull final DataObject dataAfter, + @Nonnull final Throwable cause) { + super(failedId, getMsg(failedId, dataBefore, dataAfter), cause); + this.dataBefore = checkNotNull(dataBefore, "dataBefore"); + this.dataAfter = checkNotNull(dataAfter, "dataAfter"); + } + + private static String getMsg(final @Nonnull InstanceIdentifier<?> failedId, final DataObject dataBefore, + final @Nonnull DataObject dataAfter) { + return String + .format("Failed to validate update request from: %s to: %s, at: %s.", dataBefore, dataAfter, failedId); + } + + public DataObject getDataBefore() { + return dataBefore; + } + + public DataObject getDataAfter() { + return dataAfter; + } + } + + /** + * Delete specific validated failed exception. + */ + public static class DeleteValidationFailedException extends DataValidationFailedException { + private static final long serialVersionUID = 1; + + public DeleteValidationFailedException(@Nonnull final InstanceIdentifier<?> failedId, @Nonnull final Throwable cause) { + super(failedId, getMsg(failedId), cause); + } + + private static String getMsg(@Nonnull final InstanceIdentifier<?> failedId) { + return String.format("Failed to validate delete request: %s.", failedId); + } + } } diff --git a/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Validator.java b/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Validator.java new file mode 100644 index 000000000..2044757ec --- /dev/null +++ b/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Validator.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.translate.write; + +import com.google.common.annotations.Beta; +import io.fd.honeycomb.translate.write.DataValidationFailedException.CreateValidationFailedException; +import io.fd.honeycomb.translate.write.DataValidationFailedException.DeleteValidationFailedException; +import io.fd.honeycomb.translate.write.DataValidationFailedException.UpdateValidationFailedException; +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Responsible for validation of DataObjects. + * Handles all update operations (create, update, delete). + * + * @param <D> Specific DataObject derived type, that is handled by this writer + * @see Writer#validate(InstanceIdentifier, DataObject, DataObject, WriteContext) + */ +@Beta +public interface Validator<D extends DataObject> { + /** + * Validates write operation. + * + * @param id Identifier(from root) of data being written + * @param dataAfter New data to be written + * @param writeContext Write context that provides information about current state of DataTree. + * @throws CreateValidationFailedException if write validation failed + */ + void validateWrite( + @Nonnull final InstanceIdentifier<D> id, + @Nonnull final D dataAfter, + @Nonnull final WriteContext writeContext) throws CreateValidationFailedException; + + /** + * Validates update operation. + * + * @param id Identifier(from root) of data being updated + * @param dataBefore Old data + * @param dataAfter New, updated data + * @param writeContext Write context that provides information about current state of DataTree. + * @throws UpdateValidationFailedException if update validation failed + */ + void validateUpdate(InstanceIdentifier<D> id, D dataBefore, D dataAfter, WriteContext writeContext) + throws UpdateValidationFailedException; + + /** + * Validates delete operation. + * + * @param id Identifier(from root) of data being written + * @param dataBefore Old data being deleted + * @param writeContext Write context that provides information about current state of DataTree. + * @throws DeleteValidationFailedException if delete validation failed + */ + void validateDelete(InstanceIdentifier<D> id, D dataBefore, WriteContext writeContext) + throws DeleteValidationFailedException; +} diff --git a/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Writer.java b/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Writer.java index 18573e58a..f3265a39b 100644 --- a/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Writer.java +++ b/infra/translate-api/src/main/java/io/fd/honeycomb/translate/write/Writer.java @@ -33,6 +33,20 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public interface Writer<D extends DataObject> extends SubtreeManager<D> { /** + * Validates data modification. + * + * @param id Identifier of data being validated + * @param dataBefore Old data + * @param dataAfter New, updated data + * @param ctx Write context enabling writer to get information about candidate data as well as current data + */ + default void validate(@Nonnull final InstanceIdentifier<? extends DataObject> id, + @Nullable final DataObject dataBefore, + @Nullable final DataObject dataAfter, + @Nonnull final WriteContext ctx) throws DataValidationFailedException { + } + + /** * Process modifications and translate them as create/update/delete operations to lower level * * @param id Identifier of data being written |