1 package org.opendaylight.controller.sample.zeromq.provider;
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;
25 public class ExampleProvider extends AbstractProvider implements RpcImplementation {
27 private final URI namespace = URI.create("http://cisco.com/example");
28 private final QName QNAME = new QName(namespace, "heartbeat");
29 private RpcRegistration reg;
31 private ServiceRegistration thisReg;
33 private ProviderSession session;
34 private Logger _logger = LoggerFactory.getLogger(ExampleProvider.class);
37 public void onSessionInitiated(ProviderSession session) {
38 this.session = session;
42 public Set<QName> getSupportedRpcs() {
43 Set<QName> supportedRpcs = new HashSet<QName>();
44 supportedRpcs.add(QNAME);
49 public RpcResult<CompositeNode> invokeRpc(final QName rpc, CompositeNode input) {
50 boolean success = false;
51 CompositeNode output = null;
52 Collection<RpcError> errors = new ArrayList<>();
54 // Only handle supported RPC calls
55 if (getSupportedRpcs().contains(rpc)) {
57 errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.WARNING, "message:null input", RpcError.ErrorType.RPC, null));
60 if (isErroneousInput(input)) {
61 errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.ERROR, "message:error", RpcError.ErrorType.RPC, null));
65 output = addSuccessNode(input);
69 return Rpcs.getRpcResult(success, output, errors);
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)) {
81 if ((input.getChildren().get(0).getValue()).equals("error")) {
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");
94 return new CompositeNodeTOImpl(QNAME, null, list);
98 protected void startImpl(BundleContext context) {
99 thisReg = context.registerService(ExampleProvider.class, this, new Hashtable<String, String>());
103 protected void stopImpl(BundleContext context) {
107 thisReg.unregister();
108 } catch (Exception e) {
109 // TODO Auto-generated catch block
115 public void announce(QName name) {
116 _logger.debug("Announcing [{}]\n\n\n", name);
117 reg = this.session.addRpcImplementation(name, this);