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