Binding v2 - remove checked future
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / impl / operation / BindingDOMOperationServiceAdapter.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.impl.operation;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import com.google.common.cache.CacheBuilder;
13 import com.google.common.cache.CacheLoader;
14 import com.google.common.cache.LoadingCache;
15 import com.google.common.collect.ClassToInstanceMap;
16 import com.google.common.collect.ImmutableSet;
17 import java.util.Set;
18 import javax.annotation.Nonnull;
19 import org.opendaylight.mdsal.binding.javav2.api.RpcActionConsumerRegistry;
20 import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.builder.BindingDOMAdapterBuilder;
21 import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.builder.BindingDOMAdapterBuilder.Factory;
22 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
23 import org.opendaylight.mdsal.binding.javav2.runtime.reflection.BindingReflections;
24 import org.opendaylight.mdsal.binding.javav2.spec.base.Action;
25 import org.opendaylight.mdsal.binding.javav2.spec.base.ListAction;
26 import org.opendaylight.mdsal.binding.javav2.spec.base.Operation;
27 import org.opendaylight.mdsal.binding.javav2.spec.base.Rpc;
28 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
29 import org.opendaylight.mdsal.dom.api.DOMRpcService;
30 import org.opendaylight.mdsal.dom.api.DOMService;
31
32 //FIXME implement after improve DOM part of MD-SAL for support of Yang 1.1
33 /**
34  * Adapter for operation service.
35  */
36 @Beta
37 public class BindingDOMOperationServiceAdapter implements RpcActionConsumerRegistry {
38
39     public static final Factory<RpcActionConsumerRegistry> BUILDER_FACTORY = Builder::new;
40
41     private final DOMRpcService domService;
42     private final BindingToNormalizedNodeCodec codec;
43     private final LoadingCache<Class<? extends Operation>, RpcServiceAdapter> proxies = CacheBuilder.newBuilder()
44             .weakKeys().build(new CacheLoader<Class<? extends Operation>, RpcServiceAdapter>() {
45
46                 @SuppressWarnings("unchecked")
47                 private RpcServiceAdapter createProxy(final Class<? extends Operation> key) {
48                     Preconditions.checkArgument(BindingReflections.isBindingClass(key));
49                     Preconditions.checkArgument(key.isInterface(),
50                             "Supplied Operation service type must be interface.");
51                     if (Rpc.class.isAssignableFrom(key)) {
52                         return new RpcServiceAdapter((Class<? extends Rpc<?, ?>>) key, codec, domService);
53                     }
54                     // TODO implement after improve DOM part of MD-SAL for support of Yang 1.1
55                     throw new UnsupportedOperationException();
56                 }
57
58                 @Nonnull
59                 @Override
60                 public RpcServiceAdapter load(@Nonnull final Class<? extends Operation> key) throws Exception {
61                     return createProxy(key);
62                 }
63
64             });
65
66     public BindingDOMOperationServiceAdapter(final DOMRpcService domService, final BindingToNormalizedNodeCodec codec) {
67         this.domService = Preconditions.checkNotNull(domService);
68         this.codec = Preconditions.checkNotNull(codec);
69     }
70
71     @SuppressWarnings("unchecked")
72     @Override
73     public <T extends Rpc<?, ?>> T getRpcService(final Class<T> rpc) {
74         Preconditions.checkArgument(rpc != null, "Rpc needs to be specified.");
75         return (T) proxies.getUnchecked(rpc).getProxy();
76     }
77
78     private static final class Builder extends BindingDOMAdapterBuilder<RpcActionConsumerRegistry> {
79
80         @Override
81         protected RpcActionConsumerRegistry createInstance(final BindingToNormalizedNodeCodec codec,
82                 final ClassToInstanceMap<DOMService> delegates) {
83             final DOMRpcService domRpc = delegates.getInstance(DOMRpcService.class);
84             return new BindingDOMOperationServiceAdapter(domRpc, codec);
85         }
86
87         @Override
88         public Set<? extends Class<? extends DOMService>> getRequiredDelegates() {
89             return ImmutableSet.of(DOMRpcService.class);
90         }
91     }
92
93     @Override
94     public <T extends Action<? extends TreeNode, ?, ?>> T getActionService(final Class<T> serviceInterface) {
95         // TODO implement after improve DOM part of MD-SAL for support of Yang 1.1
96         throw new UnsupportedOperationException();
97     }
98
99     @Override
100     public <T extends ListAction<? extends TreeNode, ?, ?>> T getListActionService(final Class<T> serviceInterface) {
101         // TODO implement after improve DOM part of MD-SAL for support of Yang 1.1
102         throw new UnsupportedOperationException();
103     }
104 }