Merge "Exception for URI /restconf/operations/module_name:rpc ended with slash"
[controller.git] / opendaylight / md-sal / sal-restconf-broker / src / main / java / org / opendaylight / controller / sal / restconf / broker / impl / DataBrokerServiceImpl.java
1 /*
2  * Copyright (c) 2013 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.controller.sal.restconf.broker.impl;
9
10 import java.util.Map;
11 import java.util.concurrent.ExecutionException;
12 import java.util.concurrent.Future;
13
14 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
15 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
16 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
17 import org.opendaylight.controller.sal.restconf.broker.listeners.RemoteDataChangeNotificationListener;
18 import org.opendaylight.controller.sal.restconf.broker.tools.RemoteStreamTools;
19 import org.opendaylight.controller.sal.restconf.broker.transactions.RemoteDataModificationTransaction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.BeginTransactionOutput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateDataChangeEventSubscriptionInputBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateDataChangeEventSubscriptionOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.SalRemoteService;
24 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
25 import org.opendaylight.yangtools.concepts.ListenerRegistration;
26 import org.opendaylight.yangtools.restconf.client.api.RestconfClientContext;
27 import org.opendaylight.yangtools.restconf.client.api.event.EventStreamInfo;
28 import org.opendaylight.yangtools.restconf.client.api.event.ListenableEventStreamContext;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.opendaylight.yangtools.yang.common.RpcResult;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import com.google.common.base.Optional;
36
37 public class DataBrokerServiceImpl implements DataBrokerService  {
38
39     private static final Logger logger = LoggerFactory.getLogger(DataBrokerServiceImpl.class.toString());
40     private final RestconfClientContext restconfClientContext;
41     private final SalRemoteService salRemoteService;
42
43     public DataBrokerServiceImpl(RestconfClientContext restconfClientContext) {
44         this.restconfClientContext = restconfClientContext;
45         this.salRemoteService =  this.restconfClientContext.getRpcServiceContext(SalRemoteService.class).getRpcService();
46     }
47
48     @Override
49     public DataModificationTransaction beginTransaction() {
50         Future<RpcResult<BeginTransactionOutput>> rpcResultFuture = this.salRemoteService.beginTransaction();
51         //TODO finish yang model for proper remoteDataModificationTransaction setup
52         RemoteDataModificationTransaction remoteDataModificationTransaction = new RemoteDataModificationTransaction();
53         return remoteDataModificationTransaction;
54     }
55
56     @Override
57     public DataObject readConfigurationData(InstanceIdentifier<? extends DataObject> path) {
58         try {
59             Optional<DataObject> optDataObject = (Optional<DataObject>) this.restconfClientContext.getConfigurationDatastore().readData(path).get();
60             if (optDataObject.isPresent()){
61                 return optDataObject.get();
62             }
63         } catch (InterruptedException e) {
64             logger.trace("Reading configuration data interrupted {}",e);
65         } catch (ExecutionException e) {
66             logger.trace("Reading configuration execution exception {}",e);
67         }
68         throw new IllegalStateException("No data to return.");
69     }
70
71     @Override
72     public DataObject readOperationalData(InstanceIdentifier<? extends DataObject> path) {
73         try {
74             Optional<DataObject> optDataObject = (Optional<DataObject>) this.restconfClientContext.getOperationalDatastore().readData(path).get();
75             if (optDataObject.isPresent()){
76                 return optDataObject.get();
77             }
78         } catch (InterruptedException e) {
79             logger.trace("Reading configuration data interrupted {}",e);
80         } catch (ExecutionException e) {
81             logger.trace("Reading configuration execution exception {}",e);
82         }
83         throw new IllegalStateException("No data to return.");
84     }
85     @Override
86     public ListenerRegistration<DataChangeListener> registerDataChangeListener(InstanceIdentifier<? extends DataObject> path, DataChangeListener listener) {
87         CreateDataChangeEventSubscriptionInputBuilder inputBuilder = new CreateDataChangeEventSubscriptionInputBuilder();
88         Future<RpcResult<CreateDataChangeEventSubscriptionOutput>> rpcResultFuture =  salRemoteService.createDataChangeEventSubscription(inputBuilder.setPath(path).build());
89         String streamName = "";
90         try {
91             if (rpcResultFuture.get().isSuccessful()){
92                 streamName = rpcResultFuture.get().getResult().getStreamName();
93             }
94         } catch (InterruptedException e) {
95             logger.trace("Interupted while getting rpc result due to {}",e);
96         } catch (ExecutionException e) {
97             logger.trace("Execution exception while getting rpc result due to {}",e);
98         }
99         final Map<String,EventStreamInfo> desiredEventStream = RemoteStreamTools.createEventStream(restconfClientContext,streamName);
100         ListenableEventStreamContext restConfListenableEventStreamContext = restconfClientContext.getEventStreamContext(desiredEventStream.get(streamName));
101         RemoteDataChangeNotificationListener remoteDataChangeNotificationListener = new RemoteDataChangeNotificationListener(listener);
102         final ListenerRegistration<?> reg = restConfListenableEventStreamContext.registerNotificationListener(remoteDataChangeNotificationListener);
103         return new AbstractListenerRegistration<DataChangeListener>(listener) {
104             @Override
105             protected void removeRegistration() {
106                 reg.close();
107             }
108         };
109     }
110 }