Merge "Fix race conditions between config-manager and persister."
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / restconf / impl / BrokerFacade.xtend
1 package org.opendaylight.controller.sal.restconf.impl
2
3 import javax.ws.rs.core.Response
4 import org.opendaylight.controller.md.sal.common.api.data.DataReader
5 import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession
6 import org.opendaylight.controller.sal.core.api.data.DataBrokerService
7 import org.opendaylight.controller.sal.rest.impl.RestconfProvider
8 import org.opendaylight.yangtools.yang.common.QName
9 import org.opendaylight.yangtools.yang.common.RpcResult
10 import org.opendaylight.yangtools.yang.data.api.CompositeNode
11 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
12
13 class BrokerFacade implements DataReader<InstanceIdentifier, CompositeNode> {
14
15     val static BrokerFacade INSTANCE = new BrokerFacade
16
17     @Property
18     private ConsumerSession context;
19
20     @Property
21     private DataBrokerService dataService;
22     
23     private new() {
24         if (INSTANCE !== null) {
25             throw new IllegalStateException("Already instantiated");
26         }
27     }
28
29     def static BrokerFacade getInstance() {
30         return INSTANCE
31     }
32
33     private def void checkPreconditions() {
34         if (context === null || dataService === null) {
35             throw new ResponseException(Response.Status.SERVICE_UNAVAILABLE, RestconfProvider::NOT_INITALIZED_MSG)
36         }
37     }
38
39     override readConfigurationData(InstanceIdentifier path) {
40         checkPreconditions
41         return dataService.readConfigurationData(path);
42     }
43
44     override readOperationalData(InstanceIdentifier path) {
45         checkPreconditions
46         return dataService.readOperationalData(path);
47     }
48
49     def RpcResult<CompositeNode> invokeRpc(QName type, CompositeNode payload) {
50         checkPreconditions
51         val future = context.rpc(type, payload);
52         return future.get;
53     }
54
55     def commitConfigurationDataPut(InstanceIdentifier path, CompositeNode payload) {
56         checkPreconditions
57         val transaction = dataService.beginTransaction;
58         transaction.putConfigurationData(path, payload);
59         return transaction.commit()
60     }
61
62     def commitOperationalDataPut(InstanceIdentifier path, CompositeNode payload) {
63         checkPreconditions
64         val transaction = dataService.beginTransaction;
65         transaction.putOperationalData(path, payload);
66         return transaction.commit()
67     }
68     
69 }