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.impl.operation;
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;
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;
32 //FIXME implement after improve DOM part of MD-SAL for support of Yang 1.1
34 * Adapter for operation service.
37 public class BindingDOMOperationServiceAdapter implements RpcActionConsumerRegistry {
39 public static final Factory<RpcActionConsumerRegistry> BUILDER_FACTORY = Builder::new;
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>() {
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);
54 // TODO implement after improve DOM part of MD-SAL for support of Yang 1.1
55 throw new UnsupportedOperationException();
60 public RpcServiceAdapter load(@Nonnull final Class<? extends Operation> key) throws Exception {
61 return createProxy(key);
66 public BindingDOMOperationServiceAdapter(final DOMRpcService domService, final BindingToNormalizedNodeCodec codec) {
67 this.domService = Preconditions.checkNotNull(domService);
68 this.codec = Preconditions.checkNotNull(codec);
71 @SuppressWarnings("unchecked")
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();
78 private static final class Builder extends BindingDOMAdapterBuilder<RpcActionConsumerRegistry> {
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);
88 public Set<? extends Class<? extends DOMService>> getRequiredDelegates() {
89 return ImmutableSet.of(DOMRpcService.class);
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();
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();