2 * Copyright (c) 2016 Cisco Systems Inc and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.unimgr.utils;
10 import org.opendaylight.yangtools.yang.binding.Augmentation;
11 import org.opendaylight.yangtools.yang.binding.ChildOf;
12 import org.opendaylight.yangtools.yang.binding.DataObject;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.List;
19 import java.util.Optional;
20 import java.util.function.Function;
21 import java.util.function.Supplier;
23 public class NullAwareDatastoreGetter<T> {
25 private static final Logger LOG = LoggerFactory.getLogger(NullAwareDatastoreGetter.class);
27 private Optional<T> dataOptional;
29 public NullAwareDatastoreGetter(T data) {
30 this.dataOptional = Optional.ofNullable(data);
33 public NullAwareDatastoreGetter(Optional<T> dataOptional) {
34 this.dataOptional = dataOptional;
37 //TODO temporary, remove after java.util.Optional and com.google.common.base.Optional unification in ODL core
38 public NullAwareDatastoreGetter(com.google.common.base.Optional<T> dataOptional) {
39 this.dataOptional = dataOptional.isPresent() ? Optional.ofNullable(dataOptional.get()) : Optional.empty();
42 public <R extends ChildOf<? super T>> NullAwareDatastoreGetter<R> collect(Function<T, Supplier<R>> function) {
43 logDataOptionalStatus(function);
45 return new NullAwareDatastoreGetter<>(
46 dataOptional.isPresent() ? Optional.ofNullable(function.apply(dataOptional.get()).get()) : Optional.empty()
50 public <R extends Augmentation<T>> NullAwareDatastoreGetter<R> collect(Function<T, Function<Class<R>, R>> function, Class<R> cls) {
51 logDataOptionalStatus(function);
53 return new NullAwareDatastoreGetter<>(
54 dataOptional.isPresent() ? Optional.ofNullable(function.apply(dataOptional.get()).apply(cls)) : Optional.empty()
58 public <R extends DataObject, C extends Collection<R>> List<NullAwareDatastoreGetter<R>> collectMany(Function<T, Supplier<C>> function) {
59 logDataOptionalStatus(function);
61 List<NullAwareDatastoreGetter<R>> result = new ArrayList<>();
63 Optional<C> dataCollectionOptional = dataOptional.isPresent() ? Optional.ofNullable(function.apply(dataOptional.get()).get()) : Optional.empty();
65 if(dataCollectionOptional.isPresent()) {
66 dataCollectionOptional.get().forEach(dataObject -> result.add(new NullAwareDatastoreGetter<R>(dataObject)));
72 public Optional<T> get() {
76 private void logDataOptionalStatus(Function <?, ?> function) {
77 if(dataOptional.isPresent()) {
78 LOG.trace("Before collection of: " + function.toString() + ", currently collected data is non-null: " + dataOptional.get().toString());
80 LOG.debug("Null value encountered during collection of: " + function.toString());