diff options
Diffstat (limited to 'v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/AbstractCompositeReader.java')
-rw-r--r-- | v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/AbstractCompositeReader.java | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/AbstractCompositeReader.java b/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/AbstractCompositeReader.java index f9fa0eeaa..e8d79c538 100644 --- a/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/AbstractCompositeReader.java +++ b/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/AbstractCompositeReader.java @@ -22,6 +22,7 @@ import com.google.common.annotations.Beta; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; +import io.fd.honeycomb.v3po.translate.impl.TraversalType; import io.fd.honeycomb.v3po.translate.util.ReflectionUtils; import io.fd.honeycomb.v3po.translate.util.RWUtils; import io.fd.honeycomb.v3po.translate.read.ChildReader; @@ -52,10 +53,13 @@ abstract class AbstractCompositeReader<D extends DataObject, B extends Builder<D private final Map<Class<? extends DataObject>, ChildReader<? extends ChildOf<D>>> childReaders; private final Map<Class<? extends DataObject>, ChildReader<? extends Augmentation<D>>> augReaders; private final InstanceIdentifier<D> instanceIdentifier; + private final TraversalType traversalType; AbstractCompositeReader(final Class<D> managedDataObjectType, final List<ChildReader<? extends ChildOf<D>>> childReaders, - final List<ChildReader<? extends Augmentation<D>>> augReaders) { + final List<ChildReader<? extends Augmentation<D>>> augReaders, + final TraversalType traversalType) { + this.traversalType = traversalType; this.childReaders = RWUtils.uniqueLinkedIndex(childReaders, RWUtils.MANAGER_CLASS_FUNCTION); this.augReaders = RWUtils.uniqueLinkedIndex(augReaders, RWUtils.MANAGER_CLASS_AUG_FUNCTION); this.instanceIdentifier = InstanceIdentifier.create(managedDataObjectType); @@ -78,9 +82,31 @@ abstract class AbstractCompositeReader<D extends DataObject, B extends Builder<D // Cache empty value to determine if anything has changed later TODO cache in a field final D emptyValue = builder.build(); - LOG.trace("{}: Reading current attributes", this); - readCurrentAttributes(id, builder, ctx); + switch (traversalType) { + case PREORDER: { + LOG.trace("{}: Reading current attributes", this); + readCurrentAttributes(id, builder, ctx); + readChildren(id, ctx, builder); + } + case POSTORDER: { + readChildren(id, ctx, builder); + LOG.trace("{}: Reading current attributes", this); + readCurrentAttributes(id, builder, ctx); + } + } + + // Need to check whether anything was filled in to determine if data is present or not. + final D built = builder.build(); + final Optional<D> read = built.equals(emptyValue) + ? Optional.<D>absent() + : Optional.of(built); + + LOG.debug("{}: Current node read successfully. Result: {}", this, read); + return read; + } + private void readChildren(final InstanceIdentifier<D> id, final @Nonnull ReadContext ctx, final B builder) + throws ReadFailedException { // TODO expect exceptions from reader for (ChildReader<? extends ChildOf<D>> child : childReaders.values()) { LOG.debug("{}: Reading child from: {}", this, child); @@ -91,15 +117,6 @@ abstract class AbstractCompositeReader<D extends DataObject, B extends Builder<D LOG.debug("{}: Reading augment from: {}", this, child); child.read(id, builder, ctx); } - - // Need to check whether anything was filled in to determine if data is present or not. - final D built = builder.build(); - final Optional<D> read = built.equals(emptyValue) - ? Optional.<D>absent() - : Optional.of(built); - - LOG.debug("{}: Current node read successfully. Result: {}", this, read); - return read; } @Nonnull |