/* * Copyright (c) 2016 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.util.read; import static com.google.common.base.Preconditions.checkArgument; import com.google.common.annotations.Beta; import com.google.common.base.Optional; import io.fd.honeycomb.translate.read.ReadContext; import io.fd.honeycomb.translate.read.Reader; import io.fd.honeycomb.translate.util.RWUtils; import io.fd.honeycomb.translate.read.ReadFailedException; import javax.annotation.Nonnull; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Beta public abstract class AbstractGenericReader> implements Reader { private static final Logger LOG = LoggerFactory.getLogger(AbstractGenericReader.class); private final InstanceIdentifier instanceIdentifier; protected AbstractGenericReader(final InstanceIdentifier managedDataObjectType) { this.instanceIdentifier = RWUtils.makeIidWildcarded(managedDataObjectType); } @Nonnull @Override public final InstanceIdentifier getManagedDataObjectType() { return instanceIdentifier; } /** * @param id {@link InstanceIdentifier} pointing to current node. In case of keyed list, key must be present. * */ protected Optional readCurrent(@Nonnull final InstanceIdentifier id, @Nonnull final ReadContext ctx) throws ReadFailedException { LOG.debug("{}: Reading current: {}", this, id); final B builder = getBuilder(id); // The empty value could be cached, but no caching is safer since we call overridden getBuilder each time // and the build could produce something different (even if it shouldn't) final D emptyValue = builder.build(); 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 read = built.equals(emptyValue) ? Optional.absent() : Optional.of(built); LOG.debug("{}: Current node read successfully. Result: {}", this, read); return read; } @Nonnull @Override @SuppressWarnings("unchecked") public Optional read(@Nonnull final InstanceIdentifier id, @Nonnull final ReadContext ctx) throws ReadFailedException { LOG.trace("{}: Reading : {}", this, id); checkArgument(id.getTargetType().equals(getManagedDataObjectType().getTargetType())); return readCurrent((InstanceIdentifier) id, ctx); } @Override public String toString() { return String.format("Reader[%s]", getManagedDataObjectType().getTargetType().getSimpleName()); } }