import org.opendaylight.yangtools.yang.model.api.SchemaContext
import static com.google.common.base.Preconditions.*
+import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition
+import java.util.concurrent.ConcurrentHashMap
+
+class ControllerContext implements SchemaServiceListener {
-class ControllerContext {
-
val static ControllerContext INSTANCE = new ControllerContext
-
+
val static NULL_VALUE = "null"
-
+
@Property
SchemaContext schemas;
private val BiMap<URI, String> uriToModuleName = HashBiMap.create();
private val Map<String, URI> moduleNameToUri = uriToModuleName.inverse();
+ private val Map<QName,RpcDefinition> qnameToRpc = new ConcurrentHashMap();
+
private new() {
if (INSTANCE != null) {
if (targetNode instanceof ListSchemaNode) {
val listNode = targetNode as ListSchemaNode;
val keysSize = listNode.keyDefinition.size
+
// every key has to be filled
if ((strings.length - consumed) < keysSize) {
return null;
var i = 0;
for (key : listNode.keyDefinition) {
val uriKeyValue = uriKeyValues.get(i);
+
// key value cannot be NULL
if (uriKeyValue.equals(NULL_VALUE)) {
return null
consumed = consumed + i;
builder.nodeWithKey(targetNode.QName, keyValues);
} else {
+
// Only one instance of node is allowed
builder.node(targetNode.QName);
}
}
}
- public def QName toRpcQName(String name) {
+ public def QName toQName(String name) {
+ val module = name.toModuleName;
+ val node = name.toNodeName;
+ val namespace = moduleNameToUri.get(module);
+ return new QName(namespace,null,node);
}
+
+ override onGlobalContextUpdated(SchemaContext context) {
+ this.schemas = context;
+ for(operation : context.operations) {
+ val qname = new QName(operation.QName.namespace,null,operation.QName.localName);
+ qnameToRpc.put(qname,operation);
+ }
+ }
+
+ def ContainerSchemaNode getRpcOutputSchema(QName name) {
+ qnameToRpc.get(name)?.output;
+ }
+
+ def ContainerSchemaNode getRpcInputSchema(QName name) {
+ qnameToRpc.get(name)?.input;
+ }
+
}