Mass-migrate to java.util.Optional
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / spi / loader / AdapterLoader.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.mdsal.binding.javav2.dom.adapter.spi.loader;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.cache.CacheLoader;
12 import java.util.Optional;
13 import javax.annotation.Nonnull;
14 import javax.annotation.Nullable;
15 import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.builder.AdapterBuilder;
16
17 /**
18  * Class for loading specific delegate type.
19  *
20  * @param <T>
21  *            - built specific object type
22  * @param <D>
23  *            - delegates type
24  */
25 @Beta
26 public abstract class AdapterLoader<T, D> extends CacheLoader<Class<? extends T>, Optional<T>> {
27
28     @Nullable
29     protected abstract D getDelegate(Class<? extends D> reqDeleg);
30
31     @Nonnull
32     protected abstract AdapterBuilder<? extends T, D> createBuilder(Class<? extends T> key);
33
34     @Nonnull
35     @Override
36     public Optional<T> load(@Nonnull final Class<? extends T> key) {
37
38         final AdapterBuilder<? extends T, D> builder = createBuilder(key);
39         for (final Class<? extends D> reqDeleg : builder.getRequiredDelegates()) {
40             final D deleg = getDelegate(reqDeleg);
41             if (deleg != null) {
42                 builder.addDelegate(reqDeleg, deleg);
43             } else {
44                 return Optional.empty();
45             }
46         }
47         return Optional.of(builder.build());
48     }
49 }