Implementing VPP Renderer registration
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / util / VppNodeWriter.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.util;
10
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodes;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodesBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
21 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import com.google.common.util.concurrent.CheckedFuture;
26
27 public class VppNodeWriter {
28
29     private static final Logger LOG = LoggerFactory.getLogger(VppNodeWriter.class);
30     private List<RendererNode> rendererNodesCache;
31
32     public VppNodeWriter() {
33         rendererNodesCache = new ArrayList<>();
34     }
35
36     public void cache(RendererNode node) {
37         rendererNodesCache.add(node);
38     }
39
40     /**
41      * Put all cached items to data store.
42      *
43      * @param dataBroker appropriate data provider
44      */
45     public void commitToDatastore(DataBroker dataBroker) {
46         RendererNodes rendererNodes = buildRendererNodes();
47         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
48         InstanceIdentifier<RendererNodes> iid = VppIidFactory.getRendererNodesIid();
49         try {
50             wtx.merge(LogicalDatastoreType.OPERATIONAL, iid, rendererNodes, true);
51             CheckedFuture<Void, TransactionCommitFailedException> submitFuture = wtx.submit();
52             submitFuture.checkedGet();
53             // Clear cache
54             rendererNodesCache.clear();
55         } catch (TransactionCommitFailedException e) {
56             LOG.error("Write transaction failed to {}", e.getMessage());
57         } catch (Exception e) {
58             LOG.error("Failed to .. {}", e.getMessage());
59         }
60     }
61
62     /**
63      * Removes all cached items from data store.
64      *
65      * @param dataBroker appropriate data provider
66      */
67     public void removeFromDatastore(DataBroker dataBroker) {
68         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
69         for (RendererNode nodeToRemove : rendererNodesCache) {
70             InstanceIdentifier<RendererNode> iid = VppIidFactory.getRendererNodeIid(nodeToRemove);
71             try {
72                 wtx.delete(LogicalDatastoreType.OPERATIONAL, iid);
73                 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = wtx.submit();
74                 submitFuture.checkedGet();
75                 // Clear cache
76             } catch (TransactionCommitFailedException e) {
77                 LOG.error("Write transaction failed to {}", e.getMessage());
78             } catch (Exception e) {
79                 LOG.error("Failed to .. {}", e.getMessage());
80             }
81         }
82         rendererNodesCache.clear();
83     }
84
85     private RendererNodes buildRendererNodes() {
86         RendererNodesBuilder rendererNodesBuilder = new RendererNodesBuilder();
87         rendererNodesBuilder.setRendererNode(new ArrayList<>(rendererNodesCache));
88         return rendererNodesBuilder.build();
89     }
90 }