Refactoring of cisco-xr-driver and impl modules.
[unimgr.git] / impl / src / main / java / org / opendaylight / unimgr / utils / NullAwareDatastoreGetter.java
1 /*
2  * Copyright (c) 2016 Cisco Systems Inc and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.unimgr.utils;
9
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;
15
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;
22
23 public class NullAwareDatastoreGetter<T> {
24
25     private static final Logger LOG = LoggerFactory.getLogger(NullAwareDatastoreGetter.class);
26
27     private Optional<T> dataOptional;
28
29     public NullAwareDatastoreGetter(T data) {
30         this.dataOptional = Optional.ofNullable(data);
31     }
32
33     public NullAwareDatastoreGetter(Optional<T> dataOptional) {
34         this.dataOptional = dataOptional;
35     }
36
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();
40     }
41
42     public <R extends ChildOf<? super T>> NullAwareDatastoreGetter<R> collect(Function<T, Supplier<R>> function) {
43         logDataOptionalStatus(function);
44
45         return new NullAwareDatastoreGetter<>(
46                 dataOptional.isPresent() ? Optional.ofNullable(function.apply(dataOptional.get()).get()) : Optional.empty()
47         );
48     }
49
50     public <R extends Augmentation<T>> NullAwareDatastoreGetter<R> collect(Function<T, Function<Class<R>, R>> function, Class<R> cls) {
51         logDataOptionalStatus(function);
52
53         return new NullAwareDatastoreGetter<>(
54                 dataOptional.isPresent() ? Optional.ofNullable(function.apply(dataOptional.get()).apply(cls)) : Optional.empty()
55         );
56     }
57
58     public <R extends DataObject, C extends Collection<R>> List<NullAwareDatastoreGetter<R>> collectMany(Function<T, Supplier<C>> function) {
59         logDataOptionalStatus(function);
60
61         List<NullAwareDatastoreGetter<R>> result = new ArrayList<>();
62
63         Optional<C> dataCollectionOptional = dataOptional.isPresent() ? Optional.ofNullable(function.apply(dataOptional.get()).get()) : Optional.empty();
64
65         if(dataCollectionOptional.isPresent()) {
66             dataCollectionOptional.get().forEach(dataObject -> result.add(new NullAwareDatastoreGetter<R>(dataObject)));
67         }
68
69         return result;
70     }
71
72     public Optional<T> get() {
73         return dataOptional;
74     }
75
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());
79         } else {
80             LOG.debug("Null value encountered during collection of: " + function.toString());
81         }
82     }
83 }