Re-added config.version to config-module-archetype.
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / integrationtest / provider-service / src / main / java / org / opendaylight / controller / sample / zeromq / provider / ExampleProvider.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.controller.sample.zeromq.provider;
9
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;
27
28 import java.net.URI;
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.HashSet;
32 import java.util.List;
33 import java.util.Set;
34
35 public class ExampleProvider extends AbstractProvider implements RpcImplementation {
36
37   private final URI namespace = URI.create("http://cisco.com/example");
38   private final QName QNAME = new QName(namespace, "heartbeat");
39   private RpcRegistration reg;
40
41   private ServiceRegistration thisReg;
42
43   private ProviderSession session;
44   private Logger _logger = LoggerFactory.getLogger(ExampleProvider.class);
45
46   @Override
47   public void onSessionInitiated(ProviderSession session) {
48     this.session = session;
49   }
50
51   @Override
52   public Set<QName> getSupportedRpcs() {
53     Set<QName> supportedRpcs = new HashSet<QName>();
54     supportedRpcs.add(QNAME);
55     return supportedRpcs;
56   }
57
58   @Override
59   public RpcResult<CompositeNode> invokeRpc(final QName rpc, CompositeNode input) {
60     boolean success = false;
61     CompositeNode output = null;
62     Collection<RpcError> errors = new ArrayList<>();
63
64     // Only handle supported RPC calls
65     if (getSupportedRpcs().contains(rpc))  {
66       if (input == null) {
67         errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.WARNING, "message:null input", RpcError.ErrorType.RPC, null));
68       }
69       else {
70         if (isErroneousInput(input)) {
71           errors.add(RpcErrors.getRpcError("app", "tag", "info", RpcError.ErrorSeverity.ERROR, "message:error", RpcError.ErrorType.RPC, null));
72         }
73         else {
74           success = true;
75           output = addSuccessNode(input);
76         }
77       }
78     }
79     return Rpcs.getRpcResult(success, output, errors);
80   }
81
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)) {
87           return true;
88         }
89       }
90       else {  //SimpleNode
91         if ((input.getChildren().get(0).getValue()).equals("error")) {
92           return true;
93         }
94       }
95     }
96     return false;
97   }
98
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);
105   }
106
107   @Override
108   protected void startImpl(BundleContext context) {
109     thisReg = context.registerService(ExampleProvider.class, this, new Hashtable<String, String>());
110   }
111
112   @Override
113   protected void stopImpl(BundleContext context) {
114     if (reg != null) {
115       try {
116         reg.close();
117         thisReg.unregister();
118       } catch (Exception e) {
119         // TODO Auto-generated catch block
120         e.printStackTrace();
121       }
122     }
123   }
124
125   public void announce(QName name) {
126     _logger.debug("Announcing [{}]\n\n\n", name);
127     reg = this.session.addRpcImplementation(name, this);
128   }
129
130 }