2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.sample.zeromq.provider;
10 import org.opendaylight.controller.sal.common.util.RpcErrors;
11 import org.opendaylight.controller.sal.common.util.Rpcs;
12 import org.opendaylight.controller.sal.core.api.AbstractProvider;
13 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
14 import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration;
15 import org.opendaylight.controller.sal.core.api.RpcImplementation;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.common.RpcError;
18 import org.opendaylight.yangtools.yang.common.RpcResult;
19 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
20 import org.opendaylight.yangtools.yang.data.api.Node;
21 import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl;
22 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl;
23 import org.osgi.framework.BundleContext;
24 import org.osgi.framework.ServiceRegistration;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.HashSet;
32 import java.util.List;
35 public class ExampleProvider extends AbstractProvider implements RpcImplementation {
37 private final URI namespace = URI.create("http://cisco.com/example");
38 private final QName QNAME = new QName(namespace, "heartbeat");
39 private RpcRegistration reg;
41 private ServiceRegistration thisReg;
43 private ProviderSession session;
44 private Logger _logger = LoggerFactory.getLogger(ExampleProvider.class);
47 public void onSessionInitiated(ProviderSession session) {
48 this.session = session;
52 public Set<QName> getSupportedRpcs() {
53 Set<QName> supportedRpcs = new HashSet<QName>();
54 supportedRpcs.add(QNAME);
59 public RpcResult<CompositeNode> invokeRpc(final QName rpc, CompositeNode input) {
60 boolean success = false;
61 CompositeNode output = null;
62 Collection<RpcError> errors = new ArrayList<>();
64 // Only handle supported RPC calls
65 if (getSupportedRpcs().contains(rpc)) {
67 errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.WARNING, "message:null input", RpcError.ErrorType.RPC, null));
70 if (isErroneousInput(input)) {
71 errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.ERROR, "message:error", RpcError.ErrorType.RPC, null));
75 output = addSuccessNode(input);
79 return Rpcs.getRpcResult(success, output, errors);
82 // Examines input -- dives into CompositeNodes and finds any value equal to "error"
83 private boolean isErroneousInput(CompositeNode input) {
84 for (Node<?> n : input.getChildren()) {
85 if (n instanceof CompositeNode) {
86 if (isErroneousInput((CompositeNode)n)) {
91 if ((input.getChildren().get(0).getValue()).equals("error")) {
99 // Adds a child SimpleNode containing the value "success" to the input CompositeNode
100 private CompositeNode addSuccessNode(CompositeNode input) {
101 List<Node<?>> list = new ArrayList<Node<?>>(input.getChildren());
102 SimpleNodeTOImpl<String> simpleNode = new SimpleNodeTOImpl<String>(QNAME, input, "success");
103 list.add(simpleNode);
104 return new CompositeNodeTOImpl(QNAME, null, list);
108 protected void startImpl(BundleContext context) {
109 thisReg = context.registerService(ExampleProvider.class, this, new Hashtable<String, String>());
113 protected void stopImpl(BundleContext context) {
117 thisReg.unregister();
118 } catch (Exception e) {
119 // TODO Auto-generated catch block
125 public void announce(QName name) {
126 _logger.debug("Announcing [{}]\n\n\n", name);
127 reg = this.session.addRpcImplementation(name, this);