diff options
Diffstat (limited to 'v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java')
-rw-r--r-- | v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java | 234 |
1 files changed, 16 insertions, 218 deletions
diff --git a/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java b/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java index 0212c086b..5f1391c74 100644 --- a/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java +++ b/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java @@ -18,82 +18,33 @@ package io.fd.honeycomb.v3po.translate.impl.write; import static com.google.common.base.Preconditions.checkArgument; -import com.google.common.base.Optional; -import com.google.common.collect.Lists; -import io.fd.honeycomb.v3po.translate.impl.TraversalType; -import io.fd.honeycomb.v3po.translate.util.RWUtils; -import io.fd.honeycomb.v3po.translate.write.ChildWriter; import io.fd.honeycomb.v3po.translate.write.WriteContext; import io.fd.honeycomb.v3po.translate.write.WriteFailedException; import io.fd.honeycomb.v3po.translate.write.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.opendaylight.yangtools.yang.binding.Augmentation; -import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractCompositeWriter<D extends DataObject> implements Writer<D> { +abstract class AbstractCompositeWriter<D extends DataObject> implements Writer<D> { private static final Logger LOG = LoggerFactory.getLogger(AbstractCompositeWriter.class); - private final Map<Class<? extends DataObject>, ChildWriter<? extends ChildOf<D>>> childWriters; - private final Map<Class<? extends DataObject>, ChildWriter<? extends Augmentation<D>>> augWriters; private final InstanceIdentifier<D> instanceIdentifier; - private TraversalType traversalType; - public AbstractCompositeWriter(final Class<D> type, - final List<ChildWriter<? extends ChildOf<D>>> childWriters, - final List<ChildWriter<? extends Augmentation<D>>> augWriters, - final TraversalType traversalType) { - this.traversalType = traversalType; - this.instanceIdentifier = InstanceIdentifier.create(type); - this.childWriters = RWUtils.uniqueLinkedIndex(childWriters, RWUtils.MANAGER_CLASS_FUNCTION); - this.augWriters = RWUtils.uniqueLinkedIndex(augWriters, RWUtils.MANAGER_CLASS_AUG_FUNCTION); + AbstractCompositeWriter(final InstanceIdentifier<D> type) { + this.instanceIdentifier = type; } protected void writeCurrent(final InstanceIdentifier<D> id, final D data, final WriteContext ctx) throws WriteFailedException { LOG.debug("{}: Writing current: {} data: {}", this, id, data); - - switch (traversalType) { - case PREORDER: { - LOG.trace("{}: Writing current attributes", this); - writeCurrentAttributes(id, data, ctx); - writeChildren(id, data, ctx); - break; - } - case POSTORDER: { - writeChildren(id, data, ctx); - LOG.trace("{}: Writing current attributes", this); - writeCurrentAttributes(id, data, ctx); - break; - } - } - + writeCurrentAttributes(id, data, ctx); LOG.debug("{}: Current node written successfully", this); } - private void writeChildren(final InstanceIdentifier<D> id, final D data, final WriteContext ctx) - throws WriteFailedException { - for (ChildWriter<? extends ChildOf<D>> child : childWriters.values()) { - LOG.debug("{}: Writing child in: {}", this, child); - child.writeChild(id, data, ctx); - } - - for (ChildWriter<? extends Augmentation<D>> child : augWriters.values()) { - LOG.debug("{}: Writing augment in: {}", this, child); - child.writeChild(id, data, ctx); - } - } - protected void updateCurrent(final InstanceIdentifier<D> id, final D dataBefore, final D dataAfter, final WriteContext ctx) throws WriteFailedException { LOG.debug("{}: Updating current: {} dataBefore: {}, datAfter: {}", this, id, dataBefore, dataAfter); @@ -103,69 +54,14 @@ public abstract class AbstractCompositeWriter<D extends DataObject> implements W // No change, ignore return; } - - switch (traversalType) { - case PREORDER: { - LOG.trace("{}: Updating current attributes", this); - updateCurrentAttributes(id, dataBefore, dataAfter, ctx); - updateChildren(id, dataBefore, dataAfter, ctx); - break; - } - case POSTORDER: { - updateChildren(id, dataBefore, dataAfter, ctx); - LOG.trace("{}: Updating current attributes", this); - updateCurrentAttributes(id, dataBefore, dataAfter, ctx); - break; - } - } - + updateCurrentAttributes(id, dataBefore, dataAfter, ctx); LOG.debug("{}: Current node updated successfully", this); } - private void updateChildren(final InstanceIdentifier<D> id, final D dataBefore, final D dataAfter, - final WriteContext ctx) throws WriteFailedException { - for (ChildWriter<? extends ChildOf<D>> child : childWriters.values()) { - LOG.debug("{}: Updating child in: {}", this, child); - child.updateChild(id, dataBefore, dataAfter, ctx); - } - - for (ChildWriter<? extends Augmentation<D>> child : augWriters.values()) { - LOG.debug("{}: Updating augment in: {}", this, child); - child.updateChild(id, dataBefore, dataAfter, ctx); - } - } - protected void deleteCurrent(final InstanceIdentifier<D> id, final D dataBefore, final WriteContext ctx) throws WriteFailedException { LOG.debug("{}: Deleting current: {} dataBefore: {}", this, id, dataBefore); - - switch (traversalType) { - case PREORDER: { - deleteChildren(id, dataBefore, ctx); - LOG.trace("{}: Deleting current attributes", this); - deleteCurrentAttributes(id, dataBefore, ctx); - break; - } - case POSTORDER: { - LOG.trace("{}: Deleting current attributes", this); - deleteCurrentAttributes(id, dataBefore, ctx); - deleteChildren(id, dataBefore, ctx); - break; - } - } - } - - private void deleteChildren(final InstanceIdentifier<D> id, final D dataBefore, final WriteContext ctx) - throws WriteFailedException { - for (ChildWriter<? extends Augmentation<D>> child : reverseCollection(augWriters.values())) { - LOG.debug("{}: Deleting augment in: {}", this, child); - child.deleteChild(id, dataBefore, ctx); - } - - for (ChildWriter<? extends ChildOf<D>> child : reverseCollection(childWriters.values())) { - LOG.debug("{}: Deleting child in: {}", this, child); - child.deleteChild(id, dataBefore, ctx); - } + deleteCurrentAttributes(id, dataBefore, ctx); } @SuppressWarnings("unchecked") @@ -177,28 +73,20 @@ public abstract class AbstractCompositeWriter<D extends DataObject> implements W LOG.debug("{}: Updating : {}", this, id); LOG.trace("{}: Updating : {}, from: {} to: {}", this, id, dataBefore, dataAfter); - if (idPointsToCurrent(id)) { - if(isWrite(dataBefore, dataAfter)) { - writeCurrent((InstanceIdentifier<D>) id, castToManaged(dataAfter), ctx); - } else if(isDelete(dataBefore, dataAfter)) { - deleteCurrent((InstanceIdentifier<D>) id, castToManaged(dataBefore), ctx); - } else { - checkArgument(dataBefore != null && dataAfter != null, "No data to process"); - updateCurrent((InstanceIdentifier<D>) id, castToManaged(dataBefore), castToManaged(dataAfter), ctx); - } + checkArgument(idPointsToCurrent(id), "Cannot handle data: %s. Only: %s can be handled by writer: %s", + id, getManagedDataObjectType(), this); + + if (isWrite(dataBefore, dataAfter)) { + writeCurrent((InstanceIdentifier<D>) id, castToManaged(dataAfter), ctx); + } else if (isDelete(dataBefore, dataAfter)) { + deleteCurrent((InstanceIdentifier<D>) id, castToManaged(dataBefore), ctx); } else { - if (isWrite(dataBefore, dataAfter)) { - writeSubtree(id, dataAfter, ctx); - } else if (isDelete(dataBefore, dataAfter)) { - deleteSubtree(id, dataBefore, ctx); - } else { - checkArgument(dataBefore != null && dataAfter != null, "No data to process"); - updateSubtree(id, dataBefore, dataAfter, ctx); - } + checkArgument(dataBefore != null && dataAfter != null, "No data to process"); + updateCurrent((InstanceIdentifier<D>) id, castToManaged(dataBefore), castToManaged(dataAfter), ctx); } } - private void checkDataType(final @Nullable DataObject dataAfter) { + private void checkDataType(@Nonnull final DataObject dataAfter) { checkArgument(getManagedDataObjectType().getTargetType().isAssignableFrom(dataAfter.getClass())); } @@ -217,100 +105,10 @@ public abstract class AbstractCompositeWriter<D extends DataObject> implements W return dataAfter == null && dataBefore != null; } - private void writeSubtree(final InstanceIdentifier<? extends DataObject> id, - final DataObject dataAfter, final WriteContext ctx) throws WriteFailedException { - LOG.debug("{}: Writing subtree: {}", this, id); - - final Writer<? extends ChildOf<D>> writer = getNextChildWriter(id); - final Writer<? extends Augmentation<D>> augWriter = getNextAgumentationWriter(id); - - if (writer != null) { - LOG.debug("{}: Writing subtree: {} in: {}", this, id, writer); - writer.update(id, null, dataAfter, ctx); - } else if (augWriter != null) { - LOG.debug("{}: Updating augmented subtree: {} in: {}", this, id, augWriter); - augWriter.update(id, null, dataAfter, ctx); - } else { - // If there's no dedicated writer, use write current - // But we need current data after to do so - final InstanceIdentifier<D> currentId = RWUtils.cutId(id, getManagedDataObjectType()); - Optional<D> currentDataAfter = ctx.readAfter(currentId); - LOG.debug("{}: Dedicated subtree writer missing for: {}. Writing current.", this, - RWUtils.getNextId(id, getManagedDataObjectType()).getType(), currentDataAfter); - writeCurrent(currentId, castToManaged(currentDataAfter.get()), ctx); - } - } - private boolean idPointsToCurrent(final @Nonnull InstanceIdentifier<? extends DataObject> id) { return id.getTargetType().equals(getManagedDataObjectType().getTargetType()); } - private void deleteSubtree(final InstanceIdentifier<? extends DataObject> id, - final DataObject dataBefore, final WriteContext ctx) throws WriteFailedException { - LOG.debug("{}: Deleting subtree: {}", this, id); - - final Writer<? extends ChildOf<D>> writer = getNextChildWriter(id); - final Writer<? extends Augmentation<D>> augWriter = getNextAgumentationWriter(id); - - if (writer != null) { - LOG.debug("{}: Deleting subtree: {} in: {}", this, id, writer); - writer.update(id, dataBefore, null, ctx); - } else if (augWriter != null) { - LOG.debug("{}: Updating augmented subtree: {} in: {}", this, id, augWriter); - augWriter.update(id, dataBefore, null, ctx); - } else { - updateSubtreeFromCurrent(id, ctx); - } - } - - @SuppressWarnings("unchecked") - private void updateSubtreeFromCurrent(final InstanceIdentifier<? extends DataObject> id, final WriteContext ctx) - throws WriteFailedException { - final InstanceIdentifier<D> currentId = RWUtils.cutId(id, getManagedDataObjectType()); - Optional<D> currentDataBefore = ctx.readBefore(currentId); - Optional<D> currentDataAfter = ctx.readAfter(currentId); - LOG.debug("{}: Dedicated subtree writer missing for: {}. Updating current without subtree", this, - RWUtils.getNextId(id, getManagedDataObjectType()).getType(), currentDataAfter); - updateCurrent((InstanceIdentifier<D>) id, castToManaged(currentDataBefore.orNull()), - castToManaged(currentDataAfter.orNull()), ctx); - } - - private void updateSubtree(final InstanceIdentifier<? extends DataObject> id, - final DataObject dataBefore, - final DataObject dataAfter, - final WriteContext ctx) throws WriteFailedException { - LOG.debug("{}: Updating subtree: {}", this, id); - final Writer<? extends ChildOf<D>> writer = getNextChildWriter(id); - final Writer<? extends Augmentation<D>> augWriter = getNextAgumentationWriter(id); - - if (writer != null) { - LOG.debug("{}: Updating subtree: {} in: {}", this, id, writer); - writer.update(id, dataBefore, dataAfter, ctx); - } else if (augWriter != null) { - LOG.debug("{}: Updating augmented subtree: {} in: {}", this, id, augWriter); - augWriter.update(id, dataBefore, dataAfter, ctx); - } else { - updateSubtreeFromCurrent(id, ctx); - } - } - - private Writer<? extends ChildOf<D>> getNextChildWriter(final InstanceIdentifier<? extends DataObject> id) { - final Class<? extends DataObject> next = RWUtils.getNextId(id, getManagedDataObjectType()).getType(); - return childWriters.get(next); - } - - private Writer<? extends Augmentation<D>> getNextAgumentationWriter(final InstanceIdentifier<? extends DataObject> id) { - final Class<? extends DataObject> next = RWUtils.getNextId(id, getManagedDataObjectType()).getType(); - return augWriters.get(next); - } - - private static <T> List<T> reverseCollection(final Collection<T> original) { - // TODO find a better reverse mechanism (probably a different collection for child writers is necessary) - final ArrayList<T> list = Lists.newArrayList(original); - Collections.reverse(list); - return list; - } - protected abstract void writeCurrentAttributes(@Nonnull final InstanceIdentifier<D> id, @Nonnull final D data, @Nonnull final WriteContext ctx) throws WriteFailedException; |