2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.mdsal.binding.javav2.dom.adapter.spi.builder;
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import com.google.common.collect.ClassToInstanceMap;
13 import com.google.common.collect.ImmutableClassToInstanceMap;
14 import com.google.common.collect.MutableClassToInstanceMap;
16 import org.opendaylight.yangtools.concepts.Builder;
19 * Class for building instances of delegates of specific type.
22 * - builded specific object type
27 public abstract class AdapterBuilder<T, D> implements Builder<T> {
29 private final ClassToInstanceMap<D> delegates = MutableClassToInstanceMap.create();
31 protected abstract T createInstance(ClassToInstanceMap<D> immutableDelegates);
34 * Get required delegates.
36 * @return set of delegates
38 public abstract Set<? extends Class<? extends D>> getRequiredDelegates();
41 * Add delegate to set of delegates.
46 * - implementation of delegate
48 public final <V extends D> void addDelegate(final Class<V> type, final D impl) {
49 delegates.put(type, impl);
53 public final T build() {
54 checkAllRequiredServices();
55 return createInstance(ImmutableClassToInstanceMap.copyOf(delegates));
58 private void checkAllRequiredServices() {
59 for (final Class<? extends D> type : getRequiredDelegates()) {
60 Preconditions.checkState(delegates.get(type) != null, "Requires service %s is not defined.", type);