Enhancements to remote rpc server. Using zmq router-dealer bridge to make the server...
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / integrationtest / provider-service / src / main / java / org / opendaylight / controller / sample / zeromq / provider / ExampleProvider.java
1 package org.opendaylight.controller.sample.zeromq.provider;
2
3 import org.opendaylight.controller.sal.common.util.RpcErrors;
4 import org.opendaylight.controller.sal.common.util.Rpcs;
5 import org.opendaylight.controller.sal.core.api.AbstractProvider;
6 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
7 import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration;
8 import org.opendaylight.controller.sal.core.api.RpcImplementation;
9 import org.opendaylight.yangtools.yang.common.QName;
10 import org.opendaylight.yangtools.yang.common.RpcError;
11 import org.opendaylight.yangtools.yang.common.RpcResult;
12 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
13 import org.opendaylight.yangtools.yang.data.api.Node;
14 import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl;
15 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
16 import org.osgi.framework.BundleContext;
17 import org.osgi.framework.ServiceRegistration;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 import java.net.URI;
22 import java.util.*;
23
24 public class ExampleProvider extends AbstractProvider implements RpcImplementation {
25
26   private final URI namespace = URI.create("http://cisco.com/example");
27   private final QName QNAME = new QName(namespace, "heartbeat");
28   private RpcRegistration reg;
29
30   private ServiceRegistration thisReg;
31
32   private ProviderSession session;
33   private Logger _logger = LoggerFactory.getLogger(ExampleProvider.class);
34
35   @Override
36   public void onSessionInitiated(ProviderSession session) {
37     this.session = session;
38   }
39
40   @Override
41   public Set<QName> getSupportedRpcs() {
42     Set<QName> supportedRpcs = new HashSet<QName>();
43     supportedRpcs.add(QNAME);
44     return supportedRpcs;
45   }
46
47   @Override
48   public RpcResult<CompositeNode> invokeRpc(final QName rpc, CompositeNode input) {
49     boolean success = false;
50     CompositeNode output = null;
51     Collection<RpcError> errors = new ArrayList<>();
52
53     // Only handle supported RPC calls
54     if (getSupportedRpcs().contains(rpc))  {
55       if (input == null) {
56         errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.WARNING, "message:null input", RpcError.ErrorType.RPC, null));
57       }
58       else {
59         if (isErroneousInput(input)) {
60           errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.ERROR, "message:error", RpcError.ErrorType.RPC, null));
61         }
62         else {
63           success = true;
64           output = addSuccessNode(input);
65         }
66       }
67     }
68     return Rpcs.getRpcResult(success, output, errors);
69   }
70
71   // Examines input -- dives into CompositeNodes and finds any value equal to "error"
72   private boolean isErroneousInput(CompositeNode input) {
73     for (Node<?> n : input.getChildren()) {
74       if (n instanceof CompositeNode) {
75         if (isErroneousInput((CompositeNode)n)) {
76           return true;
77         }
78       }
79       else {  //SimpleNode
80         if ((input.getChildren().get(0).getValue()).equals("error")) {
81           return true;
82         }
83       }
84     }
85     return false;
86   }
87   
88   // Adds a child SimpleNode containing the value "success" to the input CompositeNode
89   private CompositeNode addSuccessNode(CompositeNode input) {
90     List<Node<?>> list = new ArrayList<Node<?>>(input.getChildren());
91     SimpleNodeTOImpl<String> simpleNode = new SimpleNodeTOImpl<String>(QNAME, input, "success");
92     list.add(simpleNode);
93     return new CompositeNodeTOImpl(QNAME, null, list);
94   }
95
96   @Override
97   protected void startImpl(BundleContext context) {
98     thisReg = context.registerService(ExampleProvider.class, this, new Hashtable<String, String>());
99   }
100
101   @Override
102   protected void stopImpl(BundleContext context) {
103     if (reg != null) {
104       try {
105         reg.close();
106         thisReg.unregister();
107       } catch (Exception e) {
108         // TODO Auto-generated catch block
109         e.printStackTrace();
110       }
111     }
112   }
113
114   public void announce(QName name) {
115     _logger.debug("Announcing [{}]\n\n\n", name);
116     reg = this.session.addRpcImplementation(name, this);
117   }
118
119 }